From: ivan Date: Thu, 11 Mar 2004 02:05:38 +0000 (+0000) Subject: import of rt 3.0.9 X-Git-Tag: RT_3_0_9 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=289340780927b5bac2c7604d7317c3063c6dd8cc;hp=945721f48f74d5cfffef7c7cf3a3d6bc2521f5dd import of rt 3.0.9 --- diff --git a/rt/Changelog b/rt/Changelog index d8d73fd6d..0f6bd10c3 100644 --- a/rt/Changelog +++ b/rt/Changelog @@ -2,7 +2,7 @@ Project "rt.3", Branch 0 Page 1 -Change Log Sat Jul 12 04:24:41 2003 +Change Log Fri Feb 13 12:31:27 2004 rt.3.D000, C0, jesse, Thu Mar 13 20:43:23 2003, RT: Request Tracker, branch 3.0. RT: Request Tracker, branch 3.0. @@ -207,6 +207,1633 @@ rt.3.D000, C0, jesse, Thu Mar 13 20:43:23 2003, RT: Request Tracker, branch 3.0. 199 150 README updates to indicate deprecated dependencies 200 151 Debugging framework cleanup 201 152 Bumping version to 3.0.4 + 195 153 #3042: Make max inline body size configurable + 196 154 #3029 - better warning message on improper perms on mail in + 202 155 Initial commit of new commandline client support code + 203 156 More updates to the commandline client + 205 157 Removing ancient cli code that was accidentally added to the + repository + 206 158 Extended ACL edit routines to make it easier to use generic + routines in 3rd party apps + 24 159 Certain ACL checks could fail on postgres due to a marshalling + bug + 209 160 #1751: update second page in Bulk update + 208 161 #1651: URIs not escaped in ticket display + 210 162 A couple of fixes to better deal with creation of 'blank' + ticket requestors + 207 163 regression tests: use $RT::WebPath and RT_LIB_PATH + 211 164 Requestor searches had an extra join that they didn't need + 212 165 License tagger was tagging Makefile, not Makefile.in. + Reconfigured. + 213 166 Bumping to 3.0.5pre1 + 215 167 Merging internationalization fixes from ourinternet + 216 168 #2692: make $Domain an argument for SelectGroups + 219 169 #2855: User_Overlay and Template_Overlay fixes + 220 170 #2989: regexp changes for Subject and loop-detection + 221 171 3158: user can delete only with DeleteTicket right + 222 172 fixes for the importer + 223 173 Adding the RT coding style guide to the distribution + 225 174 One I18N 'fix' from ourinternet tainted attachment data, + breaking tests + 226 175 Code to catch execution problems within RT's web app server + was made more robust + 34 176 Failed user creation didn't always properly roll-back the + database + 227 177 [fsck.com #2378] personal permissions for installation + 228 178 #3199: normalize custom fields searching syntax - Global CF's + previously didn't allow the { } + 229 179 #3201: Perform more clever joining to enhance custom field + search results + 40 180 #3200 - AND MultipleSelect CFs together - OR all other CFs + together. + 42 181 Bumping version to 3.0.5-pre2 + 41 182 #3022: Update to German translation + 43 183 #3068: Better setting of Due dates via the web ui + 44 184 #3131: Preliminary support for Oracle from Brook Schonfield + 45 185 #3152: Updated russian .po file + 46 186 #2792: When finding out if someone is a queue watcher, check + groups recursively + 47 187 Bumping to 3.0.5pre3 + 49 188 Dependencies updated; performance and memory usage fixes for + ticket creation memory usage + 231 189 #3237: Queue-specific templates with the same name as global + templates will now override the globals for queue-related + scrips + 54 190 #3279: Make fsck.com-rt: URIs case insensitive + 230 191 #3230: Parser patch to make watchers searches more efficient + 218 192 #2955: wrapping in messagebox + 232 193 Old relationship update transactions weren't properly + displayed + 237 194 #2672: custom field values ordering + 235 195 #2653: Email.pm patch + 238 196 #3114: allow longer subject lines for postgres + 233 197 #3242: cannonicalize addresses in comments + 236 198 #3278: occasional internal server error in RT.pm + 239 199 #3309: switch lines in User/Prefs.html + 250 200 #3329: Email.pm patch + 252 201 #2687: add ticket subject to resolved template + 255 202 #2268: align fields in User/Prefs.html + 256 203 #2160: clarify that box deletes scrips + 259 204 #2773: don't allow searching for deleted tickets + 257 205 #2700: configurable home page ticket list length + 258 206 #2409: colons after labels in Create.html + 261 207 #3240: DeleteWatcher, not DelWatcher + 262 208 #3143: Italian translation + 251 209 #2617: custom field ordering + 260 210 #2558: allow access to CFs with no name + 263 211 #3281: form actions must not be paths + 266 212 #2693: show proper id in menu after creation + 265 213 #3118: change default unset mail address + 267 214 #3324: Apache::DBI must be 0.92 or newer + 253 215 Fixing improperly applied custom field editing patches + 268 216 Bumping version to 3.0.5pre4 + 269 217 #3341: edit comments in SiteConfig + 271 218 #3012: vertical alignment in Ticket/Elements/ShowPeople + 270 219 #3349: umlauts aren't correct in subject + 272 220 #3236: allow attachments without other txn contents + 273 221 #3105: CreateTickets doesn't set ticket type + 275 222 #3384: recursive merge patches + 276 223 #3354: an additional fix for avoiding the morning bug + 277 224 #3114: increase subject length in non-Postgres dbs + 278 225 Fixes to attempt to stop mysql 'morning bugs' with mysql + 280 226 Post 3.0.5pre3 - sometimes silently losing mail. fixed a + possible bug, improved testing + 281 227 More explicit warning about a lack of perl 5.8 + 282 228 fixing the new testdeps thing + 279 229 #2651: localize die/warn handlers + 64 230 Bumping to 3.0.5pre5 + 283 231 #3399: Message parsing fails for some types of report + 285 232 Better handling of apparently bogus email; rationalize mail + gateway error codes + 286 233 Bumping to 3.0.5pre6 + 287 234 Bumping to 3.0.5RC1 + 288 235 Patches to the cli from ams + 289 236 Custom field values couldn't be set to '0'; README updated for + apache2 + 290 237 RT 3.0.5 + 291 238 Fixing a couple bugs related to display of links + 292 239 fixing a multiple-signature-inclusion bug + 293 240 Bumping to 3.0.6RC1 + 295 241 Updated documentation for RT CLI tool + 296 242 Bumping to RT 3.0.6 + 297 243 Conditionalizing Text::Quoted display, so as to avoid utf8 + crashes + 299 244 Merging bugfixes from ourinternet + 300 245 A bunch of postgres correctness fixes + 301 246 #2346: Resolving a deprecation warning + 84 247 #3981: Ticket creation syntax fix + 298 248 bps #1032: SelfService fixes + 302 249 #3889: add/del fixes + 303 250 #3822: Fix for cli bug (Inapropriate use of arrayref) + 305 251 #3807: CLI example updates + 306 252 #3907: New default templates for user, ticket and queue + 308 253 More reference weakening + 307 254 User objects weren't always destroyed, due to a circular + reference + 310 255 Slightly better debugging on failure to send mail + 94 256 Deep recursion issue on localization handle; missing language + selector + 313 257 Adding back missing SelectLang + 311 258 #3566: EditCustomField supports Default for FreeformSingle + 312 259 Initial Informix port from akso.de + 316 260 #3765: TicketsSQL is case-sensitive + 317 261 #3613: searching on NOT LIKE + 318 262 #3877: don't strip multi-line headers + 319 263 #3551: Create values corrupted when adding new files + 321 264 #3993: warn when installing with mod_perl2 + 320 265 #4087: allow non-ISO dates in transaction searches + 322 266 #3439: custom fields patch + 323 267 #3855: require Locale::Maketext::Lexicon 0.31 + 325 268 #3856: /REST/1.0/search/tickets should work in UTC + 326 269 #3827: regression shouldn't drop db + 327 270 #3801: note when transaction content is ellided + 328 271 #3751: ParseNewMessageForTicketCcs + 332 272 #3776: new indices + 329 273 #3674: autohandler patch + 336 274 New schema relationships diagram in .dot format + 337 275 more work on the schema diagram + 330 276 #3601: SelectRights patch + 331 277 #3583: set Last Contacted date + 333 278 #4088: Postgres performance improvements + 335 279 fix attachment links in base RT + 338 280 Updating storable dependency, to keep redhat 9 users from + hurting themselves + 339 281 Small fix to ticket searching to cut down on # of joins needed + 104 282 Merging ourinternet's changes relative to 3.0.7pre2; UPGRADING + update; postgres installation fixes + 350 283 Bumping version to 3.0.7pre3 + 351 284 CLI changes + 352 285 CLI usage updates + 353 286 Bumping to 3.0.7rc1 + 361 287 Bumping to 3.0.7; Updated DBIx::SearchBuilder dependency + 362 288 Fixes to RT 3.0.7 upgrade instructions; Bumping to 3.0.7_01 + 355 289 Minor cleanups to RT cli tool + 356 290 Fixup to rt-setup-database tool for local schema + 357 291 Display.html takes TicketObj; Update.html uses it + 358 292 localization for link text, not whole link + 359 293 ProcessTicketCustomFieldUpdates takes TicketObj + 360 294 Transaction batching + 363 295 protect against reentrancy in Ticket::DESTROY + 365 296 FastCGI fix to make the CLI work + 366 297 #4415: Fix for imporeting merged tickets + 368 298 Regression and upgrade cleanups + 367 299 Ticket creation and updates via the Web UI were sometimes + encoded wrong + 369 300 CLI tool should pass through orderby arg + 370 301 Bumping to 3.0.8pre1 + 371 302 none + 372 303 Decode uuencoded attachments + 373 304 Fixing next/prev ticket navigation (#4461) it sometimes + disappeared. + 375 305 Ticket counts became inaccurate after repeated web searches + 376 306 Certain non-western From: headers were being mangled + 377 307 Numerous CLI improvements + 378 308 Bumping to 3.0.8pre2 + 379 309 Switching to new I18NSafe lowercasing behaviour for Pg + 380 310 Adding a new index doubles my performance on /index.html + 381 311 Importing fixes from ourinternet + 382 312 Researching email corruption + 197 313 Fixing CreaetTickets documentation + 383 314 #4572: Fix searching on links + 385 315 #4554: callbacks should be ordered + 386 316 #4552 arguments for AddCustomFieldValues + 387 317 #4455: Better handling of bad link URIs + 388 318 #3725: Making CLI display newly created tickets ids + 389 319 #3736: Backport RT 3.1 'inplace' layout + 390 320 #3813: the CreateTickets scripaction couldn't handle + customfields + 391 321 #3608: search by ccs and adminccs in addition to requestors + 114 322 #3066: crontool docs + 393 323 #4711: search ON Dates + 392 324 order SelfService tickets by numeric id + 395 325 Bumping to 3.0.8RC1 + 396 326 AutoOpen should set correct type for Status transaction + 397 327 Fixing apparent SQL error on logout. Actually bug in + localization + 21 328 #2587: turn off autocomplete in RT's search box + 309 329 #3660: add a 'timeout' flag to the rt-mailgate + 315 330 #3608: fixing quicksearch to work with new watcher search + 398 331 Allow RT::CurrentUser to load objects based on RT::User + objects passed in; Backported a fix to the Language Selector + for non-traditional languages; bumped to 3.0.8 + 399 332 Searching for role groups generated queries that were way too + complex + 48 333 First cut at new oracle code from Netzah + 501 334 Adding UTF8 support for oracle; Oracle install instructions; + searchbuilder dep bumped; bumping to 3.0.9pre2 + 502 335 Deleted tickets should never be found in searches + 503 336 #5212 Unicode issues with incoming mail with a charset or + encoding of UTF-8 (caps) + 500 337 Reversing our no-cache pragmas, since IE can't cope with them + over SSL + 506 338 A couple of perf fixes from autrijus which _require_ + SearchBuilder 0.97. Reduces long ticket display by 30% + 508 339 Bumping to 3.0.9pre3 + 509 340 RT now uses progressive rendering by default AND no longer + blocks the load of the CSS sheet; 3.0.9pre4 + 511 341 Optimizing column loads from autrijus' new column load patches + 512 342 Bumping to 3.0.9pre5 + 513 343 More performance work listing ticket Attachments + 515 344 Turning off autoflush for ticket attachments so we can a + content type + 516 345 #5178: Use less verbose html for ticket history + 517 346 Bumping to 3.0.9pre6 + 518 347 Improved next/prev handling for merged tickets + 519 348 Bumping to 3.0.9 - Noting preference for perl 5.8.3 + + rt.3.0.D348, C519, jesse, Fri Feb 13 12:30:42 2004, Bumping to 3.0.9 - Noting + preference for perl 5.8.3 + none + + rt.3.0.D347, C518, jesse, Thu Feb 12 00:21:35 2004, Improved next/prev + handling for merged tickets + From: Jesse + Date: Thu Feb 12 00:20:40 2004 + + none + + rt.3.0.D346, C517, jesse, Tue Feb 10 00:22:11 2004, Bumping to 3.0.9pre6 + From: Jesse + Date: Tue Feb 10 00:21:24 2004 + Warning: the original change was in the 'being_integrated' state + + none + + rt.3.0.D345, C516, jesse, Tue Feb 10 00:19:50 2004, #5178: Use less verbose + html for ticket history + From: Jesse + Date: Tue Feb 10 00:18:57 2004 + + none + + rt.3.0.D344, C515, jesse, Tue Feb 10 00:07:41 2004, Turning off autoflush for + ticket attachments so we can a content type + From: Jesse + Date: Tue Feb 10 00:02:40 2004 + + none + + rt.3.0.D343, C513, jesse, Mon Feb 9 23:48:40 2004, More performance work + listing ticket Attachments + From: Jesse + Date: Mon Feb 9 23:48:07 2004 + + none + + rt.3.0.D342, C512, jesse, Fri Feb 6 02:05:13 2004, Bumping to 3.0.9pre5 + none + + rt.3.0.D341, C511, jesse, Thu Feb 5 23:11:20 2004, Optimizing column loads + from autrijus' new column load patches + none + + rt.3.0.D340, C509, jesse, Wed Feb 4 17:56:57 2004, RT now uses progressive + rendering by default AND no longer blocks the load of the CSS sheet; 3.0.9pre4 + none + + rt.3.0.D339, C508, jesse, Wed Feb 4 16:42:08 2004, Bumping to 3.0.9pre3 + none + + rt.3.0.D338, C506, jesse, Wed Feb 4 15:06:36 2004, A couple of perf fixes + from autrijus which _require_ SearchBuilder 0.97. Reduces long ticket display + by 30% + none + + rt.3.0.D337, C500, jesse, Sun Feb 1 15:01:39 2004, Reversing our no-cache + pragmas, since IE can't cope with them over SSL + none + + rt.3.0.D336, C503, jesse, Wed Jan 28 19:56:55 2004, #5212 Unicode issues with + incoming mail with a charset or encoding of UTF-8 (caps) + none + + rt.3.0.D335, C502, jesse, Wed Jan 28 19:24:48 2004, Deleted tickets should + never be found in searches + none + + rt.3.0.D334, C501, jesse, Thu Jan 8 15:21:02 2004, Adding UTF8 support for + oracle; Oracle install instructions; searchbuilder dep bumped; bumping to + 3.0.9pre2 + none + + rt.3.0.D333, C48, jesse, Sun Jan 4 23:18:16 2004, First cut at new oracle + code from Netzah + From: Jesse + Date: Sun Jan 4 23:17:21 2004 + + none + + rt.3.0.D332, C399, jesse, Sat Jan 3 15:57:44 2004, Searching for role groups + generated queries that were way too complex + From: Jesse + Date: Sat Jan 3 15:57:50 2004 + + none + + rt.3.0.D331, C398, jesse, Fri Jan 2 16:22:47 2004, Allow RT::CurrentUser to + load objects based on RT::User objects passed in; Backported a fix to the + Language Selector for non-traditional languages; bumped to 3.0.8 + From: Jesse + Date: Fri Jan 2 16:22:55 2004 + + none + + rt.3.0.D330, C315, jesse, Fri Jan 2 15:10:37 2004, #3608: fixing quicksearch + to work with new watcher search + From: Jesse Vincent + Date: Sat Dec 13 15:31:06 2003 + + none + + rt.3.0.D329, C309, jesse, Fri Jan 2 15:10:02 2004, #3660: add a 'timeout' + flag to the rt-mailgate + From: Jesse Vincent + Date: Sat Dec 13 02:12:05 2003 + + none + + rt.3.0.D328, C21, jesse, Fri Jan 2 15:09:18 2004, #2587: turn off + autocomplete in RT's search box + From: Jesse Vincent + Date: Sat Dec 13 01:57:52 2003 + + none + + rt.3.0.D327, C397, jesse, Tue Dec 30 16:19:24 2003, Fixing apparent SQL error + on logout. Actually bug in localization + none + + rt.3.0.D326, C396, leira, Fri Dec 19 01:11:25 2003, AutoOpen should set + correct type for Status transaction + From: Linda L. Julien + Date: Thu Dec 18 23:56:15 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D325, C395, jesse, Wed Dec 17 14:12:38 2003, Bumping to 3.0.8RC1 + From: Jesse + Date: Thu Dec 18 15:00:12 2003 + + none + + rt.3.0.D324, C392, leira, Wed Dec 17 14:09:47 2003, order SelfService tickets + by numeric id + From: Linda Julien + Date: Mon Dec 15 04:21:15 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D323, C393, jesse, Mon Dec 15 19:28:46 2003, #4711: search ON Dates + From: Jesse + Date: Tue Dec 16 20:30:27 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D322, C114, jesse, Sat Dec 13 01:32:42 2003, #3066: crontool docs + From: Jesse Vincent + Date: Sat Dec 13 00:38:04 2003 + + none + + rt.3.0.D321, C391, jesse, Sat Dec 13 01:32:12 2003, #3608: search by ccs and + adminccs in addition to requestors + From: Jesse Vincent + Date: Sat Dec 13 01:24:33 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D320, C390, jesse, Sat Dec 13 01:29:24 2003, #3813: the CreateTickets + scripaction couldn't handle customfields + From: Jesse Vincent + Date: Sat Dec 13 01:22:56 2003 + + none + + rt.3.0.D319, C389, jesse, Sat Dec 13 01:28:24 2003, #3736: Backport RT 3.1 + 'inplace' layout + From: Jesse Vincent + Date: Sat Dec 13 01:15:39 2003 + + none + + rt.3.0.D318, C388, jesse, Sat Dec 13 01:28:13 2003, #3725: Making CLI display + newly created tickets ids + From: Jesse Vincent + Date: Sat Dec 13 01:12:20 2003 + + none + + rt.3.0.D317, C387, jesse, Sat Dec 13 01:27:59 2003, #4455: Better handling of + bad link URIs + From: Jesse Vincent + Date: Fri Dec 12 23:33:09 2003 + + none + + rt.3.0.D316, C386, jesse, Sat Dec 13 01:27:41 2003, #4552 arguments for + AddCustomFieldValues + From: Jesse Vincent + Date: Fri Dec 12 23:23:08 2003 + + none + + rt.3.0.D315, C385, jesse, Sat Dec 13 01:27:17 2003, #4554: callbacks should be + ordered + From: Jesse Vincent + Date: Fri Dec 12 23:14:57 2003 + + none + + rt.3.0.D314, C383, jesse, Sat Dec 13 01:27:06 2003, #4572: Fix searching on + links + From: Jesse Vincent + Date: Fri Dec 12 23:11:24 2003 + + none + + rt.3.0.D313, C197, jesse, Fri Dec 12 23:18:59 2003, Fixing CreaetTickets + documentation + From: Jesse Vincent + Date: Tue Jul 8 19:59:48 2003 + + none + + rt.3.0.D312, C382, jesse, Thu Dec 11 12:58:27 2003, Researching email + corruption + From: Jesse + Date: Fri Dec 12 14:02:37 2003 + + none + + rt.3.0.D311, C381, jesse, Mon Dec 8 03:06:53 2003, Importing fixes from + ourinternet + From: Jesse + Date: Tue Dec 9 04:10:35 2003 + + none + + rt.3.0.D310, C380, jesse, Mon Dec 8 02:52:37 2003, Adding a new index doubles + my performance on /index.html + From: Jesse + Date: Tue Dec 9 03:53:40 2003 + + none + + rt.3.0.D309, C379, jesse, Sat Dec 6 21:06:31 2003, Switching to new I18NSafe + lowercasing behaviour for Pg + From: Jesse + Date: Sun Dec 7 22:11:09 2003 + + none + + rt.3.0.D308, C378, jesse, Fri Dec 5 16:51:11 2003, Bumping to 3.0.8pre2 + From: Jesse + Date: Sat Dec 6 17:43:47 2003 + + none + + rt.3.0.D307, C377, leira, Fri Dec 5 16:45:20 2003, Numerous CLI improvements + From: Linda Julien + Date: Fri Dec 5 03:09:04 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D306, C376, jesse, Wed Dec 3 01:15:23 2003, Certain non-western From: + headers were being mangled + From: Jesse Vincent + Date: Wed Dec 3 01:14:25 2003 + + none + + rt.3.0.D305, C375, jesse, Tue Dec 2 19:05:41 2003, Ticket counts became + inaccurate after repeated web searches + From: Jesse Vincent + Date: Tue Dec 2 19:03:18 2003 + + none + + rt.3.0.D304, C373, jesse, Tue Dec 2 18:36:05 2003, Fixing next/prev ticket + navigation (#4461) it sometimes disappeared. + From: Jesse Vincent + Date: Tue Dec 2 18:34:07 2003 + + none + + rt.3.0.D303, C372, jesse, Thu Nov 27 12:28:56 2003, Decode uuencoded + attachments + From: Jesse + Date: Fri Nov 28 13:32:25 2003 + + none + + rt.3.0.D302, C371, jesse, Thu Nov 27 02:00:59 2003, none + From: Jesse + Date: Fri Nov 28 03:05:10 2003 + + none + + rt.3.0.D301, C370, jesse, Tue Nov 25 22:24:45 2003, Bumping to 3.0.8pre1 + none + + rt.3.0.D300, C369, leira, Fri Nov 21 12:30:08 2003, CLI tool should pass + through orderby arg + From: Linda Julien + Date: Fri Nov 21 12:22:20 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D299, C367, jesse, Fri Nov 21 00:24:44 2003, Ticket creation and + updates via the Web UI were sometimes encoded wrong + From: Jesse + Date: Sat Nov 22 01:17:10 2003 + + none + + rt.3.0.D298, C368, jesse, Fri Nov 21 00:21:32 2003, Regression and upgrade + cleanups + From: Jesse + Date: Sat Nov 22 01:20:08 2003 + + none + + rt.3.0.D297, C366, jesse, Thu Nov 20 17:44:16 2003, #4415: Fix for imporeting + merged tickets + From: Jesse + Date: Fri Nov 21 18:47:53 2003 + + none + + rt.3.0.D296, C365, jesse, Thu Nov 20 17:22:51 2003, FastCGI fix to make the + CLI work + From: Jesse + Date: Fri Nov 21 18:24:18 2003 + + none + + rt.3.0.D295, C363, leira, Thu Nov 20 17:21:32 2003, protect against reentrancy + in Ticket::DESTROY + From: Linda L. Julien + Date: Wed Nov 19 15:45:47 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D294, C360, leira, Mon Nov 17 23:28:48 2003, Transaction batching + From: Linda Julien + Date: Mon Nov 17 18:52:37 2003 + Warning: the original change was in the 'being_developed' state + + From: Jesse + Date: Sun Nov 16 18:10:00 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D293, C359, leira, Mon Nov 17 23:24:21 2003, + ProcessTicketCustomFieldUpdates takes TicketObj + From: Linda Julien + Date: Mon Nov 17 17:59:28 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D292, C358, leira, Mon Nov 17 23:21:05 2003, localization for link + text, not whole link + From: Linda Julien + Date: Mon Nov 17 17:33:58 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D291, C357, leira, Mon Nov 17 23:20:32 2003, Display.html takes + TicketObj; Update.html uses it + From: Linda Julien + Date: Mon Nov 17 17:19:05 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D290, C356, leira, Mon Nov 17 23:16:11 2003, Fixup to rt-setup-database + tool for local schema + From: Linda Julien + Date: Mon Nov 17 15:30:46 2003 + Warning: the original change was in the 'awaiting_integration' state + + From: Jesse + Date: Sun Nov 16 18:09:16 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D289, C355, leira, Mon Nov 17 23:14:05 2003, Minor cleanups to RT cli + tool + From: Linda Julien + Date: Mon Nov 17 14:59:54 2003 + Warning: the original change was in the 'awaiting_integration' state + + From: Jesse + Date: Sun Nov 16 18:09:22 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D288, C362, jesse, Mon Nov 17 22:53:56 2003, Fixes to RT 3.0.7 upgrade + instructions; Bumping to 3.0.7_01 + From: Jesse + Date: Tue Nov 18 23:56:48 2003 + + none + + rt.3.0.D287, C361, jesse, Mon Nov 17 19:30:11 2003, Bumping to 3.0.7; Updated + DBIx::SearchBuilder dependency + From: Jesse + Date: Tue Nov 18 20:25:24 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D286, C353, jesse, Thu Nov 13 03:11:35 2003, Bumping to 3.0.7rc1 + From: Jesse + Date: Fri Nov 14 04:13:34 2003 + + none + + rt.3.0.D285, C352, jesse, Thu Nov 13 02:59:36 2003, CLI usage updates + From: Linda Julien + Date: Thu Nov 13 02:58:17 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D284, C351, leira, Thu Nov 13 02:41:21 2003, CLI changes + From: Linda Julien + Date: Thu Nov 13 02:36:17 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D283, C350, jesse, Mon Nov 10 01:26:11 2003, Bumping version to + 3.0.7pre3 + From: Jesse Vincent + Date: Mon Nov 10 01:24:27 2003 + + none + + rt.3.0.D282, C104, jesse, Mon Nov 10 01:16:01 2003, Merging ourinternet's + changes relative to 3.0.7pre2; UPGRADING update; postgres installation fixes + From: Jesse Vincent + Date: Mon Nov 10 01:10:08 2003 + + none + + rt.3.0.D281, C339, jesse, Thu Nov 6 21:11:46 2003, Small fix to ticket + searching to cut down on # of joins needed + From: Jesse Vincent + Date: Thu Nov 6 21:11:21 2003 + + none + + rt.3.0.D280, C338, jesse, Thu Nov 6 21:05:17 2003, Updating storable + dependency, to keep redhat 9 users from hurting themselves + From: Jesse Vincent + Date: Thu Nov 6 20:53:44 2003 + + none + + rt.3.0.D279, C335, leira, Tue Nov 4 21:11:39 2003, fix attachment links in + base RT + From: Linda L. Julien + Date: Tue Nov 4 16:42:55 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D278, C333, leira, Tue Nov 4 21:10:18 2003, #4088: Postgres + performance improvements + From: Linda L. Julien + Date: Tue Nov 4 16:25:57 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D277, C331, leira, Tue Nov 4 21:08:27 2003, #3583: set Last Contacted + date + From: Linda L. Julien + Date: Mon Nov 3 13:58:57 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D276, C330, leira, Tue Nov 4 21:06:14 2003, #3601: SelectRights patch + From: Linda L. Julien + Date: Sun Nov 2 22:03:23 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D275, C337, jesse, Tue Nov 4 18:18:39 2003, more work on the schema + diagram + From: Jesse Vincent + Date: Tue Nov 4 18:16:53 2003 + + none + + rt.3.0.D274, C336, jesse, Tue Nov 4 18:18:24 2003, New schema relationships + diagram in .dot format + From: Jesse Vincent + Date: Tue Nov 4 17:51:10 2003 + + none + + rt.3.0.D273, C329, leira, Tue Nov 4 17:52:14 2003, #3674: autohandler patch + From: Linda L. Julien + Date: Sun Nov 2 21:49:43 2003 + + none + + rt.3.0.D272, C332, leira, Tue Nov 4 17:29:08 2003, #3776: new indices + From: Linda L. Julien + Date: Tue Nov 4 15:25:39 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D271, C328, leira, Sun Nov 2 23:07:51 2003, #3751: + ParseNewMessageForTicketCcs + From: Linda L. Julien + Date: Sun Nov 2 21:16:07 2003 + + none + + rt.3.0.D270, C327, leira, Sun Nov 2 22:49:39 2003, #3801: note when + transaction content is ellided + From: Linda L. Julien + Date: Sun Nov 2 20:44:58 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D269, C326, leira, Sun Nov 2 22:31:42 2003, #3827: regression + shouldn't drop db + From: Linda L. Julien + Date: Sun Nov 2 20:17:48 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D268, C325, leira, Sun Nov 2 21:15:22 2003, #3856: /REST/1.0/search/ + tickets should work in UTC + From: Linda L. Julien + Date: Sun Nov 2 19:57:19 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D267, C323, leira, Sun Nov 2 21:14:48 2003, #3855: require + Locale::Maketext::Lexicon 0.31 + From: Linda L. Julien + Date: Sun Nov 2 19:36:37 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D266, C322, leira, Sun Nov 2 21:14:18 2003, #3439: custom fields patch + From: Linda L. Julien + Date: Sun Nov 2 19:11:11 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D265, C320, leira, Sun Nov 2 20:00:45 2003, #4087: allow non-ISO dates + in transaction searches + From: Linda L. Julien + Date: Sun Nov 2 18:28:45 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D264, C321, leira, Sun Nov 2 19:59:21 2003, #3993: warn when + installing with mod_perl2 + From: Linda L. Julien + Date: Sun Nov 2 18:47:57 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D263, C319, leira, Sun Nov 2 18:51:11 2003, #3551: Create values + corrupted when adding new files + From: Linda L. Julien + Date: Sun Nov 2 17:36:44 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D262, C318, leira, Sun Nov 2 18:50:09 2003, #3877: don't strip multi- + line headers + From: Linda L. Julien + Date: Sun Nov 2 16:32:21 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D261, C317, leira, Sun Nov 2 18:49:15 2003, #3613: searching on NOT + LIKE + From: Linda L. Julien + Date: Fri Oct 31 01:39:10 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D260, C316, leira, Fri Oct 31 11:59:11 2003, #3765: TicketsSQL is case- + sensitive + From: Linda L. Julien + Date: Thu Oct 30 16:46:33 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D259, C312, jesse, Fri Oct 31 11:58:43 2003, Initial Informix port from + akso.de + From: Jesse Vincent + Date: Thu Oct 30 13:03:54 2003 + + none + + rt.3.0.D258, C311, leira, Fri Oct 31 11:57:33 2003, #3566: EditCustomField + supports Default for FreeformSingle + From: Linda L. Julien + Date: Fri Oct 24 16:48:36 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D257, C313, jesse, Thu Oct 30 15:33:45 2003, Adding back missing + SelectLang + From: Jesse Vincent + Date: Thu Oct 30 15:31:35 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D256, C94, jesse, Tue Oct 28 16:02:50 2003, Deep recursion issue on + localization handle; missing language selector + From: Jesse Vincent + Date: Tue Oct 28 16:01:40 2003 + + none + + rt.3.0.D255, C310, jesse, Wed Oct 22 00:33:40 2003, Slightly better debugging + on failure to send mail + From: Jesse Vincent + Date: Wed Oct 22 00:25:35 2003 + + none + + rt.3.0.D254, C307, jesse, Tue Oct 21 23:43:39 2003, User objects weren't + always destroyed, due to a circular reference + From: Jesse Vincent + Date: Mon Oct 20 19:02:08 2003 + + none + + rt.3.0.D253, C308, jesse, Tue Oct 21 23:35:50 2003, More reference weakening + From: Jesse Vincent + Date: Tue Oct 21 23:34:11 2003 + + none + + rt.3.0.D252, C306, jesse, Sun Oct 19 21:06:33 2003, #3907: New default + templates for user, ticket and queue + From: Jesse Vincent + Date: Sun Oct 19 21:05:48 2003 + + none + + rt.3.0.D251, C305, jesse, Sun Oct 19 21:00:11 2003, #3807: CLI example updates + From: Jesse Vincent + Date: Sun Oct 19 20:59:14 2003 + + none + + rt.3.0.D250, C303, jesse, Sun Oct 19 20:55:45 2003, #3822: Fix for cli bug + (Inapropriate use of arrayref) + From: Jesse Vincent + Date: Sun Oct 19 20:54:22 2003 + + none + + rt.3.0.D249, C302, jesse, Sun Oct 19 20:55:16 2003, #3889: add/del fixes + From: Jesse Vincent + Date: Sun Oct 19 20:25:21 2003 + + none + + rt.3.0.D248, C298, leira, Sun Oct 19 20:23:35 2003, bps #1032: SelfService + fixes + From: Linda Julien + Date: Wed Oct 8 18:39:07 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D247, C84, jesse, Sun Oct 19 20:23:21 2003, #3981: Ticket creation + syntax fix + From: Jesse Vincent + Date: Sun Oct 19 20:20:46 2003 + + none + + rt.3.0.D246, C301, jesse, Sun Oct 19 20:11:09 2003, #2346: Resolving a + deprecation warning + From: Jesse Vincent + Date: Sun Oct 19 20:10:25 2003 + + none + + rt.3.0.D245, C300, jesse, Thu Oct 16 20:03:36 2003, A bunch of postgres + correctness fixes + From: Jesse Vincent + Date: Thu Oct 16 20:00:27 2003 + + none + + rt.3.0.D244, C299, jesse, Thu Oct 16 20:02:08 2003, Merging bugfixes from + ourinternet + From: Jesse Vincent + Date: Tue Oct 14 12:29:53 2003 + + none + + rt.3.0.D243, C297, jesse, Wed Oct 8 11:47:30 2003, Conditionalizing + Text::Quoted display, so as to avoid utf8 crashes + From: Jesse Vincent + Date: Wed Oct 8 16:46:31 2003 + + none + + rt.3.0.D242, C296, jesse, Thu Sep 25 16:28:46 2003, Bumping to RT 3.0.6 + From: Jesse Vincent + Date: Thu Sep 25 16:27:53 2003 + + none + + rt.3.0.D241, C295, jesse, Thu Sep 25 15:13:08 2003, Updated documentation for + RT CLI tool + From: Jesse Vincent + Date: Thu Sep 25 15:12:46 2003 + + none + + rt.3.0.D240, C293, jesse, Mon Sep 22 16:21:10 2003, Bumping to 3.0.6RC1 + From: Jesse Vincent + Date: Mon Sep 22 16:20:02 2003 + + none + + rt.3.0.D239, C292, jesse, Mon Sep 22 16:21:00 2003, fixing a multiple- + signature-inclusion bug + From: Jesse Vincent + Date: Mon Sep 22 15:29:40 2003 + + none + + rt.3.0.D238, C291, jesse, Mon Sep 22 14:46:52 2003, Fixing a couple bugs + related to display of links + From: Jesse Vincent + Date: Mon Sep 22 14:44:12 2003 + + none + + rt.3.0.D237, C290, jesse, Mon Sep 8 14:18:29 2003, RT 3.0.5 + From: Jesse Vincent + Date: Mon Sep 8 14:12:19 2003 + + none + + rt.3.0.D236, C289, jesse, Mon Sep 8 13:47:05 2003, Custom field values + couldn't be set to '0'; README updated for apache2 + From: Jesse Vincent + Date: Mon Sep 8 13:45:41 2003 + + none + + rt.3.0.D235, C288, jesse, Sat Sep 6 01:52:41 2003, Patches to the cli from + ams + From: Jesse Vincent + Date: Sat Sep 6 01:50:41 2003 + + none + + rt.3.0.D234, C287, jesse, Tue Sep 2 18:16:15 2003, Bumping to 3.0.5RC1 + From: Jesse Vincent + Date: Tue Sep 2 18:15:51 2003 + + none + + rt.3.0.D233, C286, jesse, Fri Aug 29 21:10:44 2003, Bumping to 3.0.5pre6 + From: Jesse Vincent + Date: Fri Aug 29 18:01:40 2003 + + none + + rt.3.0.D232, C285, jesse, Fri Aug 29 21:10:24 2003, Better handling of + apparently bogus email; rationalize mail gateway error codes + From: Jesse Vincent + Date: Fri Aug 29 18:01:29 2003 + + none + + rt.3.0.D231, C283, jesse, Fri Aug 29 16:26:30 2003, #3399: Message parsing + fails for some types of report + From: Jesse Vincent + Date: Fri Aug 29 16:25:33 2003 + + none + + rt.3.0.D230, C64, jesse, Thu Aug 28 17:40:29 2003, Bumping to 3.0.5pre5 + From: Jesse Vincent + Date: Thu Aug 28 17:32:38 2003 + + none + + rt.3.0.D229, C279, leira, Thu Aug 28 17:39:37 2003, #2651: localize die/warn + handlers + From: Linda Julien + Date: Tue Aug 26 15:38:12 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D228, C282, jesse, Thu Aug 28 17:38:28 2003, fixing the new testdeps + thing + From: Jesse Vincent + Date: Thu Aug 28 17:38:07 2003 + + none + + rt.3.0.D227, C281, jesse, Thu Aug 28 17:34:18 2003, More explicit warning + about a lack of perl 5.8 + From: Jesse Vincent + Date: Thu Aug 28 17:30:47 2003 + + none + + rt.3.0.D226, C280, jesse, Thu Aug 28 17:33:15 2003, Post 3.0.5pre3 - sometimes + silently losing mail. fixed a possible bug, improved testing + From: Jesse Vincent + Date: Thu Aug 28 17:09:51 2003 + + none + + rt.3.0.D225, C278, jesse, Tue Aug 26 15:29:24 2003, Fixes to attempt to stop + mysql 'morning bugs' with mysql + From: Jesse Vincent + Date: Tue Aug 26 15:28:20 2003 + + none + + rt.3.0.D224, C277, leira, Tue Aug 26 15:04:20 2003, #3114: increase subject + length in non-Postgres dbs + From: Linda Julien + Date: Tue Aug 26 14:51:25 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D223, C276, leira, Tue Aug 26 15:03:17 2003, #3354: an additional fix + for avoiding the morning bug + From: Linda Julien + Date: Mon Aug 25 17:58:27 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D222, C275, leira, Tue Aug 26 15:02:16 2003, #3384: recursive merge + patches + From: Linda Julien + Date: Mon Aug 25 17:02:00 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D221, C273, leira, Mon Aug 25 16:33:53 2003, #3105: CreateTickets + doesn't set ticket type + From: Linda Julien + Date: Mon Aug 25 16:30:06 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D220, C272, leira, Mon Aug 25 15:53:13 2003, #3236: allow attachments + without other txn contents + From: Linda Julien + Date: Mon Aug 25 15:47:52 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D219, C270, leira, Mon Aug 25 15:13:31 2003, #3349: umlauts aren't + correct in subject + From: Linda Julien + Date: Mon Aug 25 13:55:52 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D218, C271, leira, Mon Aug 25 15:13:05 2003, #3012: vertical alignment + in Ticket/Elements/ShowPeople + From: Linda Julien + Date: Mon Aug 25 14:08:04 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D217, C269, leira, Mon Aug 25 14:45:12 2003, #3341: edit comments in + SiteConfig + From: Linda Julien + Date: Mon Aug 25 13:38:51 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D216, C268, jesse, Sun Aug 24 17:16:04 2003, Bumping version to + 3.0.5pre4 + From: Jesse Vincent + Date: Sun Aug 24 17:15:36 2003 + + none + + rt.3.0.D215, C253, jesse, Sun Aug 24 17:12:37 2003, Fixing improperly applied + custom field editing patches + From: Jesse Vincent + Date: Sun Aug 24 17:11:40 2003 + + none + + rt.3.0.D214, C267, leira, Sun Aug 24 14:57:37 2003, #3324: Apache::DBI must be + 0.92 or newer + From: Linda Julien + Date: Fri Aug 22 14:40:27 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D213, C265, leira, Fri Aug 22 13:30:09 2003, #3118: change default + unset mail address + From: Linda Julien + Date: Fri Aug 22 12:13:22 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D212, C266, leira, Fri Aug 22 13:29:46 2003, #2693: show proper id in + menu after creation + From: Linda Julien + Date: Fri Aug 22 12:39:53 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D211, C263, leira, Fri Aug 22 01:18:00 2003, #3281: form actions must + not be paths + From: Linda Julien + Date: Fri Aug 22 01:12:07 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D210, C260, leira, Fri Aug 22 01:13:07 2003, #2558: allow access to CFs + with no name + From: Linda Julien + Date: Thu Aug 21 22:36:35 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D209, C251, leira, Fri Aug 22 01:07:34 2003, #2617: custom field + ordering + From: Linda Julien + Date: Wed Aug 20 17:33:22 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D208, C262, leira, Fri Aug 22 01:00:21 2003, #3143: Italian translation + From: Linda Julien + Date: Fri Aug 22 00:52:11 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D207, C261, leira, Thu Aug 21 23:31:22 2003, #3240: DeleteWatcher, not + DelWatcher + From: Linda Julien + Date: Thu Aug 21 23:22:40 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D206, C258, leira, Thu Aug 21 23:07:01 2003, #2409: colons after labels + in Create.html + From: Linda Julien + Date: Thu Aug 21 17:23:04 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D205, C257, leira, Thu Aug 21 23:06:12 2003, #2700: configurable home + page ticket list length + From: Linda Julien + Date: Thu Aug 21 15:08:27 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D204, C259, leira, Thu Aug 21 22:37:27 2003, #2773: don't allow + searching for deleted tickets + From: Linda Julien + Date: Thu Aug 21 22:15:43 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D203, C256, leira, Thu Aug 21 14:09:59 2003, #2160: clarify that box + deletes scrips + From: Linda Julien + Date: Thu Aug 21 13:53:00 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D202, C255, leira, Thu Aug 21 14:09:27 2003, #2268: align fields in + User/Prefs.html + From: Linda Julien + Date: Thu Aug 21 13:21:00 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D201, C252, leira, Wed Aug 20 18:13:50 2003, #2687: add ticket subject + to resolved template + From: Linda Julien + Date: Wed Aug 20 17:58:22 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D200, C250, leira, Wed Aug 20 13:33:40 2003, #3329: Email.pm patch + From: Linda Julien + Date: Wed Aug 20 13:19:58 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D199, C239, leira, Tue Aug 19 23:05:34 2003, #3309: switch lines in + User/Prefs.html + From: Linda Julien + Date: Tue Aug 19 22:59:28 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D198, C236, leira, Tue Aug 19 22:47:07 2003, #3278: occasional internal + server error in RT.pm + From: Linda Julien + Date: Tue Aug 19 22:44:16 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D197, C233, leira, Tue Aug 19 22:28:05 2003, #3242: cannonicalize + addresses in comments + From: Linda Julien + Date: Tue Aug 19 22:21:57 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D196, C238, leira, Tue Aug 19 22:07:37 2003, #3114: allow longer + subject lines for postgres + From: Linda Julien + Date: Tue Aug 19 22:01:02 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D195, C235, leira, Tue Aug 19 21:54:16 2003, #2653: Email.pm patch + From: Linda Julien + Date: Tue Aug 19 19:57:12 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D194, C237, leira, Tue Aug 19 21:51:11 2003, #2672: custom field values + ordering + From: Linda Julien + Date: Tue Aug 19 21:19:44 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D193, C232, jesse, Mon Aug 18 22:16:09 2003, Old relationship update + transactions weren't properly displayed + From: Jesse Vincent + Date: Mon Aug 18 22:14:33 2003 + + none + + rt.3.0.D192, C218, leira, Thu Aug 14 13:37:04 2003, #2955: wrapping in + messagebox + From: Linda Julien + Date: Wed Aug 13 17:28:03 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D191, C230, jesse, Tue Aug 12 02:54:11 2003, #3230: Parser patch to + make watchers searches more efficient + From: Jesse Vincent + Date: Mon Aug 11 14:41:00 2003 + + none + + rt.3.0.D190, C54, jesse, Tue Aug 12 02:49:27 2003, #3279: Make fsck.com-rt: + URIs case insensitive + From: Jesse Vincent + Date: Mon Aug 11 15:25:07 2003 + + none + + rt.3.0.D189, C231, jesse, Tue Aug 12 02:47:19 2003, #3237: Queue-specific + templates with the same name as global templates will now override the globals + for queue-related scrips + From: Jesse Vincent + Date: Mon Aug 11 15:04:37 2003 + + none + + rt.3.0.D188, C49, jesse, Fri Aug 8 01:57:57 2003, Dependencies updated; + performance and memory usage fixes for ticket creation memory usage + From: Jesse Vincent + Date: Fri Aug 8 01:54:16 2003 + + none + + rt.3.0.D187, C47, jesse, Mon Aug 4 23:20:33 2003, Bumping to 3.0.5pre3 + From: Jesse Vincent + Date: Mon Aug 4 23:20:16 2003 + + none + + rt.3.0.D186, C46, jesse, Mon Aug 4 19:15:22 2003, #2792: When finding out if + someone is a queue watcher, check groups recursively + From: Jesse Vincent + Date: Mon Aug 4 19:14:50 2003 + + none + + rt.3.0.D185, C45, jesse, Mon Aug 4 18:55:13 2003, #3152: Updated russian .po + file + From: Jesse Vincent + Date: Mon Aug 4 18:50:35 2003 + + none + + rt.3.0.D184, C44, jesse, Mon Aug 4 18:27:40 2003, #3131: Preliminary support + for Oracle from Brook Schonfield + From: Jesse Vincent + Date: Mon Aug 4 18:26:08 2003 + + none + + rt.3.0.D183, C43, jesse, Mon Aug 4 16:19:07 2003, #3068: Better setting of + Due dates via the web ui + From: Jesse Vincent + Date: Mon Aug 4 16:18:50 2003 + + none + + rt.3.0.D182, C41, jesse, Mon Aug 4 16:02:01 2003, #3022: Update to German + translation + From: Jesse Vincent + Date: Mon Aug 4 16:01:08 2003 + + none + + rt.3.0.D181, C42, jesse, Thu Jul 31 13:34:50 2003, Bumping version to 3.0.5- + pre2 + From: Jesse Vincent + Date: Thu Jul 31 13:28:35 2003 + + none + + rt.3.0.D180, C40, jesse, Tue Jul 29 02:24:22 2003, #3200 - AND MultipleSelect + CFs together - OR all other CFs together. + From: Jesse Vincent + Date: Tue Jul 29 02:21:50 2003 + + none + + rt.3.0.D179, C229, jesse, Tue Jul 29 02:09:06 2003, #3201: Perform more clever + joining to enhance custom field search results + From: Jesse Vincent + Date: Tue Jul 29 02:06:22 2003 + + none + + rt.3.0.D178, C228, jesse, Tue Jul 29 01:17:12 2003, #3199: normalize custom + fields searching syntax - Global CF's previously didn't allow the { } + From: Jesse Vincent + Date: Tue Jul 29 01:16:28 2003 + + none + + rt.3.0.D177, C227, jesse, Mon Jul 28 01:39:28 2003, [fsck.com #2378] personal + permissions for installation + From: Robert + Date: Sun Jul 27 22:19:40 2003 + Warning: the original change was in the 'awaiting_integration' state + + install as current user option for configure + + rt.3.0.D176, C34, jesse, Mon Jul 28 00:00:12 2003, Failed user creation didn't + always properly roll-back the database + From: Jesse Vincent + Date: Sun Jul 27 23:59:16 2003 + + none + + rt.3.0.D175, C226, jesse, Sun Jul 27 23:52:28 2003, Code to catch execution + problems within RT's web app server was made more robust + From: Jesse Vincent + Date: Sun Jul 27 23:51:50 2003 + + none + + rt.3.0.D174, C225, jesse, Sun Jul 27 23:44:44 2003, One I18N 'fix' from + ourinternet tainted attachment data, breaking tests + From: Jesse Vincent + Date: Sun Jul 27 23:44:17 2003 + + none + + rt.3.0.D173, C223, jesse, Sun Jul 27 17:16:20 2003, Adding the RT coding style + guide to the distribution + From: Jesse Vincent + Date: Sun Jul 27 17:15:32 2003 + + none + + rt.3.0.D172, C222, jesse, Fri Jul 25 19:50:19 2003, fixes for the importer + From: Jesse Vincent + Date: Fri Jul 25 19:49:06 2003 + + none + + rt.3.0.D171, C221, leira, Fri Jul 25 14:02:49 2003, 3158: user can delete only + with DeleteTicket right + From: Linda Julien + Date: Fri Jul 25 02:44:41 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D170, C220, leira, Fri Jul 25 14:01:38 2003, #2989: regexp changes for + Subject and loop-detection + From: Linda Julien + Date: Fri Jul 25 02:02:18 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D169, C219, leira, Fri Jul 25 13:52:47 2003, #2855: User_Overlay and + Template_Overlay fixes + From: Linda Julien + Date: Fri Jul 25 01:08:37 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D168, C216, leira, Fri Jul 25 13:45:37 2003, #2692: make $Domain an + argument for SelectGroups + From: Linda Julien + Date: Thu Jul 24 23:31:35 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D167, C215, jesse, Thu Jul 24 23:25:01 2003, Merging + internationalization fixes from ourinternet + From: Jesse Vincent + Date: Thu Jul 24 23:22:46 2003 + + none + + rt.3.0.D166, C213, jesse, Thu Jul 24 18:39:57 2003, Bumping to 3.0.5pre1 + From: Jesse Vincent + Date: Thu Jul 24 18:38:14 2003 + + none + + rt.3.0.D165, C212, jesse, Wed Jul 23 18:06:41 2003, License tagger was tagging + Makefile, not Makefile.in. Reconfigured. + From: Jesse Vincent + Date: Wed Jul 23 18:03:14 2003 + + none + + rt.3.0.D164, C211, jesse, Wed Jul 23 15:23:11 2003, Requestor searches had an + extra join that they didn't need + From: Jesse Vincent + Date: Wed Jul 23 15:22:34 2003 + + none + + rt.3.0.D163, C207, leira, Tue Jul 22 03:10:34 2003, regression tests: use + $RT::WebPath and RT_LIB_PATH + From: Linda L. Julien + Date: Mon Jul 21 18:12:56 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D162, C210, jesse, Tue Jul 22 02:52:01 2003, A couple of fixes to + better deal with creation of 'blank' ticket requestors + From: Jesse Vincent + Date: Tue Jul 22 02:50:09 2003 + + none + + rt.3.0.D161, C208, leira, Tue Jul 22 01:56:30 2003, #1651: URIs not escaped in + ticket display + From: Linda Julien + Date: Mon Jul 21 18:33:24 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D160, C209, leira, Tue Jul 22 01:54:49 2003, #1751: update second page + in Bulk update + From: Linda Julien + Date: Mon Jul 21 20:54:02 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D159, C24, jesse, Fri Jul 18 18:59:13 2003, Certain ACL checks could + fail on postgres due to a marshalling bug + From: Jesse Vincent + Date: Fri Jul 18 17:06:39 2003 + + none + + rt.3.0.D158, C206, jesse, Fri Jul 18 18:58:22 2003, Extended ACL edit routines + to make it easier to use generic routines in 3rd party apps + From: Jesse Vincent + Date: Fri Jul 18 17:04:15 2003 + + none + + rt.3.0.D157, C205, jesse, Mon Jul 14 02:51:28 2003, Removing ancient cli code + that was accidentally added to the repository + From: Jesse Vincent + Date: Sun Jul 13 23:47:51 2003 + + none + + rt.3.0.D156, C203, jesse, Sun Jul 13 22:35:44 2003, More updates to the + commandline client + From: Jesse Vincent + Date: Sun Jul 13 19:32:10 2003 + + none + + rt.3.0.D155, C202, jesse, Sun Jul 13 21:33:58 2003, Initial commit of new + commandline client support code + From: Jesse Vincent + Date: Sun Jul 13 18:33:29 2003 + + none + + rt.3.0.D154, C196, jesse, Sun Jul 13 18:06:09 2003, #3029 - better warning + message on improper perms on mail in + From: Jesse Vincent + Date: Tue Jul 8 16:59:59 2003 + + none + + rt.3.0.D153, C195, jesse, Sun Jul 13 18:05:41 2003, #3042: Make max inline + body size configurable + From: Jesse Vincent + Date: Tue Jul 8 16:55:28 2003 + + none rt.3.0.D152, C201, jesse, Sat Jul 12 02:41:34 2003, Bumping version to 3.0.4 From: Jesse Vincent diff --git a/rt/Makefile b/rt/Makefile index 644722109..0895874fb 100644 --- a/rt/Makefile +++ b/rt/Makefile @@ -1,20 +1,19 @@ # BEGIN LICENSE BLOCK # -# Copyright (c) 1996-2002 Jesse Vincent +# Copyright (c) 1996-2003 Jesse Vincent # # (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed -# from www.gnu.org +# from www.gnu.org. # # This work 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. # -# # Unless otherwise specified, all modifications, corrections or # extensions to this work which alter its source code become the # property of Best Practical Solutions, LLC when submitted for @@ -22,8 +21,6 @@ # # # END LICENSE BLOCK - - # # DO NOT HAND-EDIT the file named 'Makefile'. This file is autogenerated. # Have a look at "configure" and "Makefile.in" instead @@ -39,7 +36,7 @@ SITE_CONFIG_FILE = $(CONFIG_FILE_PATH)/RT_SiteConfig.pm RT_VERSION_MAJOR = 3 RT_VERSION_MINOR = 0 -RT_VERSION_PATCH = 4 +RT_VERSION_PATCH = 9 RT_VERSION = $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH) TAG = rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH) @@ -101,8 +98,8 @@ RT_MODPERL_HANDLER = $(RT_BIN_PATH)/webmux.pl RT_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.fcgi # RT_WIN32_FASTCGI_HANDLER is the mason handler script for FastCGI RT_WIN32_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.svc -# RT's admin CLI -RT_CLI_ADMIN_BIN = $(RT_BIN_PATH)/rtadmin +# RT's CLI +RT_CLI_BIN = $(RT_BIN_PATH)/rt # RT's mail gateway RT_MAILGATE_BIN = $(RT_BIN_PATH)/rt-mailgate # RT's cron tool @@ -115,6 +112,7 @@ SETGID_BINARIES = $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ BINARIES = $(DESTDIR)/$(RT_MODPERL_HANDLER) \ $(DESTDIR)/$(RT_MAILGATE_BIN) \ + $(DESTDIR)/$(RT_CLI_BIN) \ $(DESTDIR)/$(RT_CRON_BIN) \ $(SETGID_BINARIES) SYSTEM_BINARIES = $(DESTDIR)/$(RT_SBIN_PATH)/ @@ -128,6 +126,7 @@ SYSTEM_BINARIES = $(DESTDIR)/$(RT_SBIN_PATH)/ # DB_TYPE defines what sort of database RT trys to talk to # "mysql" is known to work. # "Pg" is known to work +# "Informix" is known to work DB_TYPE = mysql @@ -138,7 +137,8 @@ DB_TYPE = mysql # For mysql, you probably want 'root' # For Pg, you probably want 'postgres' -# For oracle, you want 'system' +# For Oracle, you want 'system' +# For Informix, you want 'informix' DB_DBA = root @@ -211,7 +211,7 @@ upgrade-instruct: @echo " $(RT_SBIN_PATH)/rt-setup-database --action insert --datafile etc/upgrade/" -upgrade: dirs upgrade-noclobber upgrade-instruct +upgrade: config-install dirs files-install fixperms upgrade-instruct upgrade-noclobber: config-install libs-install html-install bin-install local-install doc-install fixperms @@ -312,13 +312,16 @@ config-install: test: $(PERL) -Ilib lib/t/00smoke.t -regression-nosetgid-quiet: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl +regression-install: config-install + $(PERL) -pi -e 's/Set\(\$$DatabaseName.*\);/Set\(\$$DatabaseName, "rt3regression"\);/' $(DESTDIR)/$(CONFIG_FILE) + +regression-nosetgid-quiet: regression-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl $(PERL) sbin/regression_harness -regression-nosetgid: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl +regression-nosetgid: regression-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl $(PERL) lib/t/02regression.t -regression: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods apachectl +regression: regression-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms apachectl $(PERL) lib/t/02regression.t regression-quiet: @@ -397,7 +400,9 @@ bin-install: -cp -rp \ bin/rt-mailgate \ bin/mason_handler.fcgi \ + bin/mason_handler.scgi \ bin/mason_handler.svc \ + bin/rt \ bin/webmux.pl \ bin/rt-crontool \ $(DESTDIR)/$(RT_BIN_PATH) diff --git a/rt/Makefile.in b/rt/Makefile.in index 245ec5ed3..c3eabc634 100644 --- a/rt/Makefile.in +++ b/rt/Makefile.in @@ -1,20 +1,19 @@ # BEGIN LICENSE BLOCK # -# Copyright (c) 1996-2002 Jesse Vincent +# Copyright (c) 1996-2003 Jesse Vincent # # (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed -# from www.gnu.org +# from www.gnu.org. # # This work 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. # -# # Unless otherwise specified, all modifications, corrections or # extensions to this work which alter its source code become the # property of Best Practical Solutions, LLC when submitted for @@ -22,8 +21,6 @@ # # # END LICENSE BLOCK - - # # DO NOT HAND-EDIT the file named 'Makefile'. This file is autogenerated. # Have a look at "configure" and "Makefile.in" instead @@ -101,8 +98,8 @@ RT_MODPERL_HANDLER = $(RT_BIN_PATH)/webmux.pl RT_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.fcgi # RT_WIN32_FASTCGI_HANDLER is the mason handler script for FastCGI RT_WIN32_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.svc -# RT's admin CLI -RT_CLI_ADMIN_BIN = $(RT_BIN_PATH)/rtadmin +# RT's CLI +RT_CLI_BIN = $(RT_BIN_PATH)/rt # RT's mail gateway RT_MAILGATE_BIN = $(RT_BIN_PATH)/rt-mailgate # RT's cron tool @@ -115,6 +112,7 @@ SETGID_BINARIES = $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ BINARIES = $(DESTDIR)/$(RT_MODPERL_HANDLER) \ $(DESTDIR)/$(RT_MAILGATE_BIN) \ + $(DESTDIR)/$(RT_CLI_BIN) \ $(DESTDIR)/$(RT_CRON_BIN) \ $(SETGID_BINARIES) SYSTEM_BINARIES = $(DESTDIR)/$(RT_SBIN_PATH)/ @@ -128,6 +126,7 @@ SYSTEM_BINARIES = $(DESTDIR)/$(RT_SBIN_PATH)/ # DB_TYPE defines what sort of database RT trys to talk to # "mysql" is known to work. # "Pg" is known to work +# "Informix" is known to work DB_TYPE = @DB_TYPE@ @@ -138,7 +137,8 @@ DB_TYPE = @DB_TYPE@ # For mysql, you probably want 'root' # For Pg, you probably want 'postgres' -# For oracle, you want 'system' +# For Oracle, you want 'system' +# For Informix, you want 'informix' DB_DBA = @DB_DBA@ @@ -211,7 +211,7 @@ upgrade-instruct: @echo " $(RT_SBIN_PATH)/rt-setup-database --action insert --datafile etc/upgrade/" -upgrade: dirs upgrade-noclobber upgrade-instruct +upgrade: config-install dirs files-install fixperms upgrade-instruct upgrade-noclobber: config-install libs-install html-install bin-install local-install doc-install fixperms @@ -312,13 +312,16 @@ config-install: test: $(PERL) -Ilib lib/t/00smoke.t -regression-nosetgid-quiet: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl +regression-install: config-install + $(PERL) -pi -e 's/Set\(\$$DatabaseName.*\);/Set\(\$$DatabaseName, "rt3regression"\);/' $(DESTDIR)/$(CONFIG_FILE) + +regression-nosetgid-quiet: regression-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl $(PERL) sbin/regression_harness -regression-nosetgid: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl +regression-nosetgid: regression-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl $(PERL) lib/t/02regression.t -regression: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods apachectl +regression: regression-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms apachectl $(PERL) lib/t/02regression.t regression-quiet: @@ -397,7 +400,9 @@ bin-install: -cp -rp \ bin/rt-mailgate \ bin/mason_handler.fcgi \ + bin/mason_handler.scgi \ bin/mason_handler.svc \ + bin/rt \ bin/webmux.pl \ bin/rt-crontool \ $(DESTDIR)/$(RT_BIN_PATH) diff --git a/rt/README b/rt/README index 7c5e4d47a..7188f0938 100755 --- a/rt/README +++ b/rt/README @@ -21,6 +21,7 @@ # # # END LICENSE BLOCK + RT is an enterprise-grade issue tracking system. It allows organizations to keep track of their to-do lists, who is working on which tasks, what's already been done, and when tasks were @@ -36,22 +37,22 @@ up and use. REQUIRED PACKAGES: ------------------ -o Perl 5.8.0 or later (http://www.perl.com). +o Perl 5.8.3 or later (http://www.perl.com). (If you intend to use the FastCGI or SpeedyCGI support, you need to make sure that perl has been built with support for setgid perl scripts.)` + Perl versions prior to 5.8.3 contain bugs that could result in data + corruption. We recommend strongly that you use 5.8.3 or newer. + Perl 5.6.1 is currently deprecated and will be officially desupported in a future release o A DB backend; MySQL is recommended ( http://www.mysql.com ) Currently supported: Mysql 4.0.13 or later. Postgres 7.2 or later. - - Mysql 3.23.46 or newer with support for InnoDB - is currently deprecated and will be officially - desupported in a future release. + Oracle 9iR2. o Apache version 1.3.x or 2.x (http://httpd.apache.org) with mod_perl -- (http://perl.apache.org ) @@ -119,7 +120,7 @@ http://www.bestpractical.com/rt perl sbin/rt-test-dependencies \ --with- --with- - databasename is one of: mysql, postgres + databasename is one of: mysql, postgres, oracle web-environment is one of: fastcgi, modperl1, modperl2 3.2 If there are unsatisfied dependencies, install them by hand or run: @@ -151,6 +152,10 @@ http://www.bestpractical.com/rt 5b FOR UPGRADING: (Within the RT 3.0.x series) + + Read through the UPGRADING document included in this distribution. + It may contain important instructions for updating your database + As root, type: make upgrade (replace "make" with the local name for Make, if you need to) @@ -160,6 +165,14 @@ http://www.bestpractical.com/rt It may then instruct you to update your RT system database objects +5c FOR UPGRADING: (From RT 2.0.x) + + Download the RT2 to RT3 migration tools from: + + http://bestpractical.com/pub/rt/devel/rt2-to-rt3.tar.gz + + Follow the included instructions. + 6 Edit etc/RT_SiteConfig.pm in your RT installation directory, by specifying any values you need to change from the defaults in etc/RT_Config.pm @@ -192,31 +205,20 @@ Apache DocumentRoot /opt/rt3/share/html AddDefaultCharset UTF-8 - # this line applies to Apache2+mod_perl2 only + # these four lines apply to Apache2+mod_perl2 only: {{{ + PerlSetVar MasonArgsMethod CGI PerlModule Apache2 Apache::compat + RewriteEngine On + RewriteRule ^(.*)/$ $1/index.html + # }}} PerlModule Apache::DBI PerlRequire /opt/rt3/bin/webmux.pl - # this section applies to Apache 1 only SetHandler perl-script PerlHandler RT::Mason - - # this section applies to Apache2+mod_perl2 only - - SetHandler perl-script - PerlHandler RT::Mason - - - SetHandler perl-script - PerlHandler RT::Mason - - - SetHandler perl-script - PerlHandler RT::Mason - diff --git a/rt/README.Oracle b/rt/README.Oracle new file mode 100644 index 000000000..41bec822c --- /dev/null +++ b/rt/README.Oracle @@ -0,0 +1,37 @@ +In order to install RT with Oracle, the database must first be +prepared. Ports of RT to other databases will automatically create +the RT schema. This is not done for Oracle because most sites wishing +to deploy RT on Oracle will have choose to make specific configuration +of the RT user, for example to select the appropriate tablespace or to +set up a resource profile. The RT user must have appropriate +privileges similar to the resource and connect roles and must have the +"query rewrite" system privilege. + Here is an example of commands to create an RT user called "RT" with +a password of "rt". + + create user rt identified by rt default tablespace users temporary + tablespace temp; + grant resource, connect, query rewrite to rt; + + +RT should not run its schema creation as the Oracle DBA; instead the +schema creation should be run as the RT user. To accomplish this set +the --with-rt-dba configuration parameter to the RT user, not to the +Oracle DBA. As an example, the following might be appropriate to +configure RT for the example.com Oracle database. + + ./configure --prefix /usr/local/rt --with-db-type=Oracle \ + --with-db-dba=rt --with-db-database=example.com \ + --with-db-rt-user=rt \ + --with-db-rt-pass=rt + + +As with all databases it is important to analyze the Schema and get +current statistics after any significant dataset change. Oracle's +cost-based optimizer can provide particularly bad performance when the +schema statistics are significantly inaccurate. To analyze the schema +of a user called rt, execute the following from withing Sqlplus. + + execute dbms_utility.analyze_schema( 'RT', 'estimate'); + + diff --git a/rt/UPGRADING b/rt/UPGRADING new file mode 100644 index 000000000..4306eb6cb --- /dev/null +++ b/rt/UPGRADING @@ -0,0 +1,64 @@ +UPGRADING + + +******* +WARNING +******* + + +Before making any changes to your database, always ensure that you have a +complete current backup. If you don't have a current backup, you could +accidentally damage your database and lose data or worse. + + + +Look for the + + +---------------------------------------------------------------------- + +3.0.7 +===== + +All Databases +------------- + +If you are upgrading from versions between 3.0.0 and 3.0.7, inclusive, +you might find improved performance by adding the following index to +your database: + +CREATE INDEX Links4 ON Links(Type,LocalBase); + + + +3.0.6 +===== + + +All Databases +------------- + +If you are upgrading from versions between 3.0.0 and 3.0.6, inclusive, +you might find improved performance by adding the following indices to +your database: + + CREATE INDEX TicketCustomFieldValues1 ON TicketCustomFieldValues (CustomField,Ticket,Content); + CREATE INDEX TicketCustomFieldValues2 ON TicketCustomFieldValues (CustomField,Ticket); + + CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); + + + +Postgres +-------- + +If you have a Postgres database, the following changes to your +database can improve performance: + + ALTER TABLE groups rename instance to instance1; + ALTER TABLE groups add instance int; + UPDATE groups SET instance = instance1::text::int where btrim(instance1) <> ''; + ALTER TABLE groups drop column instance1; + + + diff --git a/rt/autom4te.cache/output.0 b/rt/autom4te.cache/output.0 index 51a8aaf63..3d27db94f 100644 --- a/rt/autom4te.cache/output.0 +++ b/rt/autom4te.cache/output.0 @@ -1,7 +1,7 @@ @%:@! /bin/sh @%:@ From configure.ac Revision: 1.1 . @%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.53 for RT 3.0.4. +@%:@ Generated by GNU Autoconf 2.53 for RT 3.0.9. @%:@ @%:@ Report bugs to . @%:@ @@ -257,8 +257,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='RT' PACKAGE_TARNAME='rt' -PACKAGE_VERSION='3.0.4' -PACKAGE_STRING='RT 3.0.4' +PACKAGE_VERSION='3.0.9' +PACKAGE_STRING='RT 3.0.9' PACKAGE_BUGREPORT='rt-3.0-bugs@fsck.com' ac_unique_file="lib/RT.pm.in" @@ -711,7 +711,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures RT 3.0.4 to adapt to many kinds of systems. +\`configure' configures RT 3.0.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -768,7 +768,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of RT 3.0.4:";; + short | recursive ) echo "Configuration of RT 3.0.9:";; esac cat <<\_ACEOF @@ -786,8 +786,8 @@ Optional Packages: --with-bin-owner=OWNER user that will own rt binaries (default root) --with-libs-owner=OWNER user that will own RT libraries (default root) --with-libs-group=GROUP group that will own rt binaries (default bin) - --with-db-type=TYPE sort of database RT will use (default: mysql) (mysql - and Pg are valid) + --with-db-type=TYPE sort of database RT will use (default: mysql) + (mysql, Pg, Oracle and Informix are valid) --with-db-host=HOSTNAME FQDN of database server (default: localhost) --with-db-port=PORT port on which the database listens on --with-db-rt-host=HOSTNAME @@ -802,6 +802,7 @@ Optional Packages: password for database user (default: rt_pass) --with-web-user=USER user the web server runs as (default: www) --with-web-group=GROUP group the web server runs as (default: www) + --with-my-user-group set all users and groups to current user/group Some influential environment variables: PERL Perl interpreter command @@ -872,7 +873,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -RT configure 3.0.4 +RT configure 3.0.9 generated by GNU Autoconf 2.53 Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 @@ -887,7 +888,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by RT $as_me 3.0.4, which was +It was created by RT $as_me 3.0.9, which was generated by GNU Autoconf 2.53. Invocation command line was $ $0 $@ @@ -1171,7 +1172,7 @@ rt_version_major=3 rt_version_minor=0 -rt_version_patch=4 +rt_version_patch=9 test "x$rt_version_major" = 'x' && rt_version_major=0 test "x$rt_version_minor" = 'x' && rt_version_minor=0 @@ -1703,13 +1704,21 @@ if test "${with_db_type+set}" = set; then else DB_TYPE=mysql fi; -if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite'; then - { { echo "$as_me:$LINENO: error: Only Pg and mysql are valid db types" >&5 -echo "$as_me: error: Only Pg and mysql are valid db types" >&2;} +if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite' -a "$DB_TYPE" != 'Oracle' -a "$DB_TYPE" != 'Informix' ; then + { { echo "$as_me:$LINENO: error: Only Oracle, Informix, Pg and mysql are valid db types" >&5 +echo "$as_me: error: Only Oracle, Informix, Pg and mysql are valid db types" >&2;} { (exit 1); exit 1; }; } fi +if test "$DB_TYPE" = 'Oracle'; then + test "x$ORACLE_HOME" = 'x' && { { echo "$as_me:$LINENO: error: Please declare the ORACLE_HOME environment variable" >&5 +echo "$as_me: error: Please declare the ORACLE_HOME environment variable" >&2;} + { (exit 1); exit 1; }; } + ORACLE_ENV_PREF="\$ENV{'ORACLE_HOME'} = '$ORACLE_HOME';" +fi + + # Check whether --with-db-host or --without-db-host was given. if test "${with_db_host+set}" = set; then @@ -1800,6 +1809,19 @@ else fi; +my_group=$(groups|cut -f1 -d' ') + +# Check whether --with-my-user-group or --without-my-user-group was given. +if test "${with_my_user_group+set}" = set; then + withval="$with_my_user_group" + RTGROUP=$my_group + BIN_OWNER=$USER + LIBS_OWNER=$USER + LIBS_GROUP=$my_group + WEB_USER=$USER + WEB_GROUP=$my_group +fi; + RT_VERSION_MAJOR=${rt_version_major} @@ -1848,7 +1870,7 @@ RT_LOG_PATH=${exp_logfiledir} -ac_config_files="$ac_config_files sbin/rt-setup-database sbin/rt-test-dependencies Makefile etc/RT_Config.pm lib/RT.pm lib/t/00smoke.t lib/t/01harness.t lib/t/02regression.t lib/t/03web.pl lib/t/04_send_email.pl bin/mason_handler.fcgi bin/mason_handler.scgi bin/mason_handler.svc bin/rt-commit-handler bin/rt-crontool bin/rt-mailgate bin/webmux.pl" +ac_config_files="$ac_config_files sbin/rt-setup-database sbin/rt-test-dependencies Makefile etc/RT_Config.pm lib/RT.pm lib/t/00smoke.t lib/t/01harness.t lib/t/02regression.t lib/t/03web.pl lib/t/04_send_email.pl bin/mason_handler.fcgi bin/mason_handler.scgi bin/mason_handler.svc bin/rt-commit-handler bin/rt-crontool bin/rt-mailgate bin/rt bin/webmux.pl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -2206,7 +2228,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by RT $as_me 3.0.4, which was +This file was extended by RT $as_me 3.0.9, which was generated by GNU Autoconf 2.53. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -2260,7 +2282,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -RT config.status 3.0.4 +RT config.status 3.0.9 configured by $0, generated by GNU Autoconf 2.53, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" @@ -2363,6 +2385,7 @@ do "bin/rt-commit-handler" ) CONFIG_FILES="$CONFIG_FILES bin/rt-commit-handler" ;; "bin/rt-crontool" ) CONFIG_FILES="$CONFIG_FILES bin/rt-crontool" ;; "bin/rt-mailgate" ) CONFIG_FILES="$CONFIG_FILES bin/rt-mailgate" ;; + "bin/rt" ) CONFIG_FILES="$CONFIG_FILES bin/rt" ;; "bin/webmux.pl" ) CONFIG_FILES="$CONFIG_FILES bin/webmux.pl" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} @@ -2487,6 +2510,7 @@ s,@BIN_OWNER@,$BIN_OWNER,;t t s,@LIBS_OWNER@,$LIBS_OWNER,;t t s,@LIBS_GROUP@,$LIBS_GROUP,;t t s,@DB_TYPE@,$DB_TYPE,;t t +s,@ORACLE_ENV_PREF@,$ORACLE_ENV_PREF,;t t s,@DB_HOST@,$DB_HOST,;t t s,@DB_PORT@,$DB_PORT,;t t s,@DB_RT_HOST@,$DB_RT_HOST,;t t diff --git a/rt/autom4te.cache/traces.0 b/rt/autom4te.cache/traces.0 index 962f400e7..f13276211 100644 --- a/rt/autom4te.cache/traces.0 +++ b/rt/autom4te.cache/traces.0 @@ -52,7 +52,7 @@ m4trace:configure.ac:9: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:9: -1- AC_SUBST([LIBS]) m4trace:configure.ac:14: -1- AC_SUBST([rt_version_major], [3]) m4trace:configure.ac:16: -1- AC_SUBST([rt_version_minor], [0]) -m4trace:configure.ac:18: -1- AC_SUBST([rt_version_patch], [4]) +m4trace:configure.ac:18: -1- AC_SUBST([rt_version_patch], [9]) m4trace:configure.ac:24: -1- AC_PROG_INSTALL m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_SCRIPT]) @@ -104,38 +104,39 @@ m4trace:configure.ac:57: -1- AC_SUBST([BIN_OWNER]) m4trace:configure.ac:65: -1- AC_SUBST([LIBS_OWNER]) m4trace:configure.ac:73: -1- AC_SUBST([LIBS_GROUP]) m4trace:configure.ac:84: -1- AC_SUBST([DB_TYPE]) -m4trace:configure.ac:92: -1- AC_SUBST([DB_HOST]) -m4trace:configure.ac:100: -1- AC_SUBST([DB_PORT]) -m4trace:configure.ac:108: -1- AC_SUBST([DB_RT_HOST]) -m4trace:configure.ac:116: -1- AC_SUBST([DB_DBA]) -m4trace:configure.ac:124: -1- AC_SUBST([DB_DATABASE]) -m4trace:configure.ac:132: -1- AC_SUBST([DB_RT_USER]) -m4trace:configure.ac:140: -1- AC_SUBST([DB_RT_PASS]) -m4trace:configure.ac:148: -1- AC_SUBST([WEB_USER]) -m4trace:configure.ac:156: -1- AC_SUBST([WEB_GROUP]) -m4trace:configure.ac:163: -1- AC_SUBST([RT_VERSION_MAJOR], [${rt_version_major}]) -m4trace:configure.ac:164: -1- AC_SUBST([RT_VERSION_MINOR], [${rt_version_minor}]) -m4trace:configure.ac:165: -1- AC_SUBST([RT_VERSION_PATCH], [${rt_version_patch}]) -m4trace:configure.ac:168: -1- AC_SUBST([RT_PATH], [${exp_prefix}]) -m4trace:configure.ac:169: -1- AC_SUBST([RT_DOC_PATH], [${exp_manualdir}]) -m4trace:configure.ac:170: -1- AC_SUBST([RT_LOCAL_PATH], [${exp_customdir}]) -m4trace:configure.ac:171: -1- AC_SUBST([RT_LIB_PATH], [${exp_libdir}]) -m4trace:configure.ac:172: -1- AC_SUBST([RT_ETC_PATH], [${exp_sysconfdir}]) -m4trace:configure.ac:173: -1- AC_SUBST([CONFIG_FILE_PATH], [${exp_sysconfdir}]) -m4trace:configure.ac:174: -1- AC_SUBST([RT_BIN_PATH], [${exp_bindir}]) -m4trace:configure.ac:175: -1- AC_SUBST([RT_SBIN_PATH], [${exp_sbindir}]) -m4trace:configure.ac:176: -1- AC_SUBST([RT_VAR_PATH], [${exp_localstatedir}]) -m4trace:configure.ac:177: -1- AC_SUBST([RT_MAN_PATH], [${exp_mandir}]) -m4trace:configure.ac:178: -1- AC_SUBST([MASON_DATA_PATH], [${exp_masonstatedir}]) -m4trace:configure.ac:179: -1- AC_SUBST([MASON_SESSION_PATH], [${exp_sessionstatedir}]) -m4trace:configure.ac:180: -1- AC_SUBST([MASON_HTML_PATH], [${exp_htmldir}]) -m4trace:configure.ac:181: -1- AC_SUBST([LOCAL_ETC_PATH], [${exp_custometcdir}]) -m4trace:configure.ac:182: -1- AC_SUBST([MASON_LOCAL_HTML_PATH], [${exp_customhtmldir}]) -m4trace:configure.ac:183: -1- AC_SUBST([LOCAL_LEXICON_PATH], [${exp_customlexdir}]) -m4trace:configure.ac:184: -1- AC_SUBST([LOCAL_LIB_PATH], [${exp_customlibdir}]) -m4trace:configure.ac:185: -1- AC_SUBST([DESTDIR], [${exp_prefix}]) -m4trace:configure.ac:186: -1- AC_SUBST([RT_LOG_PATH], [${exp_logfiledir}]) -m4trace:configure.ac:208: -1- AC_CONFIG_FILES([ +m4trace:configure.ac:91: -1- AC_SUBST([ORACLE_ENV_PREF]) +m4trace:configure.ac:99: -1- AC_SUBST([DB_HOST]) +m4trace:configure.ac:107: -1- AC_SUBST([DB_PORT]) +m4trace:configure.ac:115: -1- AC_SUBST([DB_RT_HOST]) +m4trace:configure.ac:123: -1- AC_SUBST([DB_DBA]) +m4trace:configure.ac:131: -1- AC_SUBST([DB_DATABASE]) +m4trace:configure.ac:139: -1- AC_SUBST([DB_RT_USER]) +m4trace:configure.ac:147: -1- AC_SUBST([DB_RT_PASS]) +m4trace:configure.ac:155: -1- AC_SUBST([WEB_USER]) +m4trace:configure.ac:163: -1- AC_SUBST([WEB_GROUP]) +m4trace:configure.ac:182: -1- AC_SUBST([RT_VERSION_MAJOR], [${rt_version_major}]) +m4trace:configure.ac:183: -1- AC_SUBST([RT_VERSION_MINOR], [${rt_version_minor}]) +m4trace:configure.ac:184: -1- AC_SUBST([RT_VERSION_PATCH], [${rt_version_patch}]) +m4trace:configure.ac:187: -1- AC_SUBST([RT_PATH], [${exp_prefix}]) +m4trace:configure.ac:188: -1- AC_SUBST([RT_DOC_PATH], [${exp_manualdir}]) +m4trace:configure.ac:189: -1- AC_SUBST([RT_LOCAL_PATH], [${exp_customdir}]) +m4trace:configure.ac:190: -1- AC_SUBST([RT_LIB_PATH], [${exp_libdir}]) +m4trace:configure.ac:191: -1- AC_SUBST([RT_ETC_PATH], [${exp_sysconfdir}]) +m4trace:configure.ac:192: -1- AC_SUBST([CONFIG_FILE_PATH], [${exp_sysconfdir}]) +m4trace:configure.ac:193: -1- AC_SUBST([RT_BIN_PATH], [${exp_bindir}]) +m4trace:configure.ac:194: -1- AC_SUBST([RT_SBIN_PATH], [${exp_sbindir}]) +m4trace:configure.ac:195: -1- AC_SUBST([RT_VAR_PATH], [${exp_localstatedir}]) +m4trace:configure.ac:196: -1- AC_SUBST([RT_MAN_PATH], [${exp_mandir}]) +m4trace:configure.ac:197: -1- AC_SUBST([MASON_DATA_PATH], [${exp_masonstatedir}]) +m4trace:configure.ac:198: -1- AC_SUBST([MASON_SESSION_PATH], [${exp_sessionstatedir}]) +m4trace:configure.ac:199: -1- AC_SUBST([MASON_HTML_PATH], [${exp_htmldir}]) +m4trace:configure.ac:200: -1- AC_SUBST([LOCAL_ETC_PATH], [${exp_custometcdir}]) +m4trace:configure.ac:201: -1- AC_SUBST([MASON_LOCAL_HTML_PATH], [${exp_customhtmldir}]) +m4trace:configure.ac:202: -1- AC_SUBST([LOCAL_LEXICON_PATH], [${exp_customlexdir}]) +m4trace:configure.ac:203: -1- AC_SUBST([LOCAL_LIB_PATH], [${exp_customlibdir}]) +m4trace:configure.ac:204: -1- AC_SUBST([DESTDIR], [${exp_prefix}]) +m4trace:configure.ac:205: -1- AC_SUBST([RT_LOG_PATH], [${exp_logfiledir}]) +m4trace:configure.ac:228: -1- AC_CONFIG_FILES([ sbin/rt-setup-database sbin/rt-test-dependencies Makefile @@ -152,5 +153,6 @@ m4trace:configure.ac:208: -1- AC_CONFIG_FILES([ bin/rt-commit-handler bin/rt-crontool bin/rt-mailgate + bin/rt bin/webmux.pl ]) diff --git a/rt/bin/mason_handler.fcgi b/rt/bin/mason_handler.fcgi index 431eccbd3..93d1f8855 100755 --- a/rt/bin/mason_handler.fcgi +++ b/rt/bin/mason_handler.fcgi @@ -27,7 +27,7 @@ use strict; use File::Basename; require ('/opt/rt3/bin/webmux.pl'); -my $h = &RT::Interface::Web::NewCGIHandler(); +my $h = &RT::Interface::Web::NewCGIHandler(@RT::MasonParameters); # Enter CGI::Fast mode, which should also work as a vanilla CGI script. require CGI::Fast; @@ -44,11 +44,25 @@ while ( my $cgi = CGI::Fast->new ) { $ENV{'ENV'} = '' if defined $ENV{'ENV'}; $ENV{'IFS'} = '' if defined $ENV{'IFS'}; - unless ($h->interp->comp_exists($cgi->path_info)) { - $cgi->path_info($cgi->path_info . "/index.html"); + RT::ConnectToDatabase(); + + if ( ( !$h->interp->comp_exists( $cgi->path_info ) ) + && ( $h->interp->comp_exists( $cgi->path_info . "/index.html" ) ) ) { + $cgi->path_info( $cgi->path_info . "/index.html" ); + } + + eval { $h->handle_cgi_object($cgi); }; + if ($@) { + $RT::Logger->crit($@); + } + + + if ($RT::Handle->TransactionDepth) { + $RT::Handle->ForceRollback; + $RT::Logger->crit("Transaction not committed. Usually indicates a software fault. Data loss may have occurred") ; } - $h->handle_cgi_object($cgi); - # _should_ always be tied + + } 1; diff --git a/rt/bin/mason_handler.fcgi.in b/rt/bin/mason_handler.fcgi.in index e932bfc29..a009663b9 100644 --- a/rt/bin/mason_handler.fcgi.in +++ b/rt/bin/mason_handler.fcgi.in @@ -27,7 +27,7 @@ use strict; use File::Basename; require ('@RT_BIN_PATH@/webmux.pl'); -my $h = &RT::Interface::Web::NewCGIHandler(); +my $h = &RT::Interface::Web::NewCGIHandler(@RT::MasonParameters); # Enter CGI::Fast mode, which should also work as a vanilla CGI script. require CGI::Fast; @@ -44,11 +44,25 @@ while ( my $cgi = CGI::Fast->new ) { $ENV{'ENV'} = '' if defined $ENV{'ENV'}; $ENV{'IFS'} = '' if defined $ENV{'IFS'}; - unless ($h->interp->comp_exists($cgi->path_info)) { - $cgi->path_info($cgi->path_info . "/index.html"); + RT::ConnectToDatabase(); + + if ( ( !$h->interp->comp_exists( $cgi->path_info ) ) + && ( $h->interp->comp_exists( $cgi->path_info . "/index.html" ) ) ) { + $cgi->path_info( $cgi->path_info . "/index.html" ); + } + + eval { $h->handle_cgi_object($cgi); }; + if ($@) { + $RT::Logger->crit($@); + } + + + if ($RT::Handle->TransactionDepth) { + $RT::Handle->ForceRollback; + $RT::Logger->crit("Transaction not committed. Usually indicates a software fault. Data loss may have occurred") ; } - $h->handle_cgi_object($cgi); - # _should_ always be tied + + } 1; diff --git a/rt/bin/mason_handler.scgi b/rt/bin/mason_handler.scgi index 8e1135c2f..7774189ee 100755 --- a/rt/bin/mason_handler.scgi +++ b/rt/bin/mason_handler.scgi @@ -26,16 +26,18 @@ use strict; require ('/opt/rt3/bin/webmux.pl'); -my $h = &RT::Interface::Web::NewCGIHandler(); +my $h = &RT::Interface::Web::NewCGIHandler(@RT::MasonParameters); require CGI; RT::Init(); my $cgi = CGI->new; -unless ($h->interp->comp_exists($cgi->path_info)) { - $cgi->path_info($cgi->path_info . "/index.html"); +if ( ( !$h->interp->comp_exists( $cgi->path_info ) ) + && ( $h->interp->comp_exists( $cgi->path_info . "/index.html" ) ) ) { + $cgi->path_info( $cgi->path_info . "/index.html" ); } + $h->handle_cgi_object($cgi); 1; diff --git a/rt/bin/mason_handler.scgi.in b/rt/bin/mason_handler.scgi.in index 37d8380c2..614d4d47a 100644 --- a/rt/bin/mason_handler.scgi.in +++ b/rt/bin/mason_handler.scgi.in @@ -26,16 +26,18 @@ use strict; require ('@RT_BIN_PATH@/webmux.pl'); -my $h = &RT::Interface::Web::NewCGIHandler(); +my $h = &RT::Interface::Web::NewCGIHandler(@RT::MasonParameters); require CGI; RT::Init(); my $cgi = CGI->new; -unless ($h->interp->comp_exists($cgi->path_info)) { - $cgi->path_info($cgi->path_info . "/index.html"); +if ( ( !$h->interp->comp_exists( $cgi->path_info ) ) + && ( $h->interp->comp_exists( $cgi->path_info . "/index.html" ) ) ) { + $cgi->path_info( $cgi->path_info . "/index.html" ); } + $h->handle_cgi_object($cgi); 1; diff --git a/rt/bin/mason_handler.svc b/rt/bin/mason_handler.svc index e6d83784c..c05d21e69 100644 --- a/rt/bin/mason_handler.svc +++ b/rt/bin/mason_handler.svc @@ -197,7 +197,7 @@ BEGIN { warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n"; require CGI::Fast; -my $h = &RT::Interface::Web::NewCGIHandler(); +my $h = &RT::Interface::Web::NewCGIHandler(@RT::MasonParameters); RT::Init(); diff --git a/rt/bin/mason_handler.svc.in b/rt/bin/mason_handler.svc.in index cc12c0ef0..0ba1f51b5 100644 --- a/rt/bin/mason_handler.svc.in +++ b/rt/bin/mason_handler.svc.in @@ -197,7 +197,7 @@ BEGIN { warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n"; require CGI::Fast; -my $h = &RT::Interface::Web::NewCGIHandler(); +my $h = &RT::Interface::Web::NewCGIHandler(@RT::MasonParameters); RT::Init(); diff --git a/rt/bin/rt b/rt/bin/rt index 41220bb56..d9f8a3f05 100755 --- a/rt/bin/rt +++ b/rt/bin/rt @@ -1,1391 +1,1816 @@ -#!!!PERL!! -w -# -# $Header: /home/cvs/cvsroot/freeside/rt/bin/Attic/rt,v 1.1 2002-08-12 06:17:07 ivan Exp $ -# RT is (c) 1996-2001 Jesse Vincent +#!/usr/bin/perl -w +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work 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. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK use strict; -use Carp; -use Getopt::Long; -use lib "!!RT_LIB_PATH!!"; -use lib "!!RT_ETC_PATH!!"; +# This program is intentionally written to have as few non-core module +# dependencies as possible. It should stay that way. + +use Cwd; +use LWP; +use HTTP::Request::Common; + +# We derive configuration information from hardwired defaults, dotfiles, +# and the RT* environment variables (in increasing order of precedence). +# Session information is stored in ~/.rt_sessions. + +my $VERSION = 0.02; +my $HOME = eval{(getpwuid($<))[7]} + || $ENV{HOME} || $ENV{LOGDIR} || $ENV{HOMEPATH} + || "."; +my %config = ( + ( + debug => 0, + user => eval{(getpwuid($<))[0]} || $ENV{USER} || $ENV{USERNAME}, + passwd => undef, + server => 'http://localhost/rt/', + ), + config_from_file($ENV{RTCONFIG} || ".rtrc"), + config_from_env() +); +my $session = new Session("$HOME/.rt_sessions"); +my $REST = "$config{server}/REST/1.0"; + +sub whine; +sub DEBUG { warn @_ if $config{debug} >= shift } + +# These regexes are used by command handlers to parse arguments. +# (XXX: Ask Autrijus how i18n changes these definitions.) + +my $name = '[\w.-]+'; +my $field = '[a-zA-Z][a-zA-Z0-9_-]*'; +my $label = '[a-zA-Z0-9@_.+-]+'; +my $labels = "(?:$label,)*$label"; +my $idlist = '(?:(?:\d+-)?\d+,)*(?:\d+-)?\d+'; + +# Our command line looks like this: +# +# rt [options] [arguments] +# +# We'll parse just enough of it to decide upon an action to perform, and +# leave the rest to per-action handlers to interpret appropriately. + +my %handlers = ( +# handler => [ ...aliases... ], + version => ["version", "ver"], + logout => ["logout"], + help => ["help", "man"], + show => ["show", "cat"], + edit => ["create", "edit", "new", "ed"], + list => ["search", "list", "ls"], + comment => ["comment", "correspond"], + link => ["link", "ln"], + merge => ["merge"], + grant => ["grant", "revoke"], +); + +# Once we find and call an appropriate handler, we're done. + +my (%actions, $action); +foreach my $fn (keys %handlers) { + foreach my $alias (@{ $handlers{$fn} }) { + $actions{$alias} = \&{"$fn"}; + } +} +if (@ARGV && exists $actions{$ARGV[0]}) { + $action = shift @ARGV; +} +$actions{$action || "help"}->($action || ()); +exit; -use RT::Interface::CLI qw(CleanEnv LoadConfig DBConnect - GetCurrentUser GetMessageContent); +# Handler functions. +# ------------------ +# +# The following subs are handlers for each entry in %actions. -#Clean out all the nasties from the environment -CleanEnv(); +sub version { + print "rt $VERSION\n"; +} -#Load etc/config.pm and drop privs -LoadConfig(); +sub logout { + submit("$REST/logout") if defined $session->cookie; +} -#Connect to the database and get RT::SystemUser and RT::Nobody loaded -DBConnect(); +sub help { + my ($action, $type) = @_; + my (%help, $key); -#Drop setgid permissions -RT::DropSetGIDPermissions(); + # What help topics do we know about? + local $/ = undef; + foreach my $item (@{ Form::parse() }) { + my $title = $item->[2]{Title}; + my @titles = ref $title eq 'ARRAY' ? @$title : $title; -#Get the current user all loaded -my $CurrentUser = GetCurrentUser(); + foreach $title (grep $_, @titles) { + $help{$title} = $item->[2]{Text}; + } + } -unless ($CurrentUser->Id) { - print "No RT user found. Please consult your RT administrator.\n"; - exit(1); + # What does the user want help with? + undef $action if ($action && $actions{$action} eq \&help); + unless ($action || $type) { + # If we don't know, we'll look for clues in @ARGV. + foreach (@ARGV) { + if (exists $help{$_}) { $key = $_; last; } + } + unless ($key) { + # Tolerate possibly plural words. + foreach (@ARGV) { + if ($_ =~ s/s$// && exists $help{$_}) { $key = $_; last; } + } + } + } + + if ($type && $action) { + $key = "$type.$action"; + } + $key ||= $type || $action || "introduction"; + + # Find a suitable topic to display. + while (!exists $help{$key}) { + if ($type && $action) { + if ($key eq "$type.$action") { $key = $action; } + elsif ($key eq $action) { $key = $type; } + else { $key = "introduction"; } + } + else { + $key = "introduction"; + } + } + + print STDERR $help{$key}, "\n\n"; } +# Displays a list of objects that match some specified condition. -# {{{ commandline flags - -my ( @id, - @limit_queue, - @limit_status, - @limit_owner, - @limit_priority, - @limit_final_priority, - @limit_requestor, - @limit_subject, - @limit_body, - @limit_created, - @limit_resolved, - @limit_lastupdated, - @limit_dependson, - @limit_dependedonby, - @limit_memberof, - @limit_hasmember, - @limit_refersto, - @limit_referredtoby, - @limit_keyword, - - @limit_due, - @limit_starts, - @limit_started, - $limit_first, - $limit_rows, - $history, - $summary, - $create, - @requestors, - @cc, - @admincc, - $status, - $subject, - $owner, - $steal, - $queue, - $time_left, - $priority, - $final_priority, - $due, - $starts, - $started, - $contacted, - $comment, - $reply, - $source, - $edit, - @dependson, - @memberof, - @refersto, - $mergeinto, - @keywords, - $time_taken, - $verbose, - $debug, - $help, - $version); - -# }}} - -# Set defaults for cli args - -$edit = 1; # Assume the user wants to edit replies and comments - # unless they specify --noedit - -# {{{ args - -my @args =("id=s" => \@id, - "limit-queue=s" => \@limit_queue, - "limit-status=s" => \@limit_status, - "limit-owner=s" => \@limit_owner, - "limit-priority=s" => \@limit_priority, - "limit-final-priority=s" => \@limit_final_priority, - "limit-requestor=s" => \@limit_requestor, - "limit-subject=s" => \@limit_subject, - "limit-body=s", \@limit_body, - "limit-created=s" => \@limit_created, - "limit-due=s" => \@limit_due, - "limit-last-updated=s" => \@limit_lastupdated, - "limit-keyword=s" => \@limit_keyword, - - "limit-member-of=s" => \@limit_memberof, - "limit-has-member=s" => \@limit_hasmember, - "limit-depended-on-by=s" => \@limit_dependedonby, - "limit-depends-on=s" => \@limit_dependson, - "limit-referred-to-by=s" => \@limit_referredtoby, - "limit-refers-to=s" => \@limit_refersto, - - "limit-starts=s" => \@limit_starts, - "limit-started=s" => \@limit_started, - "limit-first=i" => \$limit_first, - "limit-rows=i" => \$limit_rows, - "history|show" => \$history, - "summary:s" => \$summary, - "create" => \$create, - "keywords=s" => \@keywords, - "requestor|requestors=s" => \@requestors, - "cc=s" => \@cc, - "admincc=s" => \@admincc, - "status=s" => \$status, - "subject=s" => \$subject, - "owner=s" => \$owner, - "steal" => \$steal, - "queue=s" => \$queue, - - - "priority=i" => \$priority, - "final-priority=i" => \$final_priority, - "due=s" => \$due, - "starts=s" => \$starts, - "started=s" => \$started, - "contacted=s" => \$contacted, - "comment", \$comment, - "reply|respond", \$reply, - "source=s" => \$source, - "edit!" => \$edit, - "depends-on=s" => \@dependson, - "member-of=s" => \@memberof, - "merge-into=s" => \$mergeinto, - "refers-to=s" => \@refersto, - "time-left=i" => \$time_left, - "time-taken=i" => \$time_taken, - "verbose+" => \$verbose, - "debug" => \$debug, - "version" => \$version, - "help|h|usage" => \$help - ); - -# }}} - - - -GetOptions(@args); - -print join(':',@keywords); -# {{{ If they want it, print a usage message and get out - -if ($help) { - - -print < - --limit-status=[!](new|open|stalled|resolved) - - --limit-owner=[!] - --limit-priority=[starts][-][ends] - --limit-final-priority=[starts][-][ends] - starts is less than ends - --limit-requestor=[!]| - --limit-subject=[!] - --limit-body=[!] - --limit-keyword=[!] diff --git a/rt/html/Admin/Elements/EditCustomFieldValues b/rt/html/Admin/Elements/EditCustomFieldValues index 64564adfb..2c9e6d082 100644 --- a/rt/html/Admin/Elements/EditCustomFieldValues +++ b/rt/html/Admin/Elements/EditCustomFieldValues @@ -25,7 +25,7 @@
    % while (my $v = $values->Next) {
  • -<%$v->SortOrder%>: + <%$v->Name%> % if ($v->Description) { diff --git a/rt/html/Admin/Elements/EditCustomFields b/rt/html/Admin/Elements/EditCustomFields index a86b051d0..81c984d29 100644 --- a/rt/html/Admin/Elements/EditCustomFields +++ b/rt/html/Admin/Elements/EditCustomFields @@ -26,44 +26,43 @@
    -<%$caption%>:
    +

    <%$caption%>

    % if ($CustomFields->Count == 0 ) {

    <&|/l&>(No custom fields)

    % } else { - - - - - +
    -
      -% while (my $CustomFieldObj = $CustomFields->Next) { -
    • <%$CustomFieldObj->Name%> (<% $CustomFieldObj->FriendlyType %>)
      -<%$CustomFieldObj->Description%> -
    • -% } -
    -
    % my $count; % while (my $CustomFieldObj = $CustomFields->Next) { + + + % # show 'move up' unless it's the first item % if ($count++) { - -% } - +% } +
    +% if ($CustomFieldObj->Name) { + <%$CustomFieldObj->Name%>
    +% } else { + (<%loc("no name")%>)
    +% } + <%$CustomFieldObj->Description%> +
    + <% $CustomFieldObj->FriendlyType %> +
    -<&|/l&>Move up + + <&|/l&>Move up % } else { - + % } % # show 'move down' unless it's the last item % if (!$CustomFields->IsLast) { % $m->print(' | ') if $count > 1; -<&|/l&>Move down + <&|/l&>Move down % } -
    % }
    diff --git a/rt/html/Admin/Elements/EditScrip b/rt/html/Admin/Elements/EditScrip index 5393ebfde..1f186c233 100644 --- a/rt/html/Admin/Elements/EditScrip +++ b/rt/html/Admin/Elements/EditScrip @@ -77,6 +77,14 @@ +<&|/l&>Stage: + + +<& /Admin/Elements/SelectStage, Name => "Scrip-$id-Stage", Default => $scrip->Stage &> + + + + <&|/l&>Template: @@ -123,6 +131,7 @@ elsif ($id) { ScripAction ScripCondition Template + Stage Description CustomPrepareCode CustomCommitCode diff --git a/rt/html/Admin/Elements/EditScrips b/rt/html/Admin/Elements/EditScrips index 24515d8c1..07a57f47b 100644 --- a/rt/html/Admin/Elements/EditScrips +++ b/rt/html/Admin/Elements/EditScrips @@ -48,7 +48,9 @@ % } -<& /Elements/Submit &> +<& /Elements/Submit, + Caption => loc("Delete selected scrips"), + Label => loc("Delete") &>
    <%init> my (@actions); diff --git a/rt/html/Admin/Elements/SelectGroups b/rt/html/Admin/Elements/SelectGroups index 5df49ad04..3cc909b29 100644 --- a/rt/html/Admin/Elements/SelectGroups +++ b/rt/html/Admin/Elements/SelectGroups @@ -29,9 +29,10 @@ <%INIT> my $groups = new RT::Groups($session{'CurrentUser'}); -$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'System'); +$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => $Domain); <%ARGS> $Name => 'groups' +$Domain => 'UserDefined'; diff --git a/rt/html/Admin/Elements/SelectRights b/rt/html/Admin/Elements/SelectRights index 37a06dc4d..8d87ac9a1 100644 --- a/rt/html/Admin/Elements/SelectRights +++ b/rt/html/Admin/Elements/SelectRights @@ -24,7 +24,7 @@ - @@ -46,7 +46,7 @@ -<& /Ticket/Elements/ShowHistory, Ticket => $Ticket&> +<& /Ticket/Elements/ShowHistory, Ticket => $Ticket, AttachPath => "Attachment" &> @@ -101,6 +101,12 @@ if ( $id[0] eq 'new' ) { push ( @results, $ErrMsg ); # }}} + +# delete temporary storage entry to make WebUI clean +unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) { + delete $session{'Attachments'}; +} +# }}} } else { unless ( $Ticket->Load( $id[0] ) ) { @@ -127,10 +133,43 @@ if ( ( defined $ARGS{'Status'} ) push @results, "$msg"; } +# {{{ store the uploaded attachment in session +if ($ARGS{'Attach'}) { # attachment? + $session{'Attachments'} = {} unless defined $session{'Attachments'}; + + my $subject = "$ARGS{'Attach'}"; + # since CGI.pm deutf8izes the magic field, we need to add it back. + Encode::_utf8_on($subject); + # strip leading directories + $subject =~ s#^.*[\\/]##; + + my $attachment = MakeMIMEEntity( + Subject => $subject, + Body => "", + AttachmentFieldName => 'Attach' + ); + + $session{'Attachments'} = { %{$session{'Attachments'} || {}}, + $ARGS{'Attach'} => $attachment }; +} +# }}} + +if ( $session{'Attachments'} || + ( $ARGS{'UpdateContent'} ne '' + && $ARGS{'UpdateContent'} ne "-- \n" + . $session{'CurrentUser'}->UserObj->Signature )) { + $ARGS{UpdateAttachments} = $session{'Attachments'}; +} ProcessUpdateMessage( ARGSRef => \%ARGS, Actions => \@results, TicketObj => $Ticket ); +# delete temporary storage entry to make WebUI clean +unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) { + delete $session{'Attachments'}; +} +# }}} + my $Transactions = $Ticket->Transactions; diff --git a/rt/html/SelfService/Elements/MyRequests b/rt/html/SelfService/Elements/MyRequests index 95ede0811..839359aed 100644 --- a/rt/html/SelfService/Elements/MyRequests +++ b/rt/html/SelfService/Elements/MyRequests @@ -49,6 +49,7 @@ $title ||= loc("My [_1] tickets", $friendly_status); my $MyTickets; $MyTickets = new RT::Tickets ($session{'CurrentUser'}); $MyTickets->LimitWatcher(TYPE => 'Requestor', VALUE => $session{'CurrentUser'}->EmailAddress); +$MyTickets->OrderBy(FIELD => 'id', ORDER => 'ASC'); foreach my $status (@status) { diff --git a/rt/html/SelfService/Update.html b/rt/html/SelfService/Update.html index 9ff31775f..9444aa706 100644 --- a/rt/html/SelfService/Update.html +++ b/rt/html/SelfService/Update.html @@ -29,7 +29,24 @@ <&|/l&>Status: <& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &>
    <&|/l&>Subject:
    -<&|/l&>Attach:
    +
    +

    <&|/l&>Current rights

    % if ($ACLObj->Count() > 0) { (<&|/l&>Check box to revoke right)
    @@ -71,6 +71,7 @@ $ACLObj->LimitToObject( $Object); $ACLObj->LimitToPrincipal( Id => $PrincipalId); + $ACLObj->OrderBy(FIELD=>'RightName'); if (ref($Object) && UNIVERSAL::can($Object, 'AvailableRights')) { %Rights = %{$Object->AvailableRights}; diff --git a/rt/html/Admin/Elements/SelectStage b/rt/html/Admin/Elements/SelectStage new file mode 100644 index 000000000..b62964be4 --- /dev/null +++ b/rt/html/Admin/Elements/SelectStage @@ -0,0 +1,39 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK + <&|/l&>Include disabled queues in listing.
    diff --git a/rt/html/Admin/Users/Modify.html b/rt/html/Admin/Users/Modify.html index 370c2e82d..b424ae961 100644 --- a/rt/html/Admin/Users/Modify.html +++ b/rt/html/Admin/Users/Modify.html @@ -224,9 +224,11 @@ else { } else { push @results, loc('User could not be created: [_1]', $msg); } - - } - else { + + # set the id, so the the menu will have the right info + $id = $UserObj->Id; + + } else { $UserObj->Load($id) || $UserObj->Load($Name) || Abort("Couldn't load user '$Name'"); $val = $UserObj->Id(); } diff --git a/rt/html/Admin/Users/index.html b/rt/html/Admin/Users/index.html index a95d4117d..7dc9af6c3 100644 --- a/rt/html/Admin/Users/index.html +++ b/rt/html/Admin/Users/index.html @@ -40,7 +40,7 @@

    -
    + <&|/l&>Find people whose <& /Elements/SelectUsers &>
    <&|/l&>Include disabled users in search. diff --git a/rt/html/Approvals/Display.html b/rt/html/Approvals/Display.html index 921c1e38f..6a265e242 100644 --- a/rt/html/Approvals/Display.html +++ b/rt/html/Approvals/Display.html @@ -26,7 +26,7 @@ <& Elements/Tabs, current_tab => "Approvals/Display.html", Title => $title &> - + <& /Elements/TitleBoxStart, title => $title &> <& /Ticket/Elements/ShowHistory , Ticket => $Ticket, Collapsed => 0, ShowTitle => 0, ShowHeaders => 0, ShowDisplayModes => 0, ShowTitleBarCommands => 0 &> diff --git a/rt/html/Elements/Callback b/rt/html/Elements/Callback index 93ac4c01b..79157e751 100644 --- a/rt/html/Elements/Callback +++ b/rt/html/Elements/Callback @@ -54,10 +54,11 @@ if (!$callbacks) { $cache{$Page,$_CallbackName} = $callbacks; } -foreach my $comp (@$callbacks) { - $m->comp($comp, %ARGS) if $m->comp_exists($comp); +my @rv; +foreach my $comp (sort @$callbacks) { + push @rv, $m->comp($comp, %ARGS) if $m->comp_exists($comp); } -return(1); +return @rv; <%args> $_CallbackName => 'Default' diff --git a/rt/html/Elements/MessageBox b/rt/html/Elements/MessageBox index 64fdf38b7..32f422206 100644 --- a/rt/html/Elements/MessageBox +++ b/rt/html/Elements/MessageBox @@ -21,7 +21,7 @@ %# %# %# END LICENSE BLOCK - + <%INIT> my ($message); @@ -42,6 +42,8 @@ if ($session{'CurrentUser'}->UserObj->Signature) { $QuoteTransaction => undef $Name => 'Content' $Default => '' -$Width => 72 +$Width => $RT::MessageBoxWidth +$Wrap => $RT::MessageBoxWrap +$IncludeSignature => 1 diff --git a/rt/html/Elements/MyTickets b/rt/html/Elements/MyTickets index 6e2ddc6c3..52dae3b8d 100644 --- a/rt/html/Elements/MyTickets +++ b/rt/html/Elements/MyTickets @@ -69,7 +69,7 @@ <%INIT> -my $rows = 10; +my $rows = $RT::MyTicketsLength; my $MyTickets; $MyTickets = new RT::Tickets ($session{'CurrentUser'}); $MyTickets->LimitOwner(VALUE => $session{'CurrentUser'}->Id); diff --git a/rt/html/Elements/SelectLang b/rt/html/Elements/SelectLang new file mode 100644 index 000000000..cc2c357e0 --- /dev/null +++ b/rt/html/Elements/SelectLang @@ -0,0 +1,56 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK + +<%ARGS> +$ShowNullOption => 1 +$ShowAllQueues => 1 +$Name => undef +$Verbose => undef +$Default => 0 +$Lite => 0 + + +<%ONCE> +use I18N::LangTags::List; +my (@lang, %lang_to_desc); +foreach my $lang (map { s/:://; s/_/-/g; $_ } grep { /^\w+::$/ } keys %RT::I18N::) { + next if $lang =~ /i-default|en-us/; + my $desc = I18N::LangTags::List::name($lang); + next unless ($desc); + $desc =~ s/(.*) (.*)/$2 ($1)/; + $lang_to_desc{$lang} = $desc; +} +@lang = sort { $lang_to_desc{$a} cmp $lang_to_desc{$b} } keys %lang_to_desc; + diff --git a/rt/html/Elements/SelectStatus b/rt/html/Elements/SelectStatus index 2c1ffad39..16a5f2995 100644 --- a/rt/html/Elements/SelectStatus +++ b/rt/html/Elements/SelectStatus @@ -24,6 +24,7 @@ @@ -34,4 +35,5 @@ my @status = $queue->StatusArray(); <%ARGS> $Name => undef $Default => undef +$SkipDeleted => 0 diff --git a/rt/html/Elements/SelectWatcherType b/rt/html/Elements/SelectWatcherType index 26de8f7b9..82aab2a85 100644 --- a/rt/html/Elements/SelectWatcherType +++ b/rt/html/Elements/SelectWatcherType @@ -22,7 +22,9 @@ %# %# END LICENSE BLOCK +   diff --git a/rt/html/NoAuth/webrt.css b/rt/html/NoAuth/webrt.css index 62c6d66ba..159e79cd6 100644 --- a/rt/html/NoAuth/webrt.css +++ b/rt/html/NoAuth/webrt.css @@ -331,7 +331,9 @@ ul.topnav { margin-bottom:0; } - +<%flags> +inherit => undef + <%init> $r->content_type('text/css'); $r->header_out('Expires' ,'+30m'); diff --git a/rt/html/REST/1.0/Forms/queue/default b/rt/html/REST/1.0/Forms/queue/default new file mode 100644 index 000000000..ce5408846 --- /dev/null +++ b/rt/html/REST/1.0/Forms/queue/default @@ -0,0 +1,123 @@ +%# REST/1.0/Forms/queue/default +%# +<%ARGS> +$id +$format => 's' +$changes => {} + +<%perl> +my @comments; +my ($c, $o, $k, $e) = ("", [], {}, 0); +my %data = %$changes; +my $queue = new RT::Queue $session{CurrentUser}; +my @fields = qw(Name Description CorrespondAddress CommentAddress + InitialPriority FinalPriority DefaultDueIn); +my %fields = map { lc $_ => $_ } @fields; + +if ($id ne 'new') { + $queue->Load($id); + if (!$queue->Id) { + return [ "# Queue $id does not exist.", [], {}, 1 ]; + } +} +else { + if (%data == 0) { + return [ + "# Required: Name", + [ "id", @fields ], + { + id => 'queue/new', + Name => '', + Description => "", + CommentAddress => "", + CorrespondAddress => "", + InitialPriority => "", + FinalPriority => "", + DefaultDueIn => "", + }, + 0 + ]; + } + else { + my %v; + my %create = %fields; + + foreach my $k (keys %data) { + if (exists $create{lc $k}) { + $v{$create{lc $k}} = delete $data{$k}; + } + } + + if ($v{Name} eq '') { + my %o = keys %$changes; + delete @o{"id", @fields}; + return [ + "# Please set the queue name.", + [ "id", @fields, keys %o ], $changes, 1 + ]; + } + + $queue->Create(%v); + unless ($queue->Id) { + return [ "# Could not create queue.", [], {}, 1 ]; + } + + delete $data{id}; + $id = $queue->Id; + push(@comments, "# Queue $id created."); + goto DONE if %data == 0; + } +} + +if (%data == 0) { + my @data; + + push @data, [ id => "queue/".$queue->Id ]; + foreach my $key (@fields) { + push @data, [ $key => $queue->$key ]; + } + + my %k = map {@$_} @data; + $o = [ map {$_->[0]} @data ]; + $k = \%k; +} +else { + my ($get, $set, $key, $val, $n, $s); + + foreach $key (keys %data) { + $val = $data{$key}; + $key = lc $key; + $n = 1; + + if (exists $fields{$key}) { + $key = $fields{$key}; + $set = "Set$key"; + + next if $val eq $queue->$key; + ($n, $s) = $queue->$set($val); + } + elsif ($key ne 'id') { + $n = 0; + $s = "Unknown field."; + } + + SET: + if ($n == 0) { + $e = 1; + push @comments, "# $key: $s"; + unless (@$o) { + my %o = keys %$changes; + delete @o{"id", @fields}; + @$o = ("id", @fields, keys %o); + $k = $changes; + } + } + } + + push(@comments, "# Queue $id updated.") unless $n == 0; +} + +DONE: +$c ||= join("\n", @comments) if @comments; +return [ $c, $o, $k, $e ]; + diff --git a/rt/html/REST/1.0/Forms/queue/ns b/rt/html/REST/1.0/Forms/queue/ns new file mode 100644 index 000000000..360eea86b --- /dev/null +++ b/rt/html/REST/1.0/Forms/queue/ns @@ -0,0 +1,38 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/Forms/queue/ns +%# +<%ARGS> +$id + +<%perl> +use RT::Queues; + +my $queues = new RT::Queues $session{CurrentUser}; +$queues->Limit(FIELD => 'Name', OPERATOR => '=', VALUE => $id); +if ($queues->Count == 0) { + return (0, "No queue named $id exists."); +} +return $queues->Next->Id; + diff --git a/rt/html/REST/1.0/Forms/ticket/attachments b/rt/html/REST/1.0/Forms/ticket/attachments new file mode 100644 index 000000000..bcb571a5a --- /dev/null +++ b/rt/html/REST/1.0/Forms/ticket/attachments @@ -0,0 +1,107 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/Forms/ticket/attachments +%# +<%ARGS> +$id +$args => undef + +<%perl> +my @data; +my ($c, $o, $k, $e) = ("", [], {}, ""); +my $ticket = new RT::Ticket $session{CurrentUser}; + +$ticket->Load($id); +unless ($ticket->Id) { + return [ "# Ticket $id does not exist.", [], {}, 1 ]; +} + +my @arglist = split('/', $args); +my ($aid, $content); + +if ($arglist[1] eq 'content') { + $aid = $arglist[0]; + $content = 1; +} else { + $aid = $args; + $content = 0; +} + +if ($aid) { + unless ($aid =~ /^\d+$/) { + return [ "# Invalid attachment id: $aid", [], {}, 1 ]; + } + my $attachment = new RT::Attachment $session{CurrentUser}; + $attachment->Load($aid); + unless ($attachment->Id eq $aid) { + return [ "# Invalid attachment id: $aid", [], {}, 1 ]; + } + if ($content) { + $c = $attachment->Content; + } else { + my @data; + push @data, [ id => $attachment->Id ]; + push @data, [ Subject => $attachment->Subject ]; + push @data, [ Creator => $attachment->Creator ]; + push @data, [ Created => $attachment->Created ]; + push @data, [ Transaction => $attachment->TransactionId ]; + push @data, [ Parent => $attachment->Parent ]; + push @data, [ MessageId => $attachment->MessageId ]; + push @data, [ Filename => $attachment->Filename ]; + push @data, [ ContentType => $attachment->ContentType ]; + push @data, [ ContentEncoding => $attachment->ContentEncoding ]; + push @data, [ Headers => $attachment->Headers ]; + push @data, [ Content => $attachment->Content ]; + + my %k = map {@$_} @data; + $o = [ map {$_->[0]} @data ]; + $k = \%k; + } + +} +else { + my @attachments; + my $transactions = $ticket->Transactions; + while (my $t = $transactions->Next) { + my $attachments = $t->Attachments; + while (my $a = $attachments->Next) { + next unless $a->Filename; + my $size = length($a->Content); + if ($size > 1024) { $size = int($size/102.4)/10 . "k" } + else { $size .= "b" } + push @attachments, $a->Id.": ".$a->Filename." (".$size.")"; + } + } + + if (@attachments) { + $o = [ "id", "Attachments" ]; + $k = { + id => "ticket/".$ticket->Id."/attachments", + Attachments => \@attachments + }; + } +} + +return [ $c, $o, $k, $e ]; + diff --git a/rt/html/REST/1.0/Forms/ticket/default b/rt/html/REST/1.0/Forms/ticket/default new file mode 100644 index 000000000..fec499b58 --- /dev/null +++ b/rt/html/REST/1.0/Forms/ticket/default @@ -0,0 +1,253 @@ +%# REST/1.0/Forms/ticket/default +%# +<%ARGS> +$id +$changes => {} +$fields => undef + +<%perl> +use MIME::Entity; + +my @comments; +my ($c, $o, $k, $e) = ("", [], {}, 0); +my %data = %$changes; +my $ticket = new RT::Ticket $session{CurrentUser}; +my @dates = qw(Created Starts Started Due Resolved Told); +my @people = qw(Requestors Cc AdminCc); +my @create = qw(Queue Requestor Subject Cc AdminCc Owner Status Priority + InitialPriority FinalPriority TimeEstimated TimeWorked + TimeLeft Starts Started Due Resolved); +my @simple = qw(Subject Status Priority Disabled TimeEstimated TimeWorked + TimeLeft InitialPriority FinalPriority); +my %dates = map {lc $_ => $_} @dates; +my %people = map {lc $_ => $_} @people; +my %create = map {lc $_ => $_} @create; +my %simple = map {lc $_ => $_} @simple; + +# Are we dealing with an existing ticket? +if ($id ne 'new') { + $ticket->Load($id); + if (!$ticket->Id) { + return [ "# Ticket $id does not exist.", [], {}, 1 ]; + } + elsif (!$ticket->CurrentUserHasRight('ShowTicket') || + (%data && !$ticket->CurrentUserHasRight('ModifyTicket'))) + { + my $act = %data ? "modify" : "display"; + return [ "# You are not allowed to $act ticket $id.", [], {}, 1 ]; + } +} +else { + if (%data == 0) { + # GET ticket/new: Return a suitable default form. + # We get defaults from queue/1 (XXX: What if it isn't there?). + my $due = new RT::Date $session{CurrentUser}; + my $queue = new RT::Queue $session{CurrentUser}; + my $starts = new RT::Date $session{CurrentUser}; + $queue->Load(1); + $due->SetToNow; + $due->AddDays($queue->DefaultDueIn) if $queue->DefaultDueIn; + $starts->SetToNow; + + return [ + "# Required: Queue, Requestor, Subject", + [ qw(id Queue Requestor Subject Cc AdminCc Owner Status Priority + InitialPriority FinalPriority TimeEstimated Starts Due Text) ], + { + id => "ticket/new", + Queue => $queue->Name, + Requestor => $session{CurrentUser}->Name, + Subject => "", + Cc => [], + AdminCc => [], + Owner => "", + Status => "new", + Priority => $queue->InitialPriority, + InitialPriority => $queue->InitialPriority, + FinalPriority => $queue->FinalPriority, + TimeEstimated => 0, + Starts => $starts->ISO, + Due => $due->ISO, + Text => "", + }, + 0 + ]; + } + else { + # We'll create a new ticket, and fall through to set fields that + # can't be set in the call to Create(). + my (%v, $text); + + foreach my $k (keys %data) { + if (exists $create{lc $k}) { + $v{$create{lc $k}} = delete $data{$k}; + } + elsif (lc $k eq 'text') { + $text = delete $data{$k}; + } + } + + if ($text) { + $v{MIMEObj} = + MIME::Entity->build( + From => $session{CurrentUser}->EmailAddress, + Subject => $v{Subject}, + Data => $text + ); + } + + $ticket->Create(%v); + unless ($ticket->Id) { + return [ "# Could not create ticket.", [], {}, 1 ]; + } + + delete $data{id}; + $id = $ticket->Id; + push(@comments, "# Ticket $id created."); + goto DONE if %data == 0; + } +} + +# Now we know we're dealing with an existing ticket. +if (%data == 0) { + my ($time, $key, $val, @data); + + push @data, [ id => "ticket/".$ticket->Id ]; + push @data, [ Queue => $ticket->QueueObj->Name ] + if (!%$fields || exists $fields->{lc 'Queue'}); + push @data, [ Owner => $ticket->OwnerObj->Name ] + if (!%$fields || exists $fields->{lc 'Owner'}); + push @data, [ Creator => $ticket->CreatorObj->Name ] + if (!%$fields || exists $fields->{lc 'Creator'}); + + foreach (qw(Subject Status Priority InitialPriority FinalPriority)) { + next unless (!%$fields || (exists $fields->{lc $_})); + push @data, [$_ => $ticket->$_ ]; + } + + foreach $key (@people) { + next unless (!%$fields || (exists $fields->{lc $key})); + push @data, [ $key => [ $ticket->$key->MemberEmailAddresses ] ]; + } + + $time = new RT::Date ($session{CurrentUser}); + foreach $key (@dates) { + next unless (!%$fields || (exists $fields->{lc $key})); + $time->Set(Format => 'sql', Value => $ticket->$key); + push @data, [ $key => $time->AsString ]; + } + + $time = new RT::Date ($session{CurrentUser}); + foreach $key (qw(TimeEstimated TimeWorked TimeLeft)) { + next unless (!%$fields || (exists $fields->{lc $key})); + $val = $ticket->$key || 0; + $val = $time->DurationAsString($val*60) if $val; + push @data, [ $key => $val ]; + } + + my %k = map {@$_} @data; + $o = [ map {$_->[0]} @data ]; + $k = \%k; +} +else { + my ($get, $set, $key, $val, $n, $s); + + foreach $key (keys %data) { + $val = $data{$key}; + $key = lc $key; + $n = 1; + + if (ref $val eq 'ARRAY') { + unless ($key =~ /^(?:Requestors|Cc|AdminCc)$/i) { + $n = 0; + $s = "$key may have only one value."; + goto SET; + } + } + + if ($key =~ /^queue$/i) { + next if $val eq $ticket->QueueObj->Name; + ($n, $s) = $ticket->SetQueue($val); + } + elsif ($key =~ /^owner$/i) { + next if $val eq $ticket->OwnerObj->Name; + ($n, $s) = $ticket->SetOwner($val); + } + elsif (exists $simple{$key}) { + $key = $simple{$key}; + $set = "Set$key"; + + next if $val eq $ticket->$key; + ($n, $s) = $ticket->$set($val); + } + elsif (exists $dates{$key}) { + $key = $dates{$key}; + $set = "Set$key"; + + my $time = new RT::Date $session{CurrentUser}; + $time->Set(Format => 'sql', Value => $ticket->$key); + next if ($val =~ /^not set$/i || $val eq $time->AsString); + ($n, $s) = $ticket->$set($val); + } + elsif (exists $people{$key}) { + $key = $people{$key}; + my ($p, @msgs); + + my %new = map {$_=>1} @{ vsplit($val) }; + my %old = map {$_=>1} $ticket->$key->MemberEmailAddresses; + my $type = $key eq 'Requestors' ? 'Requestor' : $key; + + foreach $p (keys %old) { + unless (exists $new{$p}) { + ($s, $n) = $ticket->DeleteWatcher(Type => $type, + Email => $p); + push @msgs, [ $s, $n ]; + } + } + foreach $p (keys %new) { + # XXX: This is a stupid test. + unless ($p =~ /^[\w.+-]+\@([\w.-]+\.)*\w+.?$/) { + $s = 0; + $n = "$p is not a valid email address."; + push @msgs, [ $s, $n ]; + next; + } + unless ($ticket->IsWatcher(Type => $type, Email => $p)) { + ($s, $n) = $ticket->AddWatcher(Type => $type, + Email => $p); + push @msgs, [ $s, $n ]; + } + } + + $n = 1; + if (@msgs = grep {$_->[0] == 0} @msgs) { + $n = 0; + $s = join "\n", map {"# ".$_->[1]} @msgs; + $s =~ s/^# //; + } + } + elsif ($key ne 'id' && $key ne 'type') { + $n = 0; + $s = "Unknown field."; + } + + SET: + if ($n == 0) { + $e = 1; + push @comments, "# $key: $s"; + unless (@$o) { + my %o = keys %$changes; + delete $o{id}; + @$o = ("id", keys %o); + $k = $changes; + } + } + } + push(@comments, "# Ticket ".$ticket->id." updated.") unless $n == 0; +} + +DONE: +$c ||= join("\n", @comments) if @comments; +return [$c, $o, $k, $e]; + + diff --git a/rt/html/REST/1.0/Forms/ticket/history b/rt/html/REST/1.0/Forms/ticket/history new file mode 100644 index 000000000..f5c1dc990 --- /dev/null +++ b/rt/html/REST/1.0/Forms/ticket/history @@ -0,0 +1,144 @@ +%# REST/1.0/Forms/ticket/history +%# +<%ARGS> +$id +$args => undef +$format => undef +$fields => undef + +<%perl> +my $ticket = new RT::Ticket $session{CurrentUser}; +my ($c, $o, $k, $e) = ("", [], {}, ""); + +$ticket->Load($id); +unless ($ticket->Id) { + return [ "# Ticket $id does not exist.", [], {}, 1 ]; +} + +my $trans = $ticket->Transactions(); +my $total = $trans->Count(); + +chomp $args; +my @arglist = split('/', $args); +my ($type, $tid); + +if ($arglist[0] eq 'type') { + $type = $arglist[1]; +} elsif ($arglist[0] eq 'id') { + $tid = $arglist[1]; +} else { + $type = $args; +} + +if ($type) { + # Create, Set, Status, Correspond, Comment, Give, Steal, Take, Told + # CustomField, AddLink, DeleteLink, AddWatcher, DelWatcher + if ($args =~ /^links?$/) { + $trans->Limit(FIELD => 'Type', OPERATOR => 'LIKE', VALUE => '%Link'); + } + elsif ($args =~ /^watchers?$/) { + $trans->Limit(FIELD => 'Type', OPERATOR => 'LIKE', VALUE => '%Watcher'); + } + else { + $trans->Limit(FIELD => 'Type', OPERATOR => '=', VALUE => $type); + } +} elsif ($tid) { + $trans->Limit(FIELD => 'Id', OPERATOR => '=', VALUE => $tid); +} + +if ($tid) { + my @data; + my $t = new RT::Transaction $session{CurrentUser}; + $t->Load($tid); + + push @data, [ id => $t->Id ]; + push @data, [ EffectiveTicket => $t->EffectiveTicket ] + if (!%$fields || exists $fields->{lc 'EffectiveTicket'}); + push @data, [ Ticket => $t->Ticket ] + if (!%$fields || exists $fields->{lc 'Ticket'}); + push @data, [ TimeTaken => $t->TimeTaken ] + if (!%$fields || exists $fields->{lc 'TimeTaken'}); + push @data, [ Type => $t->Type ] + if (!%$fields || exists $fields->{lc 'Type'}); + push @data, [ Field => $t->Field ] + if (!%$fields || exists $fields->{lc 'Field'}); + push @data, [ OldValue => $t->OldValue ] + if (!%$fields || exists $fields->{lc 'OldValue'}); + push @data, [ NewValue => $t->NewValue ] + if (!%$fields || exists $fields->{lc 'NewValue'}); + push @data, [ Data => $t->Data ] + if (!%$fields || exists $fields->{lc 'Data'}); + push @data, [ Description => $t->Description ] + if (!%$fields || exists $fields->{lc 'Description'}); + push @data, [ Content => $t->Content ] + if (!%$fields || exists $fields->{lc 'Content'}); + + + if (!%$fields || exists $fields->{lc 'Content'}) { + my $creator = new RT::User $session{CurrentUser}; + $creator->Load($t->Creator); + push @data, [ Creator => $creator->Name ]; + } + push @data, [ Created => $t->Created ] + if (!%$fields || exists $fields->{lc 'Created'}); + + if (!%$fields || exists $fields->{lc 'Attachments'}) { + my $attachlist; + my $attachments = $t->Attachments; + while (my $a = $attachments->Next) { + my $size = length($a->Content); + if ($size > 1024) { $size = int($size/102.4)/10 . "k" } + else { $size .= "b" } + $attachlist .= "\n" . $a->Id.": ".($a->Filename || "untitled")." (".$size.")"; + } + + push @data, [Attachments => $attachlist]; + } + + my %k = map {@$_} @data; + $o = [ map {$_->[0]} @data ]; + $k = \%k; + +} else { + my (@data, $tids); + $format ||= "s"; + $format = "l" if (%$fields); + + while (my $t = $trans->Next) { + my $tid = $t->Id; + + if ($format eq "l") { + $tids .= "," if $tids; + $tids .= $tid; + } else { + push @$o, $tid; + $k->{$tid} = $t->Description; + } + } + + if ($format eq "l") { + my @tid; + push @tid, "ticket/$id/history/id/$tids"; + my $fieldstring; + foreach my $key (keys %$fields) { + $fieldstring .= "," if $fieldstring; + $fieldstring .= $key; + } + my ($content, $forms); + + $m->subexec("$RT::WebPath/REST/1.0/show", + id => \@tid, + format => $format, + fields => $fieldstring); + return [ $c, $o, $k, $e ]; + } +} + +if (!$c) { + my $sub = $trans->Count(); + $c = "# $sub/$total ($args/total)"; +} + +return [ $c, $o, $k, $e ]; + + diff --git a/rt/html/REST/1.0/Forms/ticket/links b/rt/html/REST/1.0/Forms/ticket/links new file mode 100644 index 000000000..8ac9dc29d --- /dev/null +++ b/rt/html/REST/1.0/Forms/ticket/links @@ -0,0 +1,148 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/Forms/ticket/links +%# +<%ARGS> +$id +$format => 's' +$changes => undef + +<%perl> +my @data; +my $ticket = new RT::Ticket $session{CurrentUser}; + +$ticket->Load($id); +if (!$ticket->Id) { + return [ "# Ticket $id does not exist.", [], {}, 1 ]; +} + +my ($c, $o, $k, $e) = ("", [], {}, 0); +my @fields = qw(DependsOn DependedOnBy RefersTo ReferredToBy Members MemberOf); +my %fields = map { lc $_ => $_ } @fields; + +my %lfields = ( + Members => { Type => 'MemberOf', Mode => 'Base' }, + ReferredToBy => { Type => 'RefersTo', Mode => 'Base' }, + DependedOnBy => { Type => 'DependsOn', Mode => 'Base' }, + MemberOf => { Type => 'MemberOf', Mode => 'Target' }, + RefersTo => { Type => 'RefersTo', Mode => 'Target' }, + DependsOn => { Type => 'DependsOn', Mode => 'Target' }, +); + +if ($changes) { + my ($get, $set, $key, $val, $n, $s); + my %data = %$changes; + my @comments; + + foreach $key (keys %data) { + $val = $data{$key}; + $key = lc $key; + $n = 1; + + if (exists $fields{$key}) { + $key = $fields{$key}; + + my %old; + my $field = $lfields{$key}->{Mode}; + while (my $link = $ticket->$key->Next) { + $old{$link->$field} = 1; + } + + my %new; + foreach my $nkey (@{vsplit($val)}) { + if ($nkey =~ /^\d+$/) { + my $uri = new RT::URI $session{CurrentUser}; + my $tick = new RT::Ticket $session{CurrentUser}; + $tick->Load($nkey); + if ($tick->Id) { + $nkey = $uri->FromObject($tick); + } + else { + $n = 0; + $s = "Ticket $nkey does not exist."; + goto SET; + } + } + $new{$nkey} = 1; + } + + foreach my $u (keys %old) { + if (exists $new{$u}) { + delete $new{$u}; + } + else { + my $type = $lfields{$key}->{Type}; + my $mode = $lfields{$key}->{Mode}; + ($n, $s) = $ticket->DeleteLink(Type => $type, $mode => $u); + goto SET; + } + } + foreach my $u (keys %new) { + my $type = $lfields{$key}->{Type}; + my $mode = $lfields{$key}->{Mode}; + ($n, $s) = $ticket->AddLink(Type => $type, $mode => $u); + goto SET; + } + } + elsif ($key ne 'id' && $key ne 'type') { + $n = 0; + $s = "Unknown field: $key"; + } + + SET: + if ($n == 0) { + $e = 1; + push @comments, "# $key: $s"; + unless (@$o) { + @$o = ("id", @fields); + %$k = %data; + } + } + } + + push(@comments, "# Links for ticket $id updated.") unless @comments; + $c = join("\n", @comments) if @comments; +} +else { + my @data; + + push @data, [ id => "ticket/".$ticket->Id."/links" ]; + foreach my $key (@fields) { + my @val; + + my $field = $lfields{$key}->{Mode}; + while (my $link = $ticket->$key->Next) { + push @val, $link->$field; + } + push(@val, "") if (@val == 0 && $format eq 'l'); + push @data, [ $key => [ @val ] ] if @val; + } + + my %k = map {@$_} @data; + $o = [ map {$_->[0]} @data ]; + $k = \%k; +} + +return [ $c, $o, $k, $e ]; + diff --git a/rt/html/REST/1.0/Forms/user/default b/rt/html/REST/1.0/Forms/user/default new file mode 100644 index 000000000..6b216e072 --- /dev/null +++ b/rt/html/REST/1.0/Forms/user/default @@ -0,0 +1,141 @@ +%# REST/1.0/Forms/user/default +%# +<%ARGS> +$id +$format => 's' +$changes => {} + +<%perl> +my @comments; +my ($c, $o, $k, $e) = ("", [], {}, 0); +my %data = %$changes; +my $user = new RT::User $session{CurrentUser}; +my @fields = qw(RealName NickName Gecos Organization Address1 Address2 City + State Zip Country HomePhone WorkPhone MobilePhone PagerPhone + FreeformContactInfo Comments Signature Lang EmailEncoding + WebEncoding ExternalContactInfoId ContactInfoSystem + ExternalAuthId AuthSystem); +my %fields = map { lc $_ => $_ } @fields; + +if ($id ne 'new') { + $user->Load($id); + if (!$user->Id) { + return [ "# User $id does not exist.", [], {}, 1 ]; + } +} +else { + if (%data == 0) { + return [ + "# Required: Name, EmailAddress", + [ qw(id Name EmailAddress Organization Password Comments) ], + { + id => "user/new", + Name => "", + EmailAddress => "", + Organization => "", + Password => "", + Comments => "" + }, + 0 + ]; + } + else { + my %v; + my %create = %fields; + $create{name} = "Name"; + $create{password} = "Password"; + $create{emailaddress} = "EmailAddress"; + $create{contactinfo} = "FreeformContactInfo"; + # Do any fields need to be excluded here? + + foreach my $k (keys %data) { + if (exists $create{lc $k}) { + $v{$create{lc $k}} = delete $data{$k}; + } + } + + $user->Create(%v); + unless ($user->Id) { + return [ "# Could not create user.", [], {}, 1 ]; + } + + $id = $user->Id; + delete $data{id}; + push(@comments, "# User $id created."); + goto DONE if %data == 0; + } +} + +if (%data == 0) { + my @data; + + push @data, [ id => "user/".$user->Id ]; + push @data, [ Name => $user->Name ]; + push @data, [ Password => '********' ]; + push @data, [ EmailAddress => $user->EmailAddress ]; + + foreach my $key (@fields) { + my $val = $user->$key; + + if ($format eq 'l' || (defined $val && $val ne '')) { + $key = "ContactInfo" if $key eq 'FreeformContactInfo'; + push @data, [ $key => $val ]; + } + } + + my %k = map {@$_} @data; + $o = [ map {$_->[0]} @data ]; + $k = \%k; +} +else { + my ($get, $set, $key, $val, $n, $s); + + foreach $key (keys %data) { + $val = $data{$key}; + $key = lc $key; + $n = 1; + + if ($key eq 'name' || $key eq 'emailaddress' || + $key eq 'contactinfo' || exists $fields{$key}) + { + if (exists $fields{$key}) { + $key = $fields{$key}; + } + else { + $key = "FreeformContactInfo" if $key eq 'contactinfo'; + $key = "EmailAddress" if $key eq 'emailaddress'; + $key = "Name" if $key eq 'name'; + } + $set = "Set$key"; + + next if $val eq $user->$key; + ($n, $s) = $user->$set($val); + } + elsif ($key eq 'password') { + ($n, $s) = $user->SetPassword($val) unless $val =~ /^\**$/; + } + elsif ($key ne 'id') { + $n = 0; + $s = "Unknown field."; + } + + SET: + if ($n == 0) { + $e = 1; + push @comments, "# $key: $s"; + unless (@$o) { + my %o = keys %$changes; + delete @o{"id", @fields}; + @$o = ("id", @fields, keys %o); + $k = $changes; + } + } + } + + push(@comments, "# User $id updated.") unless $n == 0; +} + +DONE: +$c ||= join("\n", @comments) if @comments; +return [ $c, $o, $k, $e ]; + diff --git a/rt/html/REST/1.0/Forms/user/ns b/rt/html/REST/1.0/Forms/user/ns new file mode 100644 index 000000000..36b323746 --- /dev/null +++ b/rt/html/REST/1.0/Forms/user/ns @@ -0,0 +1,41 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/Forms/user/ns +%# +<%ARGS> +$id + +<%perl> +use RT::Users; + +my $field = "Name"; +$field = "EmailAddress" if $id =~ /\@/; + +my $users = new RT::Users $session{CurrentUser}; +$users->Limit(FIELD => $field, OPERATOR => '=', VALUE => $id); +if ($users->Count == 0) { + return (0, "No user named $id exists."); +} +return $users->Next->Id; + diff --git a/rt/html/REST/1.0/NoAuth/mail-gateway b/rt/html/REST/1.0/NoAuth/mail-gateway index 8db80d5ff..359331f58 100644 --- a/rt/html/REST/1.0/NoAuth/mail-gateway +++ b/rt/html/REST/1.0/NoAuth/mail-gateway @@ -29,12 +29,15 @@ $ticket => undef <%init> use RT::Interface::Email; -my ( $status, $error, $Ticket ) = RT::Interface::Email::Gateway( %ARGS); +my ( $status, $error, $Ticket ) = RT::Interface::Email::Gateway(\%ARGS); <%flags> inherit => undef # inhibit UTF8 conversion done in /autohandler -% if ($status) { +% if ($status == -75 ) { +temporary failure +% } +% elsif ($status == 1) { ok % if ( $Ticket->Id ) { Ticket: <% $Ticket->Id %> diff --git a/rt/html/REST/1.0/autohandler b/rt/html/REST/1.0/autohandler new file mode 100644 index 000000000..9084a1bef --- /dev/null +++ b/rt/html/REST/1.0/autohandler @@ -0,0 +1,32 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/autohandler +%# +<%INIT> +use RT::Interface::REST; +$r->content_type('text/plain'); +$m->error_format('text'); +$m->call_next(); +$m->abort(); + diff --git a/rt/html/REST/1.0/dhandler b/rt/html/REST/1.0/dhandler new file mode 100644 index 000000000..ef5217fe0 --- /dev/null +++ b/rt/html/REST/1.0/dhandler @@ -0,0 +1,287 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/dhandler +%# +<%ARGS> +@id => () +$fields => undef +$format => undef +$content => undef + +<%INIT> +use RT::Interface::REST; + +my $output = ""; +my $status = "200 Ok"; +my $object = $m->dhandler_arg; + +my $name = qr{[\w.-]+}; +my $list = '(?:(?:\d+-)?\d+,)*(?:\d+-)?\d+'; +my $label = '[a-zA-Z0-9@_.+-]+'; +my $field = '[a-zA-Z][a-zA-Z0-9_-]*'; +my $labels = "(?:$label,)*$label"; + +# We must handle requests such as the following: +# +# 1. http://.../REST/1.0/show (with a list of object specifications). +# 2. http://.../REST/1.0/edit (with a self-contained list of forms). +# 3. http://.../REST/1.0/ticket/show (implicit type specification). +# http://.../REST/1.0/ticket/edit +# 4. http://.../REST/1.0/ticket/nn (all possibly with a single form). +# http://.../REST/1.0/ticket/nn/history +# http://.../REST/1.0/ticket/nn/attachment/1 +# +# Objects are specified by their type, and either a unique numeric ID, +# or a unique name (e.g. ticket/1, queue/foo). Multiple objects of the +# same type may be specified by a comma-separated list of identifiers +# (e.g., user/ams,rai or ticket/1-3,5-7). +# +# Ultimately, we want a list of object specifications to operate upon. +# The URLs in (4) provide enough information to identify an object. We +# will assemble submitted information into that format in other cases. +# +my (@objects, $forms); +my $utype; + +if ($object eq 'show' || # $REST/show + (($utype) = ($object =~ m{^($name)/show$}))) # $REST/ticket/show +{ + # We'll convert type/range specifications ("ticket/1-3,7-9/history") + # into a list of singular object specifications ("ticket/1/history"). + # If the URL specifies a type, we'll accept only that one. + foreach my $id (@id) { + $id =~ s|^(?:$utype/)?|$utype/| if $utype; + if (my ($type, $oids, $extra) = + ($id =~ m#^($name)/($list|$labels)(?:(/.*))?$#o)) + { + foreach my $oid (expand_list($oids)) { + if ($extra =~ m{^(?:/($name)(?:/(.*))?)?$}o) { + my ($attr, $args) = ($1, $2); + # expand transaction and attachment range specifications + # (if applicable) + my $tids; + if ($attr eq 'history' && $args =~ m#id/(\d.*)#o) { + $tids = $1; + } + if ($tids) { + push(@objects, "$type/$oid/$attr/id/$_") for expand_list($tids); + } else { + push(@objects, "$type/$oid$extra"); + } + } + } + } + else { + $status = "400 Bad Request"; + $output = "Invalid object ID specified: '$id'"; + goto OUTPUT; + } + } +} +elsif ($object eq 'edit' || # $REST/edit + (($utype) = ($object =~ m{^($name)/edit$}))) # $REST/ticket/edit +{ + # We'll make sure each of the submitted forms is syntactically valid + # and sufficiently identifies an object to operate upon, then add to + # the object list as above. + my @output; + + $forms = form_parse($content); + foreach my $form (@$forms) { + my ($c, $o, $k, $e) = @$form; + + if ($e) { + push @output, [ "# Syntax error.", $o, $k, $e ]; + } + else { + my ($type, $id); + + # Look for matching types in the ID, form, and URL. + $type = exists $k->{type} ? $k->{type} : $utype; + $type =~ s|^(?:$utype)?|$utype/| if $utype; + $type =~ s|/$||; + + if (exists $k->{id}) { + $id = $k->{id}; + $id =~ s|^(?:$type/)?|$type/| if $type; + + if ($id =~ m#^$name/(?:$label|\d+)(?:/.*)?#o) { + push @objects, $id; + } + else { + push @output, [ "# Invalid object ID: '$id'", $o, $k, $e ]; + } + } + else { + push @output, [ "# No object ID specified.", $o, $k, $e ]; + } + } + } + # If we saw any errors at this stage, we won't process any part of + # the submitted data. + if (@output) { + unshift @output, [ "# Please resubmit with errors corrected." ]; + $status = "409 Syntax Error"; + $output = form_compose(\@output); + goto OUTPUT; + } +} +else { + # We'll assume that this is in the correct format already. Otherwise + # it will be caught by the loop below. + push @objects, $object; + + if ($content) { + $forms = form_parse($content); + + if (@$forms > 1) { + $status = "400 Bad Request"; + $output = "You may submit only one form to this object."; + goto OUTPUT; + } + + my ($c, $o, $k, $e) = @{ $forms->[0] }; + if ($e) { + $status = "409 Syntax Error"; + $output = form_compose([ ["# Syntax error.", $o, $k, $e] ]); + goto OUTPUT; + } + } +} + +# Make sure we have something to do. +unless (@objects) { + $status = "400 Bad Request"; + $output = "No objects specified."; + goto OUTPUT; +} + +# Parse and validate any field specifications. +my (%fields, @fields); +if ($fields) { + unless ($fields =~ /^(?:$field,)*$field$/) { + $status = "400 Bad Request"; + $output = "Invalid field specification: $fields"; + goto OUTPUT; + } + @fields = map lc, split /,/, $fields; + @fields{@fields} = (); + unless (exists $fields{id}) { + unshift @fields, "id"; + $fields{id} = (); + } +} + +my (@comments, @output); + +foreach $object (@objects) { + my ($handler, $type, $id, $attr, $args); + my ($c, $o, $k, $e) = ("", ["id"], {id => $object}, 0); + + my $i = 0; + if ($object =~ m{^($name)/(\d+|$label)(?:/($name)(?:/(.*))?)?$}o || + $object =~ m{^($name)/(new)$}o) + { + ($type, $id, $attr, $args) = ($1, $2, ($3 || 'default'), $4); + $handler = "Forms/$type/$attr"; + + unless ($m->comp_exists($handler)) { + $args = "$attr/$args"; + $handler = "Forms/$type/default"; + + unless ($m->comp_exists($handler)) { + $i = 2; + $c = "# Unknown object type: $type"; + } + } + elsif ($id ne 'new' && $id !~ /^\d+$/) { + my $ns = "Forms/$type/ns"; + + # Can we resolve named objects? + unless ($m->comp_exists($ns)) { + $i = 3; + $c = "# Objects of type $type must be specified by numeric id."; + } + else { + my ($n, $s) = $m->comp("Forms/$type/ns", id => $id); + if ($n <= 0) { $i = 4; $c = "# $s"; } + else { $i = 0; $id = $n; } + } + } + else { + $i = 0; + } + } + else { + $i = 1; + $c = "# Invalid object specification: '$object'"; + } + + if ($i != 0) { + if ($content) { + (undef, $o, $k, $e) = @{ shift @$forms }; + } + push @output, [ $c, $o, $k ]; + next; + } + + unless ($content) { + my $d = $m->comp($handler, id => $id, args => $args, format => $format, fields => \%fields); + my ($c, $o, $k, $e) = @$d; + + if (!$e && @$o && keys %fields) { + my %lk = map { lc $_ => $_ } keys %$k; + @$o = map { $lk{$_} } @fields; + foreach my $key (keys %$k) { + delete $k->{$key} unless exists $fields{lc $key}; + } + } + push(@output, [ $c, $o, $k ]) if ($c || @$o || keys %$k); + } + else { + my ($c, $o, $k, $e) = @{ shift @$forms }; + my $d = $m->comp($handler, id => $id, args => $args, format => $format, + changes => $k); + ($c, $o, $k, $e) = @$d; + + # We won't pass $e through to compose, trusting instead that the + # handler added suitable comments for the user. + if ($e) { + $status = "409 Syntax Error" if @$o; + push @output, [ $c, $o, $k ]; + } + else { + push @comments, $c; + } + } +} + +unshift(@output, [ join "\n", @comments ]) if @comments; +$output = form_compose(\@output); + +OUTPUT: + +RT/<% $RT::VERSION %> <% $status %> + +<% $output |n %> diff --git a/rt/html/REST/1.0/logout b/rt/html/REST/1.0/logout new file mode 100644 index 000000000..b64938bc2 --- /dev/null +++ b/rt/html/REST/1.0/logout @@ -0,0 +1,27 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +<%PERL> +tied(%session)->delete if (defined %session); + +RT/<% $RT::VERSION %> 200 Ok diff --git a/rt/html/REST/1.0/search/dhandler b/rt/html/REST/1.0/search/dhandler new file mode 100644 index 000000000..90b4653e5 --- /dev/null +++ b/rt/html/REST/1.0/search/dhandler @@ -0,0 +1,32 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/search/dhandler +%# +<%INIT> +my $status = "500 Server Error"; +my $output = "Unsupported object type."; + +RT/<% $RT::VERSION %> <% $status %> + +<% $output |n %> diff --git a/rt/html/REST/1.0/search/ticket b/rt/html/REST/1.0/search/ticket new file mode 100644 index 000000000..24435294e --- /dev/null +++ b/rt/html/REST/1.0/search/ticket @@ -0,0 +1,119 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/search/ticket +%# +<%ARGS> +$query +$format => undef +$orderby => undef +$fields => undef + +<%INIT> +my $output = ""; +my $status = "200 Ok"; +my $tickets = new RT::Tickets $session{CurrentUser}; + +# Parse and validate any field specifications. +my $field = '[a-zA-Z][a-zA-Z0-9_-]*'; +my (%fields, @fields); +if ($fields) { + $format = "l"; + unless ($fields =~ /^(?:$field,)*$field$/) { + $status = "400 Bad Request"; + $output = "Invalid field specification: $fields"; + goto OUTPUT; + } + @fields = map lc, split /,/, $fields; + @fields{@fields} = (); + unless (exists $fields{id}) { + unshift @fields, "id"; + $fields{id} = (); + } +} + +$format ||= "s"; +if ($format !~ /^[isl]$/) { + $status = "400 Bad request"; + $output = "Unknown listing format: $format. (Use i, s, or l.)\n"; + goto OUTPUT; +} + +my ($n, $s); +eval { + ($n, $s) = $tickets->FromSQL($query); +}; +my $sortstring = ""; +if ($orderby) { + $sortstring = 'FIELD => '; + my $order = substr($orderby, 0, 1); + if ($order eq '+' || $order eq '-') { + $sortstring .= 'substr($orderby, 1)'; + if ($order eq '+') { + $sortstring .= ", ORDER => 'ASC'"; + } elsif ($order eq '-') { + $sortstring .= ", ORDER => 'DESC'"; + } + } else { + $sortstring .= '$orderby'; + } + my $foo = 'FIELD => '; + $foo .= '$orderby'; + $tickets->OrderBy(eval $sortstring); +} +if ($@ || $n == 0) { + $s ||= $@; + $status = "400 Bad request"; + $output = "Invalid query: '$s'.\n"; + goto OUTPUT; +} + +$n = 0; +my @output; +while (my $ticket = $tickets->Next) { + $n++; + + if ($format eq "i") { + $output .= "ticket/" . $ticket->Id . "\n"; + } + elsif ($format eq "s") { + $output .= $ticket->Id . ": ". $ticket->Subject . "\n"; + } + else { + my $id = $ticket->Id; + my $d = $m->comp("$RT::WebPath/REST/1.0/Forms/ticket/default", id => $id, format => $format, fields => \%fields); + my ($c, $o, $k, $e) = @$d; + push @output, [ $c, $o, $k ]; + } +} +if ($n == 0 && $format ne "i") { + $output = "No matching results.\n"; +} + +$output = form_compose(\@output) if @output; + +OUTPUT: + +RT/<% $RT::VERSION %> <% $status %> + +<% $output |n %> diff --git a/rt/html/REST/1.0/ticket/comment b/rt/html/REST/1.0/ticket/comment new file mode 100644 index 000000000..9d1b06246 --- /dev/null +++ b/rt/html/REST/1.0/ticket/comment @@ -0,0 +1,149 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/ticket/comment +%# +<%ARGS> +$content + +<%INIT> +use MIME::Entity; +use LWP::MediaTypes; +use RT::Interface::REST; +use File::Temp qw(tempfile); + +my $ticket = new RT::Ticket $session{CurrentUser}; +my $object = $r->path_info; +my $status = "200 Ok"; +my $output; +my $action; + +# http://.../REST/1.0/ticket/comment/1 +my ($c, $o, $k, $e) = @{ form_parse($content)->[0] }; +if ($e || !$o) { + if (!$o) { + $output = "Empty form submitted.\n"; + } + else { + $c = "# Syntax error."; + $output = form_compose([[$c, $o, $k, $e]]); + } + $status = "400 Bad Request"; + goto OUTPUT; +} + +$object =~ s#^/##; +$object ||= $k->{Ticket}; +unless ($object =~ /^\d+/) { + $output = "Invalid ticket id: `$object'.\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} +if ($k->{Ticket} && $object ne $k->{Ticket}) { + $output = "The submitted form and URL specify different tickets.\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} + +($action = $k->{Action}) =~ s/^(.)(.*)$/\U$1\L$2\E/; +unless ($action =~ /^(?:Comment|Correspond)$/) { + $output = "Invalid action: `$action'.\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} + +my $text = $k->{Text}; +my @atts = @{ vsplit($k->{Attachment}) }; + +if (!$k->{Text} && @atts == 0) { + $status = "400 Bad Request"; + $output = "Empty comment with no attachments submitted.\n"; + goto OUTPUT; +} + +my $cgi = $m->cgi_object; +my $ent = MIME::Entity->build(Type => "multipart/mixed"); +$ent->attach(Data => $k->{Text}) if $k->{Text}; + +my $i = 1; +foreach my $att (@atts) { + local $/=undef; + my $file = $att; + $file =~ s#^.*[\\/]##; + + my $fh = $cgi->upload("attachment_$i"); + if ($fh) { + my $buf; + my ($w, $tmp) = tempfile(); + my $info = $cgi->uploadInfo(); + + while (sysread($fh, $buf, 8192)) { + syswrite($w, $buf); + } + + $ent->attach( + Path => $tmp, + Type => $info->{'Content-Type'} || guess_media_type($tmp), + Filename => $file, + Disposition => "attachment" + ); + } + else { + $status = "400 Bad Request"; + $output = "No attachment for $att.\n"; + goto OUTPUT; + } + + $i++; +} + +$ticket->Load($object); +unless ($ticket->Id) { + $output = "Couldn't load ticket id: `$object'.\n"; + $status = "404 Ticket not found"; + goto OUTPUT; +} +unless ($ticket->CurrentUserHasRight('ModifyTicket') || + ($action eq "Comment" && + $ticket->CurrentUserHasRight("CommentOnTicket")) || + ($action eq "Correspond" && + $ticket->CurrentUserHasRight("ReplyToTicket"))) +{ + $output = "You are not allowed to $action on ticket $object.\n"; + $status = "403 Permission denied"; + goto OUTPUT; +} + +my $cc = join ", ", @{ vsplit($k->{Cc}) }; +my $bcc = join ", ", @{ vsplit($k->{Bcc}) }; +my ($n, $s) = $ticket->$action(MIMEObj => $ent, + CcMessageTo => $cc, + BccMessageTo => $bcc, + TimeTaken => $k->{TimeWorked} || 0); +$output = $s; + +OUTPUT: + +RT/<% $RT::VERSION %> <% $status %> + +<% $output |n %> diff --git a/rt/html/REST/1.0/ticket/link b/rt/html/REST/1.0/ticket/link new file mode 100644 index 000000000..574762512 --- /dev/null +++ b/rt/html/REST/1.0/ticket/link @@ -0,0 +1,96 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/ticket/link +%# +<%ARGS> +$id => undef +$del => 0 +$rel +$to + +<%INIT> +use RT::Interface::REST; + +my $output; +my $status = "200 Ok"; +my $ticket = new RT::Ticket $session{CurrentUser}; +my $object = $r->path_info; + +my @fields = qw(DependsOn DependedOnBy RefersTo ReferredToBy HasMember MemberOf); +my %fields = map { lc $_ => $_ } @fields; +my %lfields = ( + HasMember => { Type => 'MemberOf', Mode => 'Base' }, + ReferredToBy => { Type => 'RefersTo', Mode => 'Base' }, + DependedOnBy => { Type => 'DependsOn', Mode => 'Base' }, + MemberOf => { Type => 'MemberOf', Mode => 'Target' }, + RefersTo => { Type => 'RefersTo', Mode => 'Target' }, + DependsOn => { Type => 'DependsOn', Mode => 'Target' }, +); + +# http://.../REST/1.0/ticket/link/1 + +$object =~ s#^/##; +if ($id && $object && $id != $object) { + $output = "Different ids in URL (`$object') and submitted form (`$id').\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} +$id ||= $object; +unless ($id =~ /^\d+$/ && $to =~ /^\d+$/) { + my $bad = ($id !~ /^\d+$/) ? $id : $to; + $output = $r->path_info. "\n"; + $output .= "Invalid ticket id: '$bad'.\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} +unless (exists $fields{lc $rel}) { + $output = "Invalid relationship: '$rel'.\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} +$rel = $fields{lc $rel}; + +$ticket->Load($id); +unless ($ticket->Id) { + $output = "Couldn't load ticket id: '$id'.\n"; + $status = "404 Ticket not found"; + goto OUTPUT; +} + +my $type = $lfields{$rel}->{Type}; +my $mode = $lfields{$rel}->{Mode}; + +my $n = 1; +my $op = $del ? "DeleteLink" : "AddLink"; + +($n, $output) = $ticket->$op(Type => $type, $mode => $to); +if ($n == 0) { + $status = "500 Error"; +} + +OUTPUT: + +RT/<% $RT::VERSION %> <% $status %> + +<% $output |n %> diff --git a/rt/html/REST/1.0/ticket/merge b/rt/html/REST/1.0/ticket/merge new file mode 100644 index 000000000..9cd2a7cfa --- /dev/null +++ b/rt/html/REST/1.0/ticket/merge @@ -0,0 +1,78 @@ +%# BEGIN LICENSE BLOCK +%# +%# Copyright (c) 1996-2003 Jesse Vincent +%# +%# (Except where explictly superceded by other copyright notices) +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work 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. +%# +%# Unless otherwise specified, all modifications, corrections or +%# extensions to this work which alter its source code become the +%# property of Best Practical Solutions, LLC when submitted for +%# inclusion in the work. +%# +%# +%# END LICENSE BLOCK +%# REST/1.0/ticket/merge +%# +<%ARGS> +$id => undef +$into + +<%INIT> +use RT::Interface::REST; + +my $output; +my $status = "200 Ok"; +my $ticket = new RT::Ticket $session{CurrentUser}; +my $object = $r->path_info; + +# http://.../REST/1.0/ticket/merge/1 + +$object =~ s#^/##; +if ($id && $object && $id != $object) { + $output = "Different ids in URL (`$object') and submitted form (`$id').\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} +$id ||= $object; +unless ($id =~ /^\d+$/ && $into =~ /^\d+$/) { + my $bad = ($id !~ /^\d+$/) ? $id : $into; + $output = $r->path_info. "\n"; + $output .= "Invalid ticket id: `$bad'.\n"; + $status = "400 Bad Request"; + goto OUTPUT; +} + +$ticket->Load($id); +unless ($ticket->Id) { + $output = "Couldn't load ticket id: `$id'.\n"; + $status = "404 Ticket not found"; + goto OUTPUT; +} +unless ($ticket->CurrentUserHasRight('ModifyTicket')) { + $output = "You are not allowed to modify ticket $id.\n"; + $status = "403 Permission denied"; + goto OUTPUT; +} + +my ($n, $s) = $ticket->MergeInto($into); + +if ($n == 0) { + $status = "500 Error"; +} +$output = $s; + +OUTPUT: + +RT/<% $RT::VERSION %> <% $status %> + +<% $output |n %> diff --git a/rt/html/Search/Bulk.html b/rt/html/Search/Bulk.html index df43cfa50..de9143c8a 100644 --- a/rt/html/Search/Bulk.html +++ b/rt/html/Search/Bulk.html @@ -175,6 +175,7 @@ if ($ARGS{'UpdateContent'} && #Iterate through each ticket we've been handed my @linkresults; +$session{'tickets'}->RedoSearch(); while (my $Ticket = $session{'tickets'}->Next) { $RT::Logger->debug( "Checking Ticket ".$Ticket->Id ."\n"); next unless ($ARGS{"UpdateTicket".$Ticket->Id}); diff --git a/rt/html/Search/Elements/PickRestriction b/rt/html/Search/Elements/PickRestriction index a6911df5a..0021ab2bc 100644 --- a/rt/html/Search/Elements/PickRestriction +++ b/rt/html/Search/Elements/PickRestriction @@ -34,9 +34,10 @@ <& /Elements/SelectOwner, Name => "ValueOfOwner" &>
  • -<&|/l&>Requestor email address -<& /Elements/SelectMatch, Name => "RequestorOp" &> - +<& /Elements/SelectWatcherType, Name => "WatcherRole", AllowNull => 0 &> +<&|/l&>email address +<& /Elements/SelectMatch, Name => "WatcherRoleOp" &> +
  • <&|/l&>Subject <& /Elements/SelectMatch, Name => "SubjectOp" &> @@ -47,7 +48,7 @@ False => loc("isn't"), TrueVal=> '=', FalseVal => '!=' &> -<& /Elements/SelectQueue, Name => loc("ValueOfQueue") &> +<& /Elements/SelectQueue, Name => "ValueOfQueue" &>
  • <&|/l&>Priority <& /Elements/SelectEqualityOperator, Name => "PriorityOp" &> @@ -77,7 +78,7 @@ TrueVal=> '=', FalseVal => '!=' &> -<& /Elements/SelectStatus, Name => "ValueOfStatus" &> +<& /Elements/SelectStatus, Name => "ValueOfStatus", SkipDeleted => 1 &> % while ( my $CustomField = $CustomFields->Next ) { diff --git a/rt/html/SelfService/Display.html b/rt/html/SelfService/Display.html index fc3fcb289..124ecf407 100644 --- a/rt/html/SelfService/Display.html +++ b/rt/html/SelfService/Display.html @@ -38,7 +38,7 @@ <& /Elements/TitleBoxStart, title => loc("Dates"), title_class=> 'inverse', color => "#663366" &> - <& /Ticket/Elements/ShowDates, Ticket => $Ticket &> + <& /Ticket/Elements/ShowDates, Ticket => $Ticket, UpdatedLink => 0 &> <& /Elements/TitleBoxEnd &>
  • + +% if (exists $session{'Attachments'}) { + + + + +% } # end of if + +
    +<&|/l&>Attached file: + +<&|/l&>Check box to delete
    +% foreach my $attach_name (keys %{$session{'Attachments'}}) { +<%$attach_name%>
    +% } # end of foreach +
    <&|/l&>Attach: +
    <& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &>
    diff --git a/rt/html/Ticket/Attachment/dhandler b/rt/html/Ticket/Attachment/dhandler index e0f00f57a..ba82b5f2e 100644 --- a/rt/html/Ticket/Attachment/dhandler +++ b/rt/html/Ticket/Attachment/dhandler @@ -65,4 +65,6 @@ $m->out($AttachmentObj->OriginalContent); $m->abort; - +<%attr> +AutoFlush => 0 + diff --git a/rt/html/Ticket/Create.html b/rt/html/Ticket/Create.html index 5b8c908a1..435447a8f 100644 --- a/rt/html/Ticket/Create.html +++ b/rt/html/Ticket/Create.html @@ -34,55 +34,55 @@
    <& /Elements/TitleBoxStart, contentbg => "#cccccc", title => loc("Create a new ticket") &> - - + - - - - - - - - - - - - @@ -93,7 +93,7 @@ % if (exists $session{'Attachments'}) { - - @@ -152,8 +152,8 @@
    <&|/l&>Queue<% $QueueObj->Name %> +
    <&|/l&>Queue:<% $QueueObj->Name %> <&|/l&>Status: +<&|/l&>Status: + <& /Elements/SelectStatus, Name => "Status", Default => $ARGS{Status}||'new' &> + <&|/l&>Owner: + <& /Elements/SelectOwner, Name => "Owner", QueueObj => $QueueObj, Default => $ARGS{Owner}||undef &>
    + <&|/l&>Requestors: +
    + <&|/l&>Cc: ->
    +
    +
    <&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people will receive future updates.)
    + <&|/l&>Admin Cc: ->
    +
    +
    <&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people will receive future updates.)
    + <&|/l&>Subject: +
    + <&|/l&>Attached file: @@ -108,7 +108,7 @@ <&|/l&>Attach file: +
    - - + +
    <&|/l&>Priority:
    <&|/l&>Final Priority:
    <&|/l&>Time Worked:>
    <&|/l&>Time Left:>
    <&|/l&>Time Worked:
    <&|/l&>Time Left:
    <& /Elements/TitleBoxEnd &>
    @@ -162,8 +162,9 @@ color => "#663366" &> - - + +
    <&|/l&>Starts:>
    <&|/l&>Due:>
    <&|/l&>Starts:
    <&|/l&>Due:
    <& /Elements/TitleBoxEnd &>
    @@ -176,12 +177,12 @@ <&|/l&>(Enter ticket ids or URLs, seperated with spaces) - - - - - - + + + + + +
    <&|/l&>Depends on>
    <&|/l&>Depended on by>
    <&|/l&>Parents>
    <&|/l&>Children>
    <&|/l&>Refers to>
    <&|/l&>Referred to by>
    <&|/l&>Depends on
    <&|/l&>Depended on by
    <&|/l&>Parents
    <&|/l&>Children
    <&|/l&>Refers to
    <&|/l&>Referred to by
    @@ -200,10 +201,20 @@










    <%INIT> + + + my $QueueObj = new RT::Queue($session{'CurrentUser'}); $QueueObj->Load($Queue) || Abort(loc("Queue could not be loaded.")); my $CFs = $QueueObj->CustomFields(); +if ($QueueObj->DefaultDueIn) { + my $default_due = RT::Date->new($session{'CurrentUser'}); + $default_due->SetToNow(); + $default_due->AddDays($QueueObj->DefaultDueIn); + $ARGS{'Due'} = $default_due->ISO(); +} + # {{{ deal with deleting uploaded attachments foreach my $key (keys %ARGS) { if ($key =~ m/^DeleteAttach-(.+)$/) { @@ -218,8 +229,6 @@ if ($ARGS{'Attach'}) { # attachment? my $subject = "$ARGS{'Attach'}"; - # since CGI.pm deutf8izes the magic field, we need to add it back. - Encode::_utf8_on($subject); # strip leading directories $subject =~ s#^.*[\\/]##; diff --git a/rt/html/Ticket/Display.html b/rt/html/Ticket/Display.html index cf32dce9d..276cee62a 100644 --- a/rt/html/Ticket/Display.html +++ b/rt/html/Ticket/Display.html @@ -22,20 +22,20 @@ %# %# END LICENSE BLOCK <& /Elements/Header, - Title => loc("#[_1]: [_2]", $Ticket->Id, $Ticket->Subject) &> + Title => loc("#[_1]: [_2]", $TicketObj->Id, $TicketObj->Subject) &> <& /Ticket/Elements/Tabs, - Ticket => $Ticket, - current_tab => 'Ticket/Display.html?id='.$Ticket->id, - Title => loc("#[_1]: [_2]", $Ticket->Id, $Ticket->Subject) &> + Ticket => $TicketObj, + current_tab => 'Ticket/Display.html?id='.$TicketObj->id, + Title => loc("#[_1]: [_2]", $TicketObj->Id, $TicketObj->Subject) &> <& /Elements/ListActions, actions => \@Actions &> -<& /Ticket/Elements/ShowSummary, Ticket => $Ticket &> +<& /Ticket/Elements/ShowSummary, Ticket => $TicketObj &>
    <& /Ticket/Elements/ShowHistory , - Ticket => $Ticket, + Ticket => $TicketObj, Collapsed => $ARGS{'Collapsed'}, ShowHeaders => $ARGS{'ShowHeaders'} &> @@ -45,14 +45,13 @@ $id => undef $Create => undef $ShowHeaders => undef $Collapsed => undef +$TicketObj => undef <%INIT> - my ($linkid, $message, $tid, $Ticket, @Actions); + my ($linkid, $message, $tid, @Actions); -$Ticket = new RT::Ticket($session{'CurrentUser'}); - -unless ($id) { +unless ($id || $TicketObj) { Abort('No ticket specified'); } @@ -67,47 +66,50 @@ if ($ARGS{'id'} eq 'new') { unless ($Queue->CurrentUserHasRight('CreateTicket')) { Abort('You have no permission to create tickets in that queue.'); } - ($Ticket, @Actions) = - CreateTicket(Attachments => $session{'Attachments'}, %ARGS); + ($TicketObj, @Actions) = + CreateTicket(Attachments => $session{'Attachments'}, %ARGS); delete $session{'Attachments'}; - unless ($Ticket->CurrentUserHasRight('ShowTicket')) { - Abort("No permission to view newly created ticket #".$Ticket->id."."); - } + unless ($TicketObj->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view newly created ticket #".$TicketObj->id."."); + } # }}} -} +} else { + if (!$TicketObj) { -else { - $Ticket = LoadTicket($ARGS{'id'}); - unless ($Ticket->CurrentUserHasRight('ShowTicket')) { - Abort("No permission to view ticket"); - } + $TicketObj = RT::Ticket->new($session{'CurrentUser'}); + $TicketObj = LoadTicket($ARGS{'id'}); + unless ($TicketObj->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view ticket"); + } + } -if (defined $ARGS{'Action'}) { - if ($ARGS{'Action'} =~ /^(Steal|Kill|Take|SetTold)$/) { - my $action = $1; - my ($res, $msg)=$Ticket->$action(); - push(@Actions, $msg); - } -} + if (defined $ARGS{'Action'}) { + if ($ARGS{'Action'} =~ /^(Steal|Kill|Take|SetTold)$/) { + my $action = $1; + my ($res, $msg)=$TicketObj->$action(); + push(@Actions, $msg); + } + } - if ( $ARGS{'UpdateContent'} ) { + if ( $ARGS{'UpdateContent'} || $session{'Attachments'}) { $ARGS{'UpdateContent'} =~ s/\r\n/\n/g; - if ( $ARGS{'UpdateContent'} ne '' - && $ARGS{'UpdateContent'} ne "-- \n" - . $session{'CurrentUser'}->UserObj->Signature ) { + if ( $session{'Attachments'} || + ( $ARGS{'UpdateContent'} ne '' + && $ARGS{'UpdateContent'} ne "-- \n" + . $session{'CurrentUser'}->UserObj->Signature )) { $ARGS{UpdateAttachments} = $session{'Attachments'}; ProcessUpdateMessage( ARGSRef => \%ARGS, Actions => \@Actions, - TicketObj => $Ticket ); + TicketObj => $TicketObj ); delete $session{'Attachments'}; } } -#Process status updates -my @BasicActions = ProcessTicketBasics(ARGSRef => \%ARGS, TicketObj=>$Ticket); -my @results = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS); + #Process status updates + my @BasicActions = ProcessTicketBasics(ARGSRef => \%ARGS, TicketObj=>$TicketObj); + my @results = ProcessTicketLinks( TicketObj => $TicketObj, ARGSRef => \%ARGS); -push (@Actions, @BasicActions, @results); + push (@Actions, @BasicActions, @results); } diff --git a/rt/html/Ticket/Elements/AddWatchers b/rt/html/Ticket/Elements/AddWatchers index e9f651593..96dd38f08 100644 --- a/rt/html/Ticket/Elements/AddWatchers +++ b/rt/html/Ticket/Elements/AddWatchers @@ -77,6 +77,7 @@ my ($msg, $Users, $Groups); if ($UserString) { $Users = RT::Users->new($session{'CurrentUser'}); $Users->Limit(FIELD => $UserField, VALUE => $UserString, OPERATOR => $UserOp); + $Users->LimitToPrivileged if $PrivilegedOnly; } if ($GroupString) { @@ -94,4 +95,5 @@ $UserString => undef $GroupField => 'Name' $GroupOp => '=' $GroupString => undef +$PrivilegedOnly => undef diff --git a/rt/html/Ticket/Elements/EditCustomField b/rt/html/Ticket/Elements/EditCustomField index 1fc7d4388..16348061e 100644 --- a/rt/html/Ticket/Elements/EditCustomField +++ b/rt/html/Ticket/Elements/EditCustomField @@ -30,6 +30,8 @@ size="<%$Cols%>" % if ($TicketObj) { value="<%$Values->Count ? $Values->First->Content : ''%>" +% } elsif ($Default) { + value="<%$Default ? $Default : ''%>" % } > % } elsif ($CustomField->Type eq 'FreeformMultiple') { @@ -38,6 +40,8 @@ % while (my $value = $Values->Next ) { % $content .= $value->Content; % } +% } elsif ($Default) { + value="<%$Default ? $Default : ''%>" % } diff --git a/rt/html/Ticket/Elements/EditLinks b/rt/html/Ticket/Elements/EditLinks index 7a522dda6..bdb8a6b7d 100644 --- a/rt/html/Ticket/Elements/EditLinks +++ b/rt/html/Ticket/Elements/EditLinks @@ -35,10 +35,8 @@ <&|/l&>Depends on: % while (my $link = $Ticket->DependsOn->Next) { -% my $member = $link->TargetObj; - <%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> - [<%$member->Status%>]
    + <& ShowLink, URI => $link->TargetURI &>
    % } @@ -48,8 +46,7 @@ % while (my $link = $Ticket->DependedOnBy->Next) { % my $member = $link->BaseObj; - <%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> - [<%$member->Status%>]
    + <& ShowLink, URI => $link->BaseURI &>
    % } @@ -57,10 +54,8 @@ <&|/l&>Parents: % while (my $link = $Ticket->MemberOf->Next) { -% my $member = $link->TargetObj; - <%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> - [<%$member->Status%>]
    + <& ShowLink, URI => $link->TargetURI &>
    % } @@ -69,9 +64,7 @@ % while (my $link = $Ticket->Members->Next) { -% my $member = $link->BaseObj; - <%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> - [<%$member->Status%>]
    + <& ShowLink, URI => $link->BaseURI &>
    % } @@ -80,12 +73,7 @@ % while (my $link = $Ticket->RefersTo->Next) { -% if ($link->TargetURI->IsLocal) { -% my $member = $link->TargetObj; - <%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]
    -% } else { - <%$link->TargetURI->Resolver->AsString%>
    -% } + <& ShowLink, URI => $link->TargetURI &>
    %} @@ -94,12 +82,7 @@ % while (my $link = $Ticket->ReferredToBy->Next) { -% if ($link->BaseURI->IsLocal) { -% my $member = $link->BaseObj; - <%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]
    -% } else { - <%$link->BaseURI->Resolver->AsString%>
    -%} + <& ShowLink, URI => $link->BaseURI &>
    % } diff --git a/rt/html/Ticket/Elements/EditPeople b/rt/html/Ticket/Elements/EditPeople index 1ab8f4ace..a1fc0111a 100644 --- a/rt/html/Ticket/Elements/EditPeople +++ b/rt/html/Ticket/Elements/EditPeople @@ -37,7 +37,7 @@ <& AddWatchers, Ticket => $Ticket, UserString => $UserString, UserOp => $UserOp, UserField => $UserField, GroupString => $GroupString, GroupOp => $GroupOp, - GroupField => $GroupField &> + GroupField => $GroupField, PrivilegedOnly => $PrivilegedOnly &>

    <&|/l&>Owner

    <&|/l&>Owner: <& /Elements/SelectOwner, Name => 'Owner', QueueObj => $Ticket->QueueObj, TicketObj => $Ticket, Default => $Ticket->OwnerObj->Id &> @@ -64,5 +64,6 @@ $UserString => undef $GroupField => undef $GroupOp => undef $GroupString => undef +$PrivilegedOnly => undef $Ticket => undef diff --git a/rt/html/Ticket/Elements/ShowAttachments b/rt/html/Ticket/Elements/ShowAttachments index 22b60d11b..590a011fb 100644 --- a/rt/html/Ticket/Elements/ShowAttachments +++ b/rt/html/Ticket/Elements/ShowAttachments @@ -47,7 +47,7 @@ if ($size) {
  • > - <%$rev->CreatedAsString%> (<% $size %>)
  • + <%$rev->CreatedAsString%> (<% $size %>) % } % $fontsize='size="-2"'; % } @@ -63,6 +63,9 @@ my %documents; my $transactions = $Ticket->Transactions(); while (my $trans = $transactions->Next()) { my $attachments = $trans->Attachments(); + $attachments->Columns( qw( Id Filename ContentType Headers Subject Parent ContentEncoding ContentType TransactionId) ); + $attachments->Limit(FIELD => 'Filename', OPERATOR => 'IS NOT', VALUE => 'NULL', QUOTEVALUE => 0, ENTRYAGGREGATOR => 'AND'); + $attachments->Limit(FIELD => 'Filename', OPERATOR => '!=', VALUE => '', ENTRYAGGREGATOR => 'AND'); while (my $attach = $attachments->Next()) { next unless ($attach->Filename()); # most recent at the top diff --git a/rt/html/Ticket/Elements/ShowDates b/rt/html/Ticket/Elements/ShowDates index da7f75bb6..b09b4bf7b 100644 --- a/rt/html/Ticket/Elements/ShowDates +++ b/rt/html/Ticket/Elements/ShowDates @@ -21,6 +21,7 @@ %# %# %# END LICENSE BLOCK + @@ -35,7 +36,7 @@ - + @@ -48,9 +49,15 @@ - +% my $UpdatedString = $Ticket->LastUpdated ? (loc("[_1] by [_2]", $Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)) : loc("Never"); +% if ($UpdatedLink) { + +% } else { + +% }
    <&|/l&>Created:<% $Ticket->StartedObj->AsString %>
    <&|/l&>Last Contact:<&|/l&>Last Contact: <% $Ticket->ToldObj->AsString %>
    <&|/l&>Updated:<% $Ticket->LastUpdated ? (loc("[_1] by [_2]", $Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)) : loc("Never") | h %><% $UpdatedString | h %><% $UpdatedString | h %>
    <%ARGS> $Ticket => undef +$UpdatedLink => 1 diff --git a/rt/html/Ticket/Elements/ShowHistory b/rt/html/Ticket/Elements/ShowHistory index 2958f8706..194be9b37 100644 --- a/rt/html/Ticket/Elements/ShowHistory +++ b/rt/html/Ticket/Elements/ShowHistory @@ -62,7 +62,7 @@ else { % if ($Transactions->IsLast) { % } - <& ShowTransaction, Ticket => $Ticket, Transaction => $Transaction, ShowHeaders => $ShowHeaders, Collapsed => $Collapsed, RowNum => $i, ShowTitleBarCommands => $ShowTitleBarCommands &> + <& ShowTransaction, Ticket => $Ticket, Transaction => $Transaction, ShowHeaders => $ShowHeaders, Collapsed => $Collapsed, RowNum => $i, ShowTitleBarCommands => $ShowTitleBarCommands, %ARGS &> % } % if ($ShowDisplayModes or $ShowTitle) { diff --git a/rt/html/Ticket/Elements/ShowMessageStanza b/rt/html/Ticket/Elements/ShowMessageStanza index b0998068f..8e3045a36 100644 --- a/rt/html/Ticket/Elements/ShowMessageStanza +++ b/rt/html/Ticket/Elements/ShowMessageStanza @@ -21,6 +21,8 @@ %# %# %# END LICENSE BLOCK +% if (ref($Message)) { + <%perl> foreach my $stanza (@$Message) { if ( ref $stanza eq "ARRAY" ) { @@ -36,8 +38,16 @@ foreach my $stanza (@$Message) { $content =~ s/\n/
    /gi; -<%$content |n%>
    +<%$content |n%>
    % } +% } # end foreach +
    +% } else { +% my $content = $Message; +% RT::Interface::Web::EscapeUTF8(\$content); +% $m->comp('/Elements/Callback', content => \$content, %ARGS); +% $content =~ s/\n/
    /gi; +<%$content |n%>
    % } <%INIT> use URI::URL; diff --git a/rt/html/Ticket/Elements/ShowPeople b/rt/html/Ticket/Elements/ShowPeople index 0b8026949..160da70d9 100644 --- a/rt/html/Ticket/Elements/ShowPeople +++ b/rt/html/Ticket/Elements/ShowPeople @@ -27,15 +27,15 @@ <%$Ticket->OwnerObj->Name%> - <&|/l&>Requestors: + <&|/l&>Requestors: <%$Ticket->RequestorAddresses%> - <&|/l&>Cc: + <&|/l&>Cc: <%$Ticket->CcAddresses%> - <&|/l&>AdminCc: + <&|/l&>AdminCc: <%$Ticket->AdminCcAddresses%> diff --git a/rt/html/Ticket/Elements/ShowTransaction b/rt/html/Ticket/Elements/ShowTransaction index f2f89d35c..2d710fcbc 100644 --- a/rt/html/Ticket/Elements/ShowTransaction +++ b/rt/html/Ticket/Elements/ShowTransaction @@ -38,8 +38,6 @@ unless ($Collapsed) { $attachments->GotoFirstItem; while (my $message=$attachments->Next) { - #we don't want to show any empty transactions, unless they have kids - next unless ($message->ContentLength || $message->Children->Count); my ($headers, $quoted); if ($ShowHeaders && ($ShowHeaders == $Ticket->Id)) { @@ -53,11 +51,18 @@ unless ($Collapsed) { eval {$headers =~ s/^([^:]+)(?=:)/loc($1)/em; } # we eval here to catch errors when 5.6 panics } # 13456 is a random # of about the biggest size we want to see inline text - my $MAX_INLINE_BODY = 13456; + # It's here to catch anyone who hasn't updated RT_Config.pm since this + # constant was moved out there. + my $MAX_INLINE_BODY = $RT::MaxInlineBody || 13456; if ($message->ContentType =~ m{^(text/plain|message|text$)}i && $message->ContentLength < $MAX_INLINE_BODY ) { + eval { require Text::Quoted; - $quoted = Text::Quoted::extract($message->Content); + $quoted = Text::Quoted::extract($message->Content); + }; + if ($@) { + $quoted = $message->Content; + } } @@ -69,7 +74,12 @@ unless ($Collapsed) {
     <& ShowMessageHeaders, Headers => $headers, Transaction => $Transaction &>
     
    +% if (!length($quoted) && $message->ContentType =~ m#^text/#) { +
    <&|/l&>Message body not shown because it is too large or is not plain text.
    +<&|/l&>You can access it with the Download button on the right.
    +% } else { <& ShowMessageStanza, Depth => 0, Message => $quoted, Transaction => $Transaction &> +% } @@ -78,7 +88,7 @@ unless ($Collapsed) {
    % } <%PERL> -my $size = $message->ContentLength; +my $size = $message->ContentLength or next; if ($size) { if ($size > 1024) { @@ -88,7 +98,7 @@ if ($size) { $size = loc("[_1]b", $size); } -<&|/l&>Download <% $message->Filename|| loc('(untitled)') %> <% $size %> +<&|/l&>Download <% $message->Filename|| loc('(untitled)') %> <% $size %> % } @@ -104,6 +114,7 @@ $ShowHeaders => 0 $Collapsed => undef $ShowTitleBarCommands => 1 $RowNum => 1 +$AttachPath => $RT::WebPath."/Ticket/Attachment" <%INIT> @@ -147,6 +158,7 @@ if ($Transaction->TimeTaken > 0) { $TimeTaken = $Transaction->TimeTaken." min" } my $attachments = $Transaction->Attachments; +$attachments->Columns( qw( Id Filename ContentType Headers Subject Parent ContentEncoding ContentType TransactionId) ); my $titlebar_commands=' '; diff --git a/rt/html/Ticket/Elements/Tabs b/rt/html/Ticket/Elements/Tabs index 81c92e8c2..cba45df91 100644 --- a/rt/html/Ticket/Elements/Tabs +++ b/rt/html/Ticket/Elements/Tabs @@ -45,11 +45,17 @@ my $id = $Ticket->id(); if ( defined $session{'tickets'} ) { + # we have to update session data if we get new ItemMap + my $updatesession = 1 unless($session{'tickets'}->{'item_map'}); -my $item_map = $session{'tickets'}->ItemMap; + my $item_map = $session{'tickets'}->ItemMap; - # Don't $current_toptab = display prev links if we're on the first ticket + if ($updatesession) { + $session{'i'}++; + $session{'tickets'}->PrepForSerialization(); + } + # Don't $current_toptab = display prev links if we're on the first ticket if ($item_map->{$Ticket->Id}->{prev}) { $searchtabs->{'_a'} = { class => "nav", diff --git a/rt/html/Ticket/Modify.html b/rt/html/Ticket/Modify.html index c97fd0994..e504a3cba 100644 --- a/rt/html/Ticket/Modify.html +++ b/rt/html/Ticket/Modify.html @@ -46,7 +46,7 @@ my $CustomFields = $TicketObj->QueueObj->CustomFields(); $m->comp('/Elements/Callback', TicketObj => $TicketObj, CustomFields => $CustomFields, %ARGS); my @results = ProcessTicketBasics(TicketObj => $TicketObj, ARGSRef => \%ARGS); -my @cf_results = ProcessTicketCustomFieldUpdates(ARGSRef => \%ARGS); +my @cf_results = ProcessTicketCustomFieldUpdates(TicketObj => $TicketObj, ARGSRef => \%ARGS); push (@results, @cf_results); # TODO: display the results, even if we can't display the ticket diff --git a/rt/html/Ticket/ModifyAll.html b/rt/html/Ticket/ModifyAll.html index a50689398..1163f3fa5 100644 --- a/rt/html/Ticket/ModifyAll.html +++ b/rt/html/Ticket/ModifyAll.html @@ -115,7 +115,7 @@ my (@wresults, @results, @dresults, @lresults, @cf_results); unless ($OnlySearchForPeople) { @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS); @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS); - @cf_results = ProcessTicketCustomFieldUpdates(ARGSRef => \%ARGS); + @cf_results = ProcessTicketCustomFieldUpdates( TicketObj => $Ticket, ARGSRef => \%ARGS); @dresults = ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS); @lresults = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS); diff --git a/rt/html/Ticket/ModifyPeople.html b/rt/html/Ticket/ModifyPeople.html index 2e41664d9..debd27a97 100644 --- a/rt/html/Ticket/ModifyPeople.html +++ b/rt/html/Ticket/ModifyPeople.html @@ -44,7 +44,7 @@ my (@results, @wresults); my $Ticket = LoadTicket($id); # if we're trying to search for watchers and nothing else -unless ($OnlySearchForPeople) { +unless ($OnlySearchForPeople or $OnlySearchForGroup) { @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS); @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS); } @@ -56,6 +56,7 @@ push @results, @wresults; <%ARGS> $OnlySearchForPeople => undef +$OnlySearchForGroup => undef $UserField => undef $UserOp => undef $UserString => undef diff --git a/rt/html/Ticket/Update.html b/rt/html/Ticket/Update.html index e19aacf6a..ad3b21787 100644 --- a/rt/html/Ticket/Update.html +++ b/rt/html/Ticket/Update.html @@ -23,7 +23,7 @@ %# END LICENSE BLOCK <& /Elements/Header, Title => $title &> <& /Ticket/Elements/Tabs, - Ticket => $Ticket , + Ticket => $TicketObj, Title=> $title &>
    -<&|/l&>Ticket watchers +<&|/l&>Ticket watchers <&|/l&>Requestor: -<% $Ticket->RequestorAddresses %> +<% $TicketObj->RequestorAddresses %>   <&|/l&>Cc: -<% $Ticket->CcAddresses %> +<% $TicketObj->CcAddresses %>   <&|/l&>AdminCc: -<% $Ticket->AdminCcAddresses %> +<% $TicketObj->AdminCcAddresses %> @@ -60,7 +60,7 @@ <& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &> <&|/l&>Owner: -<& /Elements/SelectOwner, Name=>"Owner", Default => ($ARGS{'Owner'} || $Ticket->OwnerObj->Id()), QueueObj => $Ticket->QueueObj, TicketObj => $Ticket &> +<& /Elements/SelectOwner, Name=>"Owner", Default => ($ARGS{'Owner'} || $TicketObj->OwnerObj->Id()), QueueObj => $TicketObj->QueueObj, TicketObj => $TicketObj &> <&|/l&>Worked: <&|/l&>minutes <&|/l&>Update Type: -<&|/l&>Subject: +<&|/l&>Subject: <&|/l&>Cc: >
    @@ -101,12 +101,12 @@ value=<% $ARGS{UpdateCc} %>>
    <& /Elements/Callback, _CallbackName => 'BeforeMessageBox', %ARGS &> % if (exists $ARGS{UpdateContent}) { % delete $ARGS{'QuoteTransaction'}; -<& /Elements/MessageBox, Name=>"UpdateContent", Default=>$ARGS{UpdateContent}, %ARGS&> +<& /Elements/MessageBox, Name=>"UpdateContent", Default=>$ARGS{UpdateContent}, IncludeSignature => 0, %ARGS&> % } else { <& /Elements/MessageBox, Name=>"UpdateContent", %ARGS &> % } -
    +
    @@ -123,10 +123,10 @@ my $CanRespond = 0; my $CanComment = 0; my $title; -my $Ticket = LoadTicket($id); +my $TicketObj = LoadTicket($id); unless($DefaultStatus){ - $DefaultStatus=($ARGS{'Status'} ||$Ticket->Status()); + $DefaultStatus=($ARGS{'Status'} ||$TicketObj->Status()); } if ($DefaultStatus =~ '^new$'){ @@ -134,9 +134,9 @@ if ($DefaultStatus =~ '^new$'){ } if ($DefaultStatus eq 'resolved') { - $title = loc("Resolve ticket #[_1] ([_2])", $Ticket->id, $Ticket->Subject); + $title = loc("Resolve ticket #[_1] ([_2])", $TicketObj->id, $TicketObj->Subject); } else { - $title = loc("Update ticket #[_1] ([_2])", $Ticket->id, $Ticket->Subject); + $title = loc("Update ticket #[_1] ([_2])", $TicketObj->id, $TicketObj->Subject); } # Things needed in the template - we'll do the processing here, just @@ -150,11 +150,11 @@ if (($Action eq 'Comment') or ($ARGS{'UpdateType'} eq 'private')) { } -$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or - $Ticket->CurrentUserHasRight('ModifyTicket') ); +$CanRespond = 1 if ( $TicketObj->CurrentUserHasRight('ReplyToTicket') or + $TicketObj->CurrentUserHasRight('ModifyTicket') ); -$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or - $Ticket->CurrentUserHasRight('ModifyTicket') ); +$CanComment = 1 if ( $TicketObj->CurrentUserHasRight('CommentOnTicket') or + $TicketObj->CurrentUserHasRight('ModifyTicket') ); # {{{ deal with deleting uploaded attachments @@ -193,7 +193,7 @@ unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) { # }}} if ( exists $ARGS{SubmitTicket} ) { - $m->comp('Display.html', %ARGS); + $m->comp('Display.html', TicketObj => $TicketObj, %ARGS); return; } diff --git a/rt/html/User/Prefs.html b/rt/html/User/Prefs.html index b89fc40ae..c2746a38c 100644 --- a/rt/html/User/Prefs.html +++ b/rt/html/User/Prefs.html @@ -38,21 +38,44 @@ <& /Elements/TitleBoxStart, title => loc('Identity') &> -<&|/l&>Email: -
    -<&|/l&>Real Name: -
    -<&|/l&>Nickname: + + + + + + + + + + + + + + + + +
    <&|/l&>Email:
    <&|/l&>Real Name:
    <&|/l&>Nickname:
    <&|/l&>Language:<& /Elements/SelectLang, Name => 'Lang', Default => $UserObj->Lang &>
    <& /Elements/TitleBoxEnd &>
    <& /Elements/TitleBoxStart, title => loc('Phone numbers') &> -<&|/l&>Residence: -
    -<&|/l&>Work: -
    -<&|/l&>Mobile: -
    -<&|/l&>Pager: + + + + + + + + + + + + + + + + + +
    <&|/l&>Residence:
    <&|/l&>Work:
    <&|/l&>Mobile:
    <&|/l&>Pager:
    <& /Elements/TitleBoxEnd &> @@ -60,44 +83,58 @@ <& /Elements/TitleBoxStart, title => loc('Password') &> - - - -
    + <&|/l&>New Password: +
    +
    <&|/l&>Retype Password: +
    -% } <& /Elements/TitleBoxEnd &> +% } <& /Elements/TitleBoxStart, title => loc('Location') &> -<&|/l&>Organization: -
    -<&|/l&>Address1: -
    -<&|/l&>Address2: -
    -<&|/l&>City: - -<&|/l&>State: - -<&|/l&>Zip: -
    -<&|/l&>Country: -
    - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    <&|/l&>Organization:
    <&|/l&>Address1:
    <&|/l&>Address2:
    <&|/l&>City:
    <&|/l&>State:
    <&|/l&>Zip:
    <&|/l&>Country:
    <& /Elements/TitleBoxEnd &> @@ -147,12 +184,13 @@ if ($UserObj->Id) { Organization RealName NickName Lang EmailEncoding WebEncoding ExternalContactInfoId ContactInfoSystem Gecos ExternalAuthId AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1 - Address2 City State Zip Country + Address2 City State Zip Country Lang ); my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields, Object => $UserObj, ARGSRef => \%ARGS ); + $session{'CurrentUser'}->LanguageHandle($Lang) if $Lang; push (@results,@fieldresults); diff --git a/rt/html/autohandler b/rt/html/autohandler index ce8b7569e..b2a407add 100644 --- a/rt/html/autohandler +++ b/rt/html/autohandler @@ -27,18 +27,24 @@ $RT::Handle->ForceRollback() if $RT::Handle->TransactionDepth; -local *session; +local *session unless $m->is_subrequest; # avoid reentrancy, as suggested by masonbook + +# Disable AutoFlush using an attribute +if ($m->request_comp->attr_exists('AutoFlush')) { + $m->autoflush($m->request_comp->attr('AutoFlush')); +} + %ARGS = map { - # if they've passed multiple values, they'll be an array. if they've passed just one, a scalar - # whatever they are, mark them as utf8 + # if they've passed multiple values, they'll be an array. if they've + # passed just one, a scalar whatever they are, mark them as utf8 my $type = ref($_); (!$type) ? Encode::decode(utf8 => $_, Encode::FB_PERLQQ) : - ($type eq 'ARRAY') + ($type eq 'ARRAY') ? [ map { ref($_) ? $_ : Encode::decode(utf8 => $_, Encode::FB_PERLQQ) } @$_ ] : - ($type eq 'HASH') + ($type eq 'HASH') ? { map { ref($_) ? $_ : Encode::decode(utf8 => $_, Encode::FB_PERLQQ) } %$_ } : $_ -} %ARGS; + } %ARGS; if ($ARGS{'Debug'}) { require Time::HiRes; @@ -65,69 +71,95 @@ if ($m->base_comp->path =~ '^/+NoAuth/' || $m->abort(); } -# If RT is configured for external auth, let's get REMOTE_USER -elsif ($RT::WebExternalAuth and length($ENV{'REMOTE_USER'})) { - my $orig_user = $user; - - $user = $ENV{'REMOTE_USER'}; - $session{'CurrentUser'} = RT::CurrentUser->new(); - my $load_method = $RT::WebExternalGecos ? 'LoadByGecos' : 'Load'; - - if ($^O eq 'MSWin32' and $RT::WebExternalGecos) { - my $NodeName = Win32::NodeName(); - $user =~ s/^\Q$NodeName\E\\//i; - } - - $session{'CurrentUser'}->$load_method($user); - - if ($RT::WebExternalAuto and !$session{'CurrentUser'}->Id() ) { - # Create users on-the-fly with default attributes - - my $UserObj = RT::User->new(RT::CurrentUser->new('root')); - - my ($val, $msg) = $UserObj->Create( - %{ref($RT::AutoCreate) ? $RT::AutoCreate : {}}, - Name => $user, - Gecos => $user, - ); - - if ($val) { - $UserObj->SetPrivileged(1); - - if ($^O !~ /^(?:riscos|MacOS|MSWin32|dos|os2)$/) { - # Populate fields with information from Unix /etc/passwd - - my ($comments, $realname) = (getpwnam($user))[5, 6]; - $UserObj->SetComments($comments) if defined $comments; - $UserObj->SetRealName($realname) if defined $realname; +# If RT is configured for external auth, let's go through and get REMOTE_USER +elsif ( $RT::WebExternalAuth ) { + + # do we actually have a REMOTE_USER equivlent? + if ( RT::Interface::Web::WebCanonicalizeInfo() ) { + + my $orig_user = $user; + + $user = RT::Interface::Web::WebCanonicalizeInfo(); + $session{'CurrentUser'} = RT::CurrentUser->new(); + my $load_method = $RT::WebExternalGecos ? 'LoadByGecos' : 'Load'; + + if ($^O eq 'MSWin32' and $RT::WebExternalGecos) { + my $NodeName = Win32::NodeName(); + $user =~ s/^\Q$NodeName\E\\//i; + } + + $session{'CurrentUser'}->$load_method($user); + + if ($RT::WebExternalAuto and !$session{'CurrentUser'}->Id() ) { + # Create users on-the-fly + + my $UserObj = RT::User->new(RT::CurrentUser->new('root')); + + my ($val, $msg) = $UserObj->Create( + %{ref($RT::AutoCreate) ? $RT::AutoCreate : {}}, + Name => $user, + Gecos => $user, + ); + + if ($val) { + + # now get user specific information, to better create our user. + my $new_user_info = RT::Interface::Web::WebExternalAutoInfo($user); + + # set the attributes that have been defined. + # FIXME: this is a horrible kludge. I'm sure there's something cleaner + foreach my $attribute ('Name', 'Comments', 'Signature', 'EmailAddress', + 'PagerEmailAddress', 'FreeformContactInfo', + 'Organization', 'Disabled', 'Privileged', + 'RealName', 'NickName', 'Lang', 'EmailEncoding', + 'WebEncoding', 'ExternalContactInfoId', + 'ContactInfoSystem', 'ExternalAuthId', 'Gecos', + 'HomePhone', 'WorkPhone', 'MobilePhone', + 'PagerPhone', 'Address1', 'Address2', 'City', + 'State', 'Zip', 'Country') { + + my $method = "Set$attribute"; + $UserObj->$method($new_user_info->{$attribute}) + if( defined $new_user_info->{$attribute} ); + } + $session{'CurrentUser'}->Load($user); } - elsif ($^O eq 'MSWin32' and eval 'use Net::AdminMisc; 1') { - # Populate fields with information from NT domain controller + else { + # we failed to successfully create the user. abort abort abort. + delete $session{'CurrentUser'}; + $m->abort() unless $RT::WebFallbackToInternalAuth; + $m->comp('/Elements/Login', %ARGS, + Error=> loc('Cannot create user: [_1]', $msg)); } - - $session{'CurrentUser'}->Load($user); } - else { + + unless ( $session{'CurrentUser'}->Id() ) { delete $session{'CurrentUser'}; - $m->abort() unless $RT::WebFallbackToInternalAuth; - $m->comp('/Elements/Login', %ARGS, Error=> loc('Cannot create user: [_1]', $msg)); + $user = $orig_user; + + if ( $RT::WebExternalOnly ) { + $m->comp('/Elements/Login', %ARGS, + Error=> loc('You are not an authorized user')); + $m->abort(); + } } } - - unless ( $session{'CurrentUser'}->Id() ) { - delete $session{'CurrentUser'}; - $user = $orig_user; - - if ( $RT::WebExternalOnly ) { - $m->comp('/Elements/Login', %ARGS, Error=> loc('You are not an authorized user')); - $m->abort(); + elsif ($RT::WebFallbackToInternalAuth) { + unless (defined($session{'CurrentUser'})) { + $m->comp('/Elements/Login', %ARGS, + Error=> loc('XXX CHANGEME You are not an authorized user')); + $m->abort(); } + } else { + # WebExternalAuth is set, but we don't have a REMOTE_USER. abort + delete $session{'CurrentUser'} if defined $session{'CurrentUser'}; } } delete $session{'CurrentUser'} unless $session{'CurrentUser'} and defined $session{'CurrentUser'}->Id; + # Process per-page authentication callbacks $m->comp('/Elements/Callback', %ARGS, _CallbackName => 'Auth'); diff --git a/rt/html/index.html b/rt/html/index.html index 39eac8d61..798972d94 100644 --- a/rt/html/index.html +++ b/rt/html/index.html @@ -53,7 +53,8 @@ if ( $ARGS{'q'} ) { $session{'tickets'} = RT::Tickets->new( $session{'CurrentUser'} ); if ( $query =~ m/\@/ ) { - $session{'tickets'}->LimitRequestor( VALUE => $query, + $session{'tickets'}->LimitWatcher( VALUE => $query, + TYPE => 'Requestor', OPERATOR => '=', ); $m->redirect("$RT::WebPath/Search/Listing.html"); } diff --git a/rt/lib/RT.pm b/rt/lib/RT.pm index 90c332bc0..7e941a2b2 100644 --- a/rt/lib/RT.pm +++ b/rt/lib/RT.pm @@ -47,7 +47,7 @@ use vars qw($VERSION $System $SystemUser $Nobody $Handle $Logger $MasonSessionDir ); -$VERSION = '3.0.4'; +$VERSION = '3.0.9'; $CORE_CONFIG_FILE = "/opt/rt3/etc/RT_Config.pm"; $SITE_CONFIG_FILE = "/opt/rt3/etc/RT_SiteConfig.pm"; @@ -117,13 +117,10 @@ sub LoadConfig { =cut sub Init { - require RT::Handle; + #Get a database connection - unless ($Handle && $Handle->dbh->ping) { - $Handle = RT::Handle->new(); - } - $Handle->Connect(); - + ConnectToDatabase(); + #RT's system user is a genuine database user. its id lives here $SystemUser = new RT::CurrentUser(); $SystemUser->LoadByName('RT_System'); @@ -137,6 +134,21 @@ sub Init { InitLogging(); } + +=head2 ConnectToDatabase + +Get a database connection + +=cut + +sub ConnectToDatabase { + require RT::Handle; + unless ($Handle && $Handle->dbh && $Handle->dbh->ping) { + $Handle = RT::Handle->new(); + } + $Handle->Connect(); +} + =head2 InitLogging Create the RT::Logger object. @@ -282,8 +294,15 @@ sub DropSetGIDPermissions { =head1 BUGS +Please report them to rt-3.0-bugs@fsck.com, if you know what's broken and have at least some idea of what needs to be fixed. +If you're not sure what's going on, report them rt-devel@lists.fsck.com. + =head1 SEE ALSO +L +L + + =begin testing diff --git a/rt/lib/RT.pm.in b/rt/lib/RT.pm.in index 065734e2f..14c0d47ca 100644 --- a/rt/lib/RT.pm.in +++ b/rt/lib/RT.pm.in @@ -117,13 +117,10 @@ sub LoadConfig { =cut sub Init { - require RT::Handle; + #Get a database connection - unless ($Handle && $Handle->dbh->ping) { - $Handle = RT::Handle->new(); - } - $Handle->Connect(); - + ConnectToDatabase(); + #RT's system user is a genuine database user. its id lives here $SystemUser = new RT::CurrentUser(); $SystemUser->LoadByName('RT_System'); @@ -137,6 +134,21 @@ sub Init { InitLogging(); } + +=head2 ConnectToDatabase + +Get a database connection + +=cut + +sub ConnectToDatabase { + require RT::Handle; + unless ($Handle && $Handle->dbh && $Handle->dbh->ping) { + $Handle = RT::Handle->new(); + } + $Handle->Connect(); +} + =head2 InitLogging Create the RT::Logger object. @@ -282,8 +294,15 @@ sub DropSetGIDPermissions { =head1 BUGS +Please report them to rt-3.0-bugs@fsck.com, if you know what's broken and have at least some idea of what needs to be fixed. +If you're not sure what's going on, report them rt-devel@lists.fsck.com. + =head1 SEE ALSO +L +L + + =begin testing diff --git a/rt/lib/RT/Action/AutoOpen.pm b/rt/lib/RT/Action/AutoOpen.pm index ea6da1952..7c8c2b89d 100644 --- a/rt/lib/RT/Action/AutoOpen.pm +++ b/rt/lib/RT/Action/AutoOpen.pm @@ -67,7 +67,7 @@ sub Commit { my $oldstatus = $self->TicketObj->Status(); $self->TicketObj->__Set( Field => 'Status', Value => 'open' ); $self->TicketObj->_NewTransaction( - Type => 'Set', + Type => 'Status', Field => 'Status', OldValue => $oldstatus, NewValue => 'open', diff --git a/rt/lib/RT/Action/Autoreply.pm b/rt/lib/RT/Action/Autoreply.pm index 81f7bddfa..f58b8f284 100755 --- a/rt/lib/RT/Action/Autoreply.pm +++ b/rt/lib/RT/Action/Autoreply.pm @@ -74,10 +74,18 @@ sub SetReturnAddress { } unless ($self->TemplateObj->MIMEObj->head->get('From')) { - my $friendly_name = $self->TicketObj->QueueObj->Description || - $self->TicketObj->QueueObj->Name; - $friendly_name =~ s/"/\\"/g; - $self->SetHeader('From', "\"$friendly_name\" <$replyto>"); + if ($RT::UseFriendlyFromLine) { + my $friendly_name = $self->TicketObj->QueueObj->Description || + $self->TicketObj->QueueObj->Name; + $friendly_name =~ s/"/\\"/g; + $self->SetHeader( 'From', + sprintf($RT::FriendlyFromLineFormat, + $self->MIMEEncodeString( $friendly_name, $RT::EmailOutputEncoding ), $replyto), + ); + } + else { + $self->SetHeader( 'From', $replyto ); + } } unless ($self->TemplateObj->MIMEObj->head->get('Reply-To')) { diff --git a/rt/lib/RT/Action/CreateTickets.pm b/rt/lib/RT/Action/CreateTickets.pm index 0ab206771..e1c6f4a9b 100644 --- a/rt/lib/RT/Action/CreateTickets.pm +++ b/rt/lib/RT/Action/CreateTickets.pm @@ -41,7 +41,7 @@ Create one or more tickets according to an externally supplied template. ===Create-Ticket: codereview Subject: Code review for {$Tickets{'TOP'}->Subject} - Depended-On-By: {$Tickets{'TOP'}->Id} + Depended-On-By: TOP Content: Someone has created a ticket. you should review and approve it, so they can finish their work ENDOFCONTENT @@ -84,13 +84,13 @@ After each ticket is created, it's stuffed into a hash called %Tickets so as to be available during the creation of other tickets during the same ScripAction. The hash is prepopulated with the ticket which triggered the ScripAction as $Tickets{'TOP'}; you can also access that ticket using the -shorthand $TOP. +shorthand TOP. A simple example: ===Create-Ticket: codereview Subject: Code review for {$Tickets{'TOP'}->Subject} - Depended-On-By: {$Tickets{'TOP'}->Id} + Depended-On-By: TOP Content: Someone has created a ticket. you should review and approve it, so they can finish their work ENDOFCONTENT @@ -128,8 +128,8 @@ A convoluted example Queue: Approvals Type: Approval AdminCc: {join ("\nAdminCc: ",@admins) } - Depended-On-By: {$Tickets{"TOP"}->Id} - Refers-To: {$Tickets{"TOP"}->Id} + Depended-On-By: TOP + Refers-To: TOP Subject: Approval for ticket: {$Tickets{"TOP"}->Id} - {$Tickets{"TOP"}->Subject} Due: {time + 86400} Content-Type: text/plain @@ -139,7 +139,7 @@ A convoluted example ENDOFCONTENT ===Create-Ticket: two Subject: Manager approval - Depended-On-By: {$Tickets{"TOP"}->Id} + Depended-On-By: TOP Refers-On: {$Tickets{"approval"}->Id} Queue: Approvals Content-Type: text/plain @@ -239,8 +239,8 @@ my $approvals = Queue: Approvals Type: Approval AdminCc: {join ("\nAdminCc: ",@admins) } -Depended-On-By: {$Tickets{"TOP"}->Id} -Refers-To: {$Tickets{"TOP"}->Id} +Depended-On-By: TOP +Refers-To: TOP Subject: Approval for ticket: {$Tickets{"TOP"}->Id} - {$Tickets{"TOP"}->Subject} Due: {time + 86400} Content-Type: text/plain @@ -431,6 +431,8 @@ sub Commit { $args{'requestor'} ||= $self->TicketObj->Requestors->MemberEmailAddresses; + $args{'type'} ||= 'ticket'; + my %ticketargs = ( Queue => $args{'queue'}, Subject=> $args{'subject'}, Status => 'new', @@ -452,7 +454,7 @@ sub Commit { foreach my $key (keys(%args)) { - $key =~ /^customfield-(\d+)$/ or next; + $key =~ /^customfield(\d+)$/ or next; $ticketargs{ "CustomField-" . $1 } = $args{$key}; } diff --git a/rt/lib/RT/Action/SendEmail.pm b/rt/lib/RT/Action/SendEmail.pm index dac8fc8e7..659238088 100755 --- a/rt/lib/RT/Action/SendEmail.pm +++ b/rt/lib/RT/Action/SendEmail.pm @@ -129,7 +129,7 @@ sub Commit { $self->SetHeader( 'Cc', join ( ',', @{ $self->{'Cc'} } ) ) if ( $self->{'Cc'} && @{ $self->{'Cc'} } ); $self->SetHeader( 'Bcc', join ( ',', @{ $self->{'Bcc'} } ) ) - if ( $self->{'Cc'} && @{ $self->{'Bcc'} } ); + if ( $self->{'Bcc'} && @{ $self->{'Bcc'} } ); $self->SetHeader('MIME-Version', '1.0'); @@ -266,7 +266,7 @@ sub SendMessage { and ( !$MIMEObj->head->get('To') ) ); if ( $RT::MailCommand eq 'sendmailpipe' ) { eval { - open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ); + open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ) || die $!; print MAIL $MIMEObj->as_string; close(MAIL); }; diff --git a/rt/lib/RT/Attachment_Overlay.pm b/rt/lib/RT/Attachment_Overlay.pm index d31aa75ad..9086c52f6 100644 --- a/rt/lib/RT/Attachment_Overlay.pm +++ b/rt/lib/RT/Attachment_Overlay.pm @@ -112,8 +112,8 @@ sub Create { #For ease of reference my $Attachment = $args{'Attachment'}; - #if we didn't specify a ticket, we need to bail - if ( $args{'TransactionId'} == 0 ) { + #if we didn't specify a ticket, we need to bail + if ( $args{'TransactionId'} == 0 ) { $RT::Logger->crit( "RT::Attachment->Create couldn't, as you didn't specify a transaction\n" ); return (0); @@ -133,7 +133,9 @@ sub Create { =~ /^.*\bfilename="(.*)"$/ ? $1 : '' }; - if ( $Attachment->parts ) { + # If a message has no bodyhandle, that means that it has subparts (or appears to) + # and we should act accordingly. + unless ( defined $Attachment->bodyhandle ) { $id = $self->SUPER::Create( TransactionId => $args{'TransactionId'}, Parent => 0, @@ -241,6 +243,9 @@ Create an attachment exactly as specified in the named parameters. sub Import { my $self = shift; + my %args = ( ContentEncoding => 'none', + + @_ ); return($self->SUPER::Create(@_)); } @@ -309,11 +314,15 @@ sub OriginalContent { } # Encode::_utf8_on($content); - if (!$enc or $enc eq 'utf8' or $enc eq 'utf-8') { + if (!$enc || $enc eq '' || $enc eq 'utf8' || $enc eq 'utf-8') { # If we somehow fail to do the decode, at least push out the raw bits eval {return( Encode::decode_utf8($content))} || return ($content); } - Encode::from_to($content, 'utf8' => $enc); + + eval { Encode::from_to($content, 'utf8' => $enc);}; + if ($@) { + $RT::Logger->error("Could not convert attachment from assumed utf8 to '$enc' :".$@); + } return $content; } @@ -423,10 +432,13 @@ properly unfolded. =cut sub NiceHeaders { - my $self=shift; - my $hdrs=""; - for (split(/\n/,$self->Headers)) { - $hdrs.="$_\n" if /^(To|From|RT-Send-Cc|Cc|Date|Subject): /i + my $self = shift; + my $hdrs = ""; + my @hdrs = split(/\n/,$self->Headers); + while (my $str = shift @hdrs) { + next unless $str =~ /^(To|From|RT-Send-Cc|Cc|Date|Subject): /i; + $hdrs .= $str . "\n"; + $hdrs .= shift( @hdrs ) . "\n" while ($hdrs[0] =~ /^[ \t]+/); } return $hdrs; } @@ -568,4 +580,13 @@ sub ContentLength { # }}} +# Transactions don't change. by adding this cache congif directiove, we don't lose pathalogically on long tickets. +sub _CacheConfig { + { + 'cache_p' => 1, + 'fast_update_p' => 1, + 'cache_for_sec' => 180, + } +} + 1; diff --git a/rt/lib/RT/Base.pm b/rt/lib/RT/Base.pm index 3b2dcfd3d..47742f8ac 100644 --- a/rt/lib/RT/Base.pm +++ b/rt/lib/RT/Base.pm @@ -23,6 +23,7 @@ # END LICENSE BLOCK package RT::Base; use Carp; +use Scalar::Util; use strict; use vars qw(@EXPORT); @@ -47,12 +48,14 @@ sub CurrentUser { my $self = shift; if (@_) { + $self->{'original_user'} = $self->{'user'}; $self->{'user'} = shift; + Scalar::Util::weaken($self->{'user'}) if (ref($self->{'user'}) && + $self->{'user'} == $self ); } - unless ( $self->{'user'} ) { - $RT::Logger->err( - "$self was created without a CurrentUser\n" . Carp::cluck() ); + unless ( ref( $self->{'user'}) ) { + $RT::Logger->err( "$self was created without a CurrentUser\n" . Carp::cluck() ); return (0); die; } @@ -61,6 +64,16 @@ sub CurrentUser { # }}} +sub OriginalUser { + my $self = shift; + + if (@_) { + $self->{'original_user'} = shift; + Scalar::Util::weaken($self->{'original_user'}) + if (ref($self->{'original_user'}) && $self->{'original_user'} == $self ); + } + return ( $self->{'original_user'} || $self->{'user'} ); +} =item loc LOC_STRING @@ -80,12 +93,14 @@ In english, this would return: sub loc { my $self = shift; - unless ($self->CurrentUser) { + if (my $user = $self->OriginalUser) { + return $user->loc(@_); + } + else { use Carp; Carp::confess("No currentuser"); return ("Critical error:$self has no CurrentUser", $self); } - return($self->CurrentUser->loc(@_)); } eval "require RT::Base_Vendor"; diff --git a/rt/lib/RT/CachedGroupMember_Overlay.pm b/rt/lib/RT/CachedGroupMember_Overlay.pm index f2dc86f0d..8ba7913fa 100644 --- a/rt/lib/RT/CachedGroupMember_Overlay.pm +++ b/rt/lib/RT/CachedGroupMember_Overlay.pm @@ -88,7 +88,7 @@ sub Create { Via => $args{'Via'}, ); unless ($id) { - $RT::Logger->warn( "Couldn't create " + $RT::Logger->warning( "Couldn't create " . $args{'Member'} . " as a cached member of " . $args{'Group'}->Id . " via " @@ -98,7 +98,7 @@ sub Create { if ( $self->__Value('Via') == 0 ) { my ( $vid, $vmsg ) = $self->__Set( Field => 'Via', Value => $id ); unless ($vid) { - $RT::Logger->warn( "Due to a via error, couldn't create " + $RT::Logger->warning( "Due to a via error, couldn't create " . $args{'Member'} . " as a cached member of " . $args{'Group'}->Id . " via " diff --git a/rt/lib/RT/CachedGroupMembers_Overlay.pm b/rt/lib/RT/CachedGroupMembers_Overlay.pm index fd0fd9055..500a54feb 100644 --- a/rt/lib/RT/CachedGroupMembers_Overlay.pm +++ b/rt/lib/RT/CachedGroupMembers_Overlay.pm @@ -136,8 +136,10 @@ sub LimitToGroupsWithMember { my $self = shift; my $member = shift; + + return ($self->Limit( - VALUE => $member, + VALUE => $member || '0', FIELD => 'MemberId', ENTRYAGGREGATOR => 'OR', QUOTEVALUE => 0 diff --git a/rt/lib/RT/CurrentUser.pm b/rt/lib/RT/CurrentUser.pm index 4ca2f9891..7fcc65ce3 100755 --- a/rt/lib/RT/CurrentUser.pm +++ b/rt/lib/RT/CurrentUser.pm @@ -70,7 +70,7 @@ sub _Init { $self->Load($Name); } - $self->CurrentUser($self); + # $self->CurrentUser($self); } # }}} @@ -104,15 +104,13 @@ sub Delete { sub UserObj { my $self = shift; - unless ($self->{'UserObj'}) { use RT::User; - $self->{'UserObj'} = RT::User->new($self); - unless ($self->{'UserObj'}->Load($self->Id)) { + my $user = RT::User->new($self); + + unless ($user->Load($self->Id)) { $RT::Logger->err($self->loc("Couldn't load [_1] from the users database.\n", $self->Id)); } - - } - return ($self->{'UserObj'}); + return ($user); } # }}} @@ -160,6 +158,7 @@ sub _Accessible { Gecos => 'read', RealName => 'read', Password => 'neither', + Lang => 'read', EmailAddress => 'read', Privileged => 'read', IsAdministrator => 'read' @@ -241,6 +240,11 @@ sub Load { if ($identifier !~ /\D/) { $self->SUPER::LoadById($identifier); } + + elsif (UNIVERSAL::isa($identifier,"RT::User")) { + # DWIM if they pass a user in + $self->SUPER::LoadById($identifier->Id); + } else { # This is a bit dangerous, we might get false authen if somebody # uses ambigous userids or real names: @@ -329,6 +333,9 @@ sub LanguageHandle { if ((!defined $self->{'LangHandle'}) || (!UNIVERSAL::can($self->{'LangHandle'}, 'maketext')) || (@_)) { + if ( $self->Lang) { + push @_, $self->Lang; + } $self->{'LangHandle'} = RT::I18N->get_handle(@_); } # Fall back to english. @@ -365,6 +372,19 @@ sub loc_fuzzy { } # }}} + +=head2 CurrentUser + +Return the current currentuser object + +=cut + +sub CurrentUser { + my $self = shift; + return($self); + +} + eval "require RT::CurrentUser_Vendor"; die $@ if ($@ && $@ !~ qr{^Can't locate RT/CurrentUser_Vendor.pm}); eval "require RT::CurrentUser_Local"; diff --git a/rt/lib/RT/CustomField_Overlay.pm b/rt/lib/RT/CustomField_Overlay.pm index 89ef88987..84902a02f 100644 --- a/rt/lib/RT/CustomField_Overlay.pm +++ b/rt/lib/RT/CustomField_Overlay.pm @@ -132,6 +132,12 @@ sub LoadByNameAndQueue { @_, ); + if ($args{'Queue'} =~ /\D/) { + my $QueueObj = RT::Queue->new($self->CurrentUser); + $QueueObj->Load($args{'Queue'}); + $args{'Queue'} = $QueueObj->Id; + } + return ( $self->LoadByCols( Name => $args{'Name'}, Queue => $args{'Queue'} ) ); } diff --git a/rt/lib/RT/EmailParser.pm b/rt/lib/RT/EmailParser.pm index 49f3d5518..bba4d7ec7 100644 --- a/rt/lib/RT/EmailParser.pm +++ b/rt/lib/RT/EmailParser.pm @@ -95,7 +95,7 @@ sub CheckForLoops { #If this instance of RT sent it our, we don't want to take it in my $RTLoop = $head->get("X-RT-Loop-Prevention") || ""; chomp($RTLoop); #remove that newline - if ( $RTLoop =~ /^$RT::rtname/ ) { + if ( $RTLoop =~ /^\Q$RT::rtname\E/o ) { return (1); } @@ -159,28 +159,23 @@ sub ParseMIMEEntityFromSTDIN { # }}} +=head2 ParseMIMEEntityFromScalar $message + +Takes either a scalar or a reference to a scalr which contains a stringified MIME message. +Parses it. + +Returns true if it wins. +Returns false if it loses. + + +=cut sub ParseMIMEEntityFromScalar { my $self = shift; my $message = shift; - # Create a new parser object: - - my $parser = MIME::Parser->new(); - $self->_SetupMIMEParser($parser); - + $self->_DoParse('parse_data', $message); - # TODO: XXX 3.0 we really need to wrap this in an eval { } - unless ( $self->{'entity'} = $parser->parse_data($message) ) { - # Try again, this time without extracting nested messages - $parser->extract_nested_messages(0); - unless ( $self->{'entity'} = $parser->parse_data($message) ) { - $RT::Logger->crit("couldn't parse MIME stream"); - return ( undef); - } - } - $self->_PostProcessNewEntity(); - return (1); } # {{{ ParseMIMEEntityFromFilehandle *FH @@ -195,6 +190,43 @@ sub ParseMIMEEntityFromFileHandle { my $self = shift; my $filehandle = shift; + $self->_DoParse('parse', $filehandle); + +} + +# }}} + +# {{{ ParseMIMEEntityFromFile + +=head2 ParseMIMEEntityFromFile + +Parses a mime entity from a filename passed in as an argument + +=cut + +sub ParseMIMEEntityFromFile { + my $self = shift; + + my $file = shift; + $self->_DoParse('parse_open', $file); +} + +# }}} + +# {{{ _DoParse + +=head2 _DoParse PARSEMETHOD CONTENT + + +A helper for the various parsers to turn around and do the dispatch to the actual parser + +=cut + +sub _DoParse { + my $self = shift; + my $method = shift; + my $file = shift; + # Create a new parser object: my $parser = MIME::Parser->new(); @@ -203,11 +235,11 @@ sub ParseMIMEEntityFromFileHandle { # TODO: XXX 3.0 we really need to wrap this in an eval { } - unless ( $self->{'entity'} = $parser->parse($filehandle) ) { + unless ( $self->{'entity'} = $parser->$method($file) ) { # Try again, this time without extracting nested messages $parser->extract_nested_messages(0); - unless ( $self->{'entity'} = $parser->parse($filehandle) ) { + unless ( $self->{'entity'} = $parser->$method($file) ) { $RT::Logger->crit("couldn't parse MIME stream"); return ( undef); } @@ -218,6 +250,7 @@ sub ParseMIMEEntityFromFileHandle { # }}} + # {{{ _PostProcessNewEntity =head2 _PostProcessNewEntity @@ -250,7 +283,7 @@ sub ParseTicketId { my $Subject = shift; - if ( $Subject =~ s/\[$RT::rtname \#(\d+)\s*\]//i ) { + if ( $Subject =~ s/\[\Q$RT::rtname\E\s+\#(\d+)\s*\]//i ) { my $id = $1; $RT::Logger->debug("Found a ticket ID. It's $id"); return ($id); @@ -762,17 +795,20 @@ sub _SetupMIMEParser { # Set up output directory for files: $parser->output_dir("$AttachmentDir"); + $parser->filer->ignore_filename(1); - #If someone includes a message, don't extract it + + #If someone includes a message, extract it $parser->extract_nested_messages(1); + $parser->extract_uuencode(1); ### default is false + # Set up the prefix for files with auto-generated names: $parser->output_prefix("part"); - # If content length is <= 50000 bytes, store each msg as in-core scalar; - # Else, write to a disk file (the default action): + # do _not_ store each msg as in-core scalar; - $parser->output_to_core(50000); + $parser->output_to_core(0); } # }}} diff --git a/rt/lib/RT/GroupMember_Overlay.pm b/rt/lib/RT/GroupMember_Overlay.pm index 20949f017..9e5bf2189 100644 --- a/rt/lib/RT/GroupMember_Overlay.pm +++ b/rt/lib/RT/GroupMember_Overlay.pm @@ -322,7 +322,7 @@ sub MemberObj { my $self = shift; unless ( defined( $self->{'Member_obj'} ) ) { $self->{'Member_obj'} = RT::Principal->new( $self->CurrentUser ); - $self->{'Member_obj'}->Load( $self->MemberId ); + $self->{'Member_obj'}->Load( $self->MemberId ) if ($self->MemberId); } return ( $self->{'Member_obj'} ); } diff --git a/rt/lib/RT/Group_Overlay.pm b/rt/lib/RT/Group_Overlay.pm index 92150255f..f71fe7f7e 100644 --- a/rt/lib/RT/Group_Overlay.pm +++ b/rt/lib/RT/Group_Overlay.pm @@ -1,3 +1,4 @@ + # BEGIN LICENSE BLOCK # # Copyright (c) 1996-2003 Jesse Vincent @@ -327,8 +328,6 @@ sub LoadSystemInternalGroup { my $identifier = shift; $self->LoadByCols( "Domain" => 'SystemInternal', - "Instance" => '', - "Name" => '', "Type" => $identifier ); } @@ -350,7 +349,7 @@ Takes a param hash with 2 parameters: sub LoadTicketRoleGroup { my $self = shift; - my %args = (Ticket => undef, + my %args = (Ticket => '0', Type => undef, @_); $self->LoadByCols( Domain => 'RT::Ticket-Role', @@ -444,7 +443,7 @@ sub _Create { Description => undef, Domain => undef, Type => undef, - Instance => undef, + Instance => '0', InsideTransaction => undef, @_ ); @@ -466,7 +465,7 @@ sub _Create { Description => $args{'Description'}, Type => $args{'Type'}, Domain => $args{'Domain'}, - Instance => $args{'Instance'} + Instance => ($args{'Instance'} || '0') ); my $id = $self->Id; unless ($id) { @@ -798,22 +797,14 @@ sub UserMembersObj { #If we don't have rights, don't include any results # TODO XXX WHY IS THERE NO ACL CHECK HERE? - my $principals = $users->NewAlias('Principals'); - - $users->Join(ALIAS1 => 'main', FIELD1 => 'id', - ALIAS2 => $principals, FIELD2 => 'ObjectId'); - $users->Limit(ALIAS =>$principals, - FIELD => 'PrincipalType', OPERATOR => '=', VALUE => 'User'); - my $cached_members = $users->NewAlias('CachedGroupMembers'); $users->Join(ALIAS1 => $cached_members, FIELD1 => 'MemberId', - ALIAS2 => $principals, FIELD2 => 'id'); + ALIAS2 => $users->PrincipalsAlias, FIELD2 => 'id'); $users->Limit(ALIAS => $cached_members, FIELD => 'GroupId', OPERATOR => '=', VALUE => $self->PrincipalId); - return ( $users); } @@ -1009,6 +1000,10 @@ sub HasMember { return(undef); } + unless ($principal->Id) { + return(undef); + } + my $member_obj = RT::GroupMember->new( $self->CurrentUser ); $member_obj->LoadByCols( MemberId => $principal->id, GroupId => $self->PrincipalId ); diff --git a/rt/lib/RT/Groups_Overlay.pm b/rt/lib/RT/Groups_Overlay.pm index 3d2c660fe..a9ca44c7d 100644 --- a/rt/lib/RT/Groups_Overlay.pm +++ b/rt/lib/RT/Groups_Overlay.pm @@ -80,7 +80,8 @@ Return only SystemInternal Groups, such as "privileged" "unprivileged" and "ever sub LimitToSystemInternalGroups { my $self = shift; $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'SystemInternal'); - $self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => ''); + # All system internal groups have the same instance. No reason to limit down further + #$self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => '0'); } @@ -98,7 +99,8 @@ Return only UserDefined Groups sub LimitToUserDefinedGroups { my $self = shift; $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'UserDefined'); - $self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => ''); + # All user-defined groups have the same instance. No reason to limit down further + #$self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => ''); } @@ -231,7 +233,7 @@ sub WithRight { my $self = shift; my %args = ( Right => undef, Object => => undef, - IncludeSystemRights => undef, + IncludeSystemRights => 1, IncludeSuperusers => undef, @_ ); @@ -241,11 +243,11 @@ sub WithRight { # {{{ Find only rows where the right granted is the one we're looking up or _possibly_ superuser $self->Limit( ALIAS => $acl, FIELD => 'RightName', - OPERATOR => '=', - VALUE => $args{Right}, + OPERATOR => ($args{Right} ? '=' : 'IS NOT'), + VALUE => $args{Right} || 'NULL', ENTRYAGGREGATOR => 'OR' ); - if ( $args{'IncludeSuperusers'} ) { + if ( $args{'IncludeSuperusers'} and $args{'Right'} ) { $self->Limit( ALIAS => $acl, FIELD => 'RightName', OPERATOR => '=', @@ -254,7 +256,8 @@ sub WithRight { } # }}} - my ($or_check_ticket_roles, $or_check_roles, $or_look_at_object); + my ($or_check_ticket_roles, $or_check_roles); + my $which_object = "$acl.ObjectType = 'RT::System'"; if ( defined $args{'Object'} ) { if ( ref($args{'Object'}) eq 'RT::Ticket' ) { @@ -274,12 +277,18 @@ sub WithRight { " AND main.Type = $acl.PrincipalType AND main.id = $groupprinc.id) "; } - $or_look_at_object = - " OR ($acl.ObjectType = '" . ref($args{'Object'}) . "'" . + if ( $args{'IncludeSystemRights'} ) { + $which_object .= ' OR '; + } + else { + $which_object = ''; + } + $which_object .= + " ($acl.ObjectType = '" . ref($args{'Object'}) . "'" . " AND $acl.ObjectId = " . $args{'Object'}->Id . ") "; } - $self->_AddSubClause( "WhichObject", "($acl.ObjectType = 'RT::System' $or_look_at_object)" ); + $self->_AddSubClause( "WhichObject", "($which_object)" ); $self->_AddSubClause( "WhichGroup", qq{ @@ -294,5 +303,58 @@ sub WithRight { ); } +# {{{ sub LimitToEnabled + +=head2 LimitToEnabled + +Only find items that haven\'t been disabled + +=cut + +sub LimitToEnabled { + my $self = shift; + + my $alias = $self->Join( + TYPE => 'left', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'Principals', + FIELD2 => 'ObjectId' + ); + + $self->Limit( ALIAS => $alias, + FIELD => 'Disabled', + VALUE => '0', + OPERATOR => '=' ); +} +# }}} + +# {{{ sub LimitToDisabled + +=head2 LimitToDeleted + +Only find items that have been deleted. + +=cut + +sub LimitToDeleted { + my $self = shift; + + my $alias = $self->Join( + TYPE => 'left', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'Principals', + FIELD2 => 'ObjectId' + ); + + $self->{'find_disabled_rows'} = 1; + $self->Limit( ALIAS => $alias, + FIELD => 'Disabled', + OPERATOR => '=', + VALUE => '1' + ); +} +# }}} 1; diff --git a/rt/lib/RT/Handle.pm b/rt/lib/RT/Handle.pm index 5cdb65e5b..9b611b903 100644 --- a/rt/lib/RT/Handle.pm +++ b/rt/lib/RT/Handle.pm @@ -60,9 +60,12 @@ Takes nothing. Calls SUPER::Connect with the needed args sub Connect { my $self=shift; -# Unless the database port is a positive integer, we really don't want to pass it. -$self->SUPER::Connect( + if ($RT::DatabaseType eq 'Oracle') { + $ENV{'NLS_LANG'} = ".UTF8"; + } + + $self->SUPER::Connect( User => $RT::DatabaseUser, Password => $RT::DatabasePassword, ); @@ -79,9 +82,11 @@ from the config file. sub BuildDSN { my $self = shift; +# Unless the database port is a positive integer, we really don't want to pass it. $RT::DatabasePort = undef unless (defined $RT::DatabasePort && $RT::DatabasePort =~ /^(\d+)$/); $RT::DatabaseHost = undef unless (defined $RT::DatabaseHost && $RT::DatabaseHost ne ''); + $self->SUPER::BuildDSN(Host => $RT::DatabaseHost, Database => $RT::DatabaseName, Port => $RT::DatabasePort, diff --git a/rt/lib/RT/I18N.pm b/rt/lib/RT/I18N.pm index c013c219e..79c3e8a15 100644 --- a/rt/lib/RT/I18N.pm +++ b/rt/lib/RT/I18N.pm @@ -164,10 +164,14 @@ sub SetMIMEEntityToEncoding { my $charset = _FindOrGuessCharset($entity) or return; # one and only normalization - $charset = 'utf-8' if $charset eq 'utf8'; - $enc = 'utf-8' if $enc eq 'utf8'; + $charset = 'utf-8' if $charset =~ /^utf-?8$/i; + $enc = 'utf-8' if $enc =~ /^utf-?8$/i; - SetMIMEHeadToEncoding($entity->head, $charset => $enc, $preserve_words); + SetMIMEHeadToEncoding( + $entity->head, + _FindOrGuessCharset($entity, 1) => $enc, + $preserve_words + ); my $head = $entity->head; @@ -302,24 +306,26 @@ sub DecodeMIMEWordsToEncoding { # {{{ _FindOrGuessCharset -=head2 _FindOrGuessCharset MIME::Entity +=head2 _FindOrGuessCharset MIME::Entity, $head_only + +When handed a MIME::Entity will first attempt to read what charset the message is encoded in. Failing that, will use Encode::Guess to try to figure it out -When handed a MIME::Entity will first attempt to read what charset the message is encoded in. Failing that, -will use Encode::Guess to try to figure it out +If $head_only is true, only guesses charset for head parts. This is because header's encoding (e.g. filename="...") may be different from that of body's. =cut sub _FindOrGuessCharset { my $entity = shift; + my $head_only = shift; my $head = $entity->head; if ($head->mime_attr("content-type.charset")) { return $head->mime_attr("content-type.charset"); } - if ( $head->mime_type =~ m{^text/}) { + if ( !$head_only and $head->mime_type =~ m{^text/}) { my $body = $entity->bodyhandle or return; - return _GuessCharset( $head->as_string . $body->as_string ); + return _GuessCharset( $body->as_string ); } else { # potentially binary data -- don't guess the body diff --git a/rt/lib/RT/I18N/cs.pm b/rt/lib/RT/I18N/cs.pm index 36e2bc6af..132c3c287 100644 --- a/rt/lib/RT/I18N/cs.pm +++ b/rt/lib/RT/I18N/cs.pm @@ -1,3 +1,26 @@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work 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. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK package RT::I18N::cs; # # CZECH TRANSLATORS COMMENTS see Locale::Maketext::TPJ13 diff --git a/rt/lib/RT/I18N/de.po b/rt/lib/RT/I18N/de.po index 3595aad47..3ffc8fbac 100644 --- a/rt/lib/RT/I18N/de.po +++ b/rt/lib/RT/I18N/de.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: RT 2.1.54\n" "POT-Creation-Date: 2002-06-22 06:06+0200\n" "PO-Revision-Date: 2003-02-20 04:47+0200\n" -"Last-Translator: Florian Bischof \n" +"Last-Translator: Karsten Konrad \n" "Language-Team: RT German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -183,7 +183,7 @@ msgstr "%1 ist kein %2 dieses Stapels mehr." #: lib/RT/Ticket_Overlay.pm:1570 #. ($principal->Object->Name, $args{'Type'}) msgid "%1 is no longer a %2 for this ticket." -msgstr "%1 ist nicht mehr %2 dieser Anfrage." +msgstr "%1 ist nicht mehr %2 dieser Anfrage." #: lib/RT/Ticket_Overlay.pm:3527 #. ($args{'Value'}, $cf->Name) @@ -194,11 +194,24 @@ msgstr "%1 ist kein Wert des benutzerdefinierten Feldes %2 mehr" msgid "%1 isn't a valid Queue id." msgstr "%1 ist keine gültige Stapel-Id." +#: RTFM +msgid "%1 matches" +msgstr "%1 enthält" + + #: html/Ticket/Elements/ShowBasics:36 #. ($TimeWorked) msgid "%1 min" msgstr "%1 Min" +#: html/RTFM/UpdatedArticles:19 +msgid "%1 most recently updated articles" +msgstr "%1 zuletzt überarbeitete Artikel" + +#: RTFM +msgid "%1 newest articles" +msgstr "%1 neueste Artikel" + #: NOT FOUND IN SOURCE msgid "%1 not shown" msgstr "" @@ -279,10 +292,18 @@ msgstr "(Keine benutzerdefinierten Felder)" msgid "(No members)" msgstr "(Keine Mitglieder)" +#: html/RTFM/NewestArticles:35 +msgid "(no name)" +msgstr "(kein Name)" + #: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32 msgid "(No scrips)" msgstr "(Keine Scrips)" +#: html/RTFM/UpdatedArticles.html:36 +msgid "(no Summary)" +msgstr "keine Zusammenfassung" + #: html/Admin/Elements/EditTemplates:31 msgid "(No templates)" msgstr "(Keine Vorlagen)" @@ -552,6 +573,10 @@ msgstr "Administrative CC" msgid "Advanced Search" msgstr "Erweiterte Suche" +#: RTFM +msgid "Advanced Search Criteria" +msgstr "Erweiterte Suchkriterien" + #: html/Elements/SelectDateRelation:36 msgid "After" msgstr "Nach dem" @@ -564,6 +589,10 @@ msgstr "Alter" msgid "All Custom Fields" msgstr "Alle benutzerdefinierten Felder" +#: html/RTFM/Admin/Classes/index.html:57 +msgid "All Classes" +msgstr "Alle Klassen" + #: html/Admin/Queues/index.html:53 msgid "All Queues" msgstr "Alle Stapel" @@ -572,6 +601,14 @@ msgstr "Alle Stapel" msgid "Always sends a message to the requestors independent of message sender" msgstr "" +#: RTFM +msgid "and is not" +msgstr "und ist nicht" + +#: RTFM +msgid "and not" +msgstr "und nicht" + #: html/Elements/Tabs:58 msgid "Approval" msgstr "Freigabe" @@ -610,10 +647,42 @@ msgstr "Freigeben" msgid "Approver's notes: %1" msgstr "Notizen des Freigebenden: %1" +#: html/RTFM/Admin/CustomFields/UserRights.html:117 +msgid "No Class defined" +msgstr "Keine Klasse definiert" + +#: html/RTFM/Admin/CustomFields/Basics.html:69 +msgid "No CustomField" +msgstr "Kein benutzerdef. Feld" + +#: html/RTFM/Admin/CustomFields/GroupRights.html:73 +msgid "No CustomField defined" +msgstr "Kein benutzerdef. Feld definiert" + #: lib/RT/Date.pm:414 msgid "Apr." msgstr "Apr" +#: RTFM +msgid "Are you sure you want to delete this article?" +msgstr "Sind Sie sicher, dass sie diesen Artikel löschen wollen?" + +#: html/RTFM/Article/delete.html:69 +msgid "Article #%1 deleted" +msgstr "Artikel #%1 gelöscht" + +#: html/RTFM/Article/Display.html:46 +msgid "Article #%1: %2" +msgstr "Artikel #%1: %2" + +#: html/RTFM/Article/Display.html:35 +msgid "Article not found" +msgstr "Artikel wurde nicht gefunden" + +#: RTFM +msgid "Articles" +msgstr "Artikel" + #: html/Elements/SelectSortOrder:35 msgid "Ascending" msgstr "aufsteigend" @@ -739,11 +808,11 @@ msgstr "Kann kein Ticket auf sich selbst verweisen lassen!" #: lib/RT/Ticket_Overlay.pm:2787 msgid "Can't merge into a merged ticket. You should never get this error" -msgstr "Konnte das Ticket nicht in ein vereinigtes Ticket vereinigen. Diesen Fehler solltest du niemals sehen" +msgstr "Konnte das Ticket nicht in ein vereinigtes Ticket vereinigen. Diesen Fehler sollten Sie niemals sehen" #: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674 msgid "Can't specifiy both base and target" -msgstr "Du kannst nicht Basis und Ziel gleichzeitig angeben" +msgstr "Sie können Basis und Ziel nicht gleichzeitig angeben" #: html/autohandler:112 #. ($msg) @@ -774,13 +843,33 @@ msgstr "Kinder" msgid "City" msgstr "Stadt" +#: RTFM +msgid "Class" +msgstr "Klasse" + +#: RTFM +msgid "Class is" +msgstr "Klasse ist" + +#: RTFM +msgid "Class Name" +msgstr "Klassenname" + +#: RTFM +msgid "Classes" +msgstr "Klassen" + +#: share/html/SelfService/Closed.html:27 +msgid "closed" +msgstr "geschlossenen" + #: html/Ticket/Elements/ShowDates:47 msgid "Closed" msgstr "Geschlossen" #: html/SelfService/Elements/Tabs:60 -msgid "Closed requests" -msgstr "Geschossene Tickets" +msgid "Closed tickets" +msgstr "Geschlossene Anfragen" #: NOT FOUND IN SOURCE msgid "Command not understood!\\n" @@ -999,6 +1088,14 @@ msgstr "" msgid "Couldn't load %1 from the users database.\\n" msgstr "Konnte %1 nicht aus der Benutzerdatenbank laden.\\n" +#: html/RTFM/Admin/CustomFields/UserRights.html:121 +msgid "Couldn't load Class %1" +msgstr "Konnte die Klasse %1 nicht laden" + +#: html/RTFM/Admin/CustomFields/GroupRights.html:77 +msgid "Couldn't load CustomField %1" +msgstr "Konnte das benutzerdefinierte Feld %1 nicht laden" + #: NOT FOUND IN SOURCE msgid "Couldn't load RT config file '%1' %2" msgstr "" @@ -1056,6 +1153,10 @@ msgstr "Erstellen" msgid "Create Tickets" msgstr "Erstelle Tickets" +#: RTFM +msgid "Create a Class" +msgstr "Erstelle eine Klasse" + #: html/Admin/Elements/EditCustomField:58 msgid "Create a CustomField" msgstr "Erstelle ein benutzerdefiniertes Feld" @@ -1069,6 +1170,10 @@ msgstr "Erstelle ein benutzerdef. Feld für Stapel %1" msgid "Create a CustomField which applies to all queues" msgstr "Erstelle ein benutzerdef. Feld für alle Stapel" +#: html/RTFM/Article/Create.html:19 +msgid "Create a new article" +msgstr "Erstelle einen neuen Artikel" + #: NOT FOUND IN SOURCE msgid "Create a new Custom Field" msgstr "" @@ -1126,13 +1231,25 @@ msgstr "Erstelle ein Scrip für den Stapel %1" msgid "Create a template" msgstr "Erstelle eine Vorlage" +#: html/SelfService/Create.html:24 +msgid "Create a ticket" +msgstr "Neue Anfrage" + +#: RTFM +msgid "Create an article" +msgstr "Erstelle einen Artikel" + +#: RTFM +msgid "Create an article in class..." +msgstr "Erstelle einen Artikel in der Klasse..." + #: etc/initialdata:130 msgid "Create new tickets based on this scrip's template" msgstr "Erstelle neue Tickets basierend auf der Vorlage dieses Scrips" #: html/SelfService/Create.html:81 msgid "Create ticket" -msgstr "Ticket erstellen" +msgstr "Übermitteln" #: lib/RT/Queue_Overlay.pm:84 msgid "Create tickets in this queue" @@ -1166,11 +1283,19 @@ msgstr "" msgid "Created" msgstr "Angelegt" +#: RTFM +msgid "Created by" +msgstr "Angelegt von" + #: html/Admin/Elements/EditCustomField:71 #. ($CustomFieldObj->Name()) msgid "Created CustomField %1" msgstr "Erstelle ein benutzerdefiniertes Feld %1" +#: RTFM +msgid "Created during" +msgstr "Erstellt zwischen" + #: NOT FOUND IN SOURCE msgid "Created template %1" msgstr "" @@ -1316,7 +1441,7 @@ msgstr "Rechte weitergeben" #: lib/RT/System.pm:63 msgid "Delegate specific rights which have been granted to you." -msgstr "Dir gewährte Rechte weitergeben" +msgstr "Ihnen gewährte Rechte weitergeben" #: lib/RT/System.pm:63 msgid "DelegateRights" @@ -1326,9 +1451,13 @@ msgstr "" msgid "Delegation" msgstr "Rechteweitergabe" -#: NOT FOUND IN SOURCE +#: RTFM msgid "Delete" -msgstr "" +msgstr "Löschen" + +#: html/RTFM/Article/delete.html:73 +msgid "Delete article #%1" +msgstr "Lösche Artikel #%1" #: lib/RT/Queue_Overlay.pm:90 msgid "Delete tickets" @@ -1445,6 +1574,10 @@ msgstr "" msgid "Edit Custom Fields for %1" msgstr "Bearbeite benutzerdefinierte Felder für %1" +#: html/RTFM/Admin/Classes/CustomFields.html:73 +msgid "Edit Custom Fields for Class %1" +msgstr "Bearbeite benutzerdefinierte Felder für Klasse %1" + #: html/Ticket/ModifyLinks.html:36 msgid "Edit Relationships" msgstr "Bearbeite Beziehungen" @@ -1466,6 +1599,10 @@ msgstr "Bearbeite Systemvorlagen" msgid "Edit templates for %1" msgstr "" +#: html/RTFM/Admin/Classes/Modify:79 +msgid "Editing Configuration for Class %1" +msgstr "Bearbeite Konfiguration für die Klasse %1" + #: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117 #. ($QueueObj->Name) #. ($QueueObj->Id) @@ -1517,6 +1654,10 @@ msgstr "E-Mail-Adresse" msgid "EmailEncoding" msgstr "E-Mail-Kodierung" +#: RTFM +msgid "Enabled (Unchecking this box disables this Class)" +msgstr "Aktiviert (Abwählen deaktiviert diese Klasse)" + ### muss das überhaupt übersetzt werden??? #: html/Admin/Elements/EditCustomField:36 msgid "Enabled (Unchecking this box disables this custom field)" @@ -1530,6 +1671,10 @@ msgstr "Aktiviert (Abwählen deaktiviert diese Gruppe)" msgid "Enabled (Unchecking this box disables this queue)" msgstr "Aktiviert (Abwählen deaktiviert diesen Stapel)" +#: RTFM +msgid "Enabled Classes" +msgstr "Aktivierte Klassen" + #: html/Admin/Elements/EditCustomFields:99 msgid "Enabled Custom Fields" msgstr "Aktivierte benutzerdefinierte Felder" @@ -1543,6 +1688,10 @@ msgstr "Aktivierte Stapel" msgid "Enabled status %1" msgstr "Status %1 aktiviert" +#: RTFM +msgid "Enter Articles or URIs to link Articles to. Seperate multiple entries with spaces." +msgstr "Artikel oder URIs getrennt durch Leerzeichen eingeben." + #: lib/RT/CustomField_Overlay.pm:361 msgid "Enter multiple values" msgstr "Mehrere Werte eingeben" @@ -1595,6 +1744,14 @@ msgstr "ExternalContactInfoId" msgid "Extra info" msgstr "Zusatzinformationen" +#: html/RTFM/Article/ExtractIntoClass.html:19 +msgid "Extract article from ticket #%1" +msgstr "Extrahiere Artikel aus Anfrage #%1" + +#: html/RTFM/Article/ExtractFromTicket.html:19 +msgid "Extract article from ticket #%1 into class %2" +msgstr "Extrahiere Artikel aus Anfrage #%1 in die Klasse %2" + #: lib/RT/User_Overlay.pm:302 msgid "Failed to find 'Privileged' users pseudogroup." msgstr "Konnte die Pseudogruppe 'Privileged' nicht finden." @@ -1729,7 +1886,7 @@ msgstr "Gehe zu Seite" #: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25 msgid "Goto ticket" -msgstr "Zeig' Ticket" +msgstr "Zeige Anfrage" #: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78 msgid "Group" @@ -1793,6 +1950,10 @@ msgstr "Hallo %1" msgid "History" msgstr "Historie" +#: html/RTFM/Article/History.html:22 +msgid "History for article #%1" +msgstr "Historie für Artikel #%1" + #: html/Admin/Elements/ModifyUser:68 msgid "HomePhone" msgstr "TelefonZuhause" @@ -1828,7 +1989,7 @@ msgstr "Wenn dieses Werkzeug 'setgid' wäre könnte ein feindlicher lokaler Benu #: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38 msgid "If you've updated anything above, be sure to" -msgstr "Wenn du irgend etwas aktualisiert hast, denke daran hier zu klicken" +msgstr "Wenn Sie irgend etwas aktualisiert haben, denken Sie daran hier zu klicken" #: lib/RT/Interface/Web.pm:860 msgid "Illegal value for %1" @@ -1838,6 +1999,14 @@ msgstr "Unerlaubter Wert für %1" msgid "Immutable field" msgstr "Unveränderbares Feld" +#: RTFM +msgid "in class %1" +msgstr "%1" + +#: RTFM +msgid "Include disabled classes in listing." +msgstr "Zeige auch deaktivierte Klassen an." + #: html/Admin/Elements/EditCustomFields:74 msgid "Include disabled custom fields in listing." msgstr "Zeige auch deaktivierte benutzerdefinierte Felder an." @@ -2157,6 +2326,19 @@ msgstr "Mobil" msgid "MobilePhone" msgstr "Mobiltelefon" +#: RTFM +msgid "Modified" +msgstr "Geändert" + +#: RTFM +msgid "Modify" +msgstr "Ändern" + +#: RTFM +msgid "Modify article #%1" +msgstr "Ändere Artikel #%1" + + #: lib/RT/Queue_Overlay.pm:70 msgid "Modify Access Control List" msgstr "Ändere Zugriffskontrollliste" @@ -2169,6 +2351,10 @@ msgstr "" msgid "Modify Custom Fields which apply to all queues" msgstr "Ändere benutzdefinierte Felder für diesen Stapel" +#: html/RTFM/Admin/CustomFields/GroupRights.html:21 +msgid "Modify group rights for custom field %1" +msgstr "Ändere Gruppenrechte für das benutzerdefinierte Feld %1" + #: lib/RT/Queue_Overlay.pm:73 msgid "Modify Scrip templates for this queue" msgstr "Ändere Scrip-Vorlagen für diesen Stapel" @@ -2374,7 +2560,11 @@ msgstr "Mehrere" #: lib/RT/User_Overlay.pm:179 msgid "Must specify 'Name' attribute" -msgstr "Du musst eine Angabe bei 'Name' machen" +msgstr "Sie müssen eine Angabe bei 'Name' machen" + +#: share/html/SelfService/Elements/MyRequests:32 +msgid "My %1 tickets" +msgstr "Meine %1 Anfragen" #: NOT FOUND IN SOURCE msgid "My Approvals" @@ -2392,6 +2582,10 @@ msgstr "Name" msgid "Name in use" msgstr "Benutzername ist bereits in Gebrauch" +#: RTFM +msgid "Name matches" +msgstr "Name enthält" + #: NOT FOUND IN SOURCE msgid "Need approval from system administrator" msgstr "" @@ -2404,6 +2598,15 @@ msgstr "Niemals" msgid "New" msgstr "Neu" +#: RTFM +msgid "New Article" +msgstr "Neuer Artikel" + +#: RTFM +msgid "New class" +msgstr "Neue Klasse" + + #: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65 msgid "New Password" msgstr "Neues Passwort" @@ -2441,8 +2644,8 @@ msgid "New queue" msgstr "Neuer Stapel" #: html/SelfService/Elements/Tabs:63 -msgid "New request" -msgstr "Neues Ticket" +msgid "New ticket" +msgstr "Neue Anfrage" #: html/Admin/Elements/SelectRights:42 msgid "New rights" @@ -2496,10 +2699,18 @@ msgstr "Spitzname" msgid "Nickname" msgstr "Spitzname" +#: RTFM +msgid "No" +msgstr "Nein" + #: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105 msgid "No CustomField" msgstr "Kein benutzerdefiniertes Feld" +#: html/RTFM/Admin/CustomFields/GrroupRights.html:73 +msgid "No CustomField defined" +msgstr "Kein benutzerdefiniertes Feld definiert" + #: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71 msgid "No Group defined" msgstr "Keine Gruppe definiert" @@ -2777,7 +2988,7 @@ msgid "Open it" msgstr "Öffnen" #: html/SelfService/Elements/Tabs:57 -msgid "Open requests" +msgid "Open tickets" msgstr "Offene Anfragen" #: html/Admin/Users/Prefs.html:41 @@ -2809,6 +3020,10 @@ msgstr "Ursprüngliche Anfrage: #%1" msgid "Over time, priority moves toward" msgstr "Mit der Zeit steigt die Priorität auf" +#: html/RTFM/index.html:19 +msgid "Overview" +msgstr "Übersicht" + #: lib/RT/Queue_Overlay.pm:87 msgid "Own tickets" msgstr "Eigene Anfrage" @@ -3000,6 +3215,10 @@ msgstr "Stapel nicht gefunden" msgid "Queues" msgstr "Stapel" +#: RTFM +msgid "Quick search" +msgstr "Schnellsuche" + #: html/Elements/Login:34 #. ($RT::VERSION) msgid "RT %1" @@ -3047,9 +3266,13 @@ msgstr "RT Fehler" msgid "RT Received mail (%1) from itself." msgstr "" +#: html/RTFM/Error:36 +msgid "RTFM Error" +msgstr "RTFM Fehler" + #: html/SelfService/Closed.html:25 -msgid "RT Self Service / Closed Tickets" -msgstr "RT Selbstbedienung / Geschlossene Anfragen" +msgid "Closed Tickets" +msgstr "Geschlossene Anfragen" #: html/index.html:25 html/index.html:28 msgid "RT at a glance" @@ -3082,13 +3305,17 @@ msgstr "" #: NOT FOUND IN SOURCE msgid "RT has proccessed your commands" -msgstr "RT hat Deine Befehle verarbeitet" +msgstr "RT hat Ihre Befehle verarbeitet" #: html/Elements/Login:83 #. ('2003') msgid "RT is © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>. It is distributed under Version 2 of the GNU General Public License." msgstr "RT © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>. Vertrieben unter der Version 2 of the GNU General Public License." +#: share/html/SelfService/Elements/Tabs:35 +msgid "RT Self Service" +msgstr "RT Selbstbedienung" + #: NOT FOUND IN SOURCE msgid "RT thinks this message may be a bounce" msgstr "" @@ -3318,6 +3545,10 @@ msgstr "" msgid "Search for approvals" msgstr "Suche nach Freigaben" +#: html/RTFM/Article/Search.html:19 +msgid "Search for articles" +msgstr "Artikel suchen" + #: bin/rt-crontool:188 msgid "Security:" msgstr "Sicherheit:" @@ -3326,6 +3557,14 @@ msgstr "Sicherheit:" msgid "SeeQueue" msgstr "" +#: RTFM +msgid "Select a Class" +msgstr "Wähle eine Klasse aus" + +#: RTFM +msgid "Select a Custom Fields" +msgstr "Wähle ein benutzerdefiniertes Feld aus" + #: html/Admin/Groups/index.html:40 msgid "Select a group" msgstr "Wähle eine Gruppe aus" @@ -3338,6 +3577,10 @@ msgstr "" msgid "Select a user" msgstr "Wähle einen Benutzer aus" +#: RTFM +msgid "Select class" +msgstr "Wähle eine Klasse" + #: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36 msgid "Select custom field" msgstr "Wähle ein benutzerdef. Feld" @@ -3364,7 +3607,7 @@ msgstr "Wähle ein Scrip" #: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55 msgid "Select template" -msgstr "Wähle ein Template" +msgstr "Wähle eine Vorlage" #: html/Admin/Elements/UserTabs:49 msgid "Select user" @@ -3422,10 +3665,18 @@ msgstr "Schicke eine Mail an den Inhaber" msgid "Sep." msgstr "Sep" +#: RTFM +msgid "Seperate multiple URLs with spaces" +msgstr "Mehrere URLs getrennt durch Leerzeichen eingeben" + #: NOT FOUND IN SOURCE msgid "Show Results" msgstr "" +#: RTFM +msgid "Show advanced search options..." +msgstr "Zeige erweiterte Suchoptionen an..." + #: html/Approvals/Elements/PendingMyApproval:44 msgid "Show approved requests" msgstr "Zeige freigegebene Anfragen" @@ -3511,10 +3762,23 @@ msgstr "Sortierschlüssel" msgid "Sort results by" msgstr "Sortiere Ergebnisse nach" +#: RTFM +msgid "Sort Order" +msgstr "Sortierreihenfolge" + #: html/Admin/Elements/AddCustomFieldValue:25 msgid "SortOrder" msgstr "Sortierreihenfolge" +#: RTFM +msgid "Summary" +msgstr "Zusammenfassung" + +#: RTFM +msgid "Summary matches" +msgstr "Zusammenfassung enthält" + + #: NOT FOUND IN SOURCE msgid "Stalled" msgstr "" @@ -3587,6 +3851,10 @@ msgid "Submit" msgstr "Übermitteln" #: NOT FOUND IN SOURCE +msgid "Submit Query" +msgstr "Suchen" + +#: NOT FOUND IN SOURCE msgid "Submit Workflow" msgstr "" @@ -3933,6 +4201,10 @@ msgstr "Arbeitszeit" msgid "Time left" msgstr "Übrige Zeit" +#: RTFM +msgid "till" +msgstr "und" + #: html/Elements/Footer:36 msgid "Time to display" msgstr "Benötigte Zeit" @@ -3990,6 +4262,10 @@ msgstr "Di" msgid "Type" msgstr "Typ" +#: html/RTFM/Article/delete.html:59 +msgid "Unable to load article" +msgstr "Artikel kann nicht geladen werden" + #: lib/RT/ScripCondition_Overlay.pm:104 msgid "Unimplemented" msgstr "Nicht implementiert" @@ -4082,6 +4358,10 @@ msgstr "Aktualisierungstyp war weder Korrespondenz noch Kommentar." msgid "Updated" msgstr "Aktualisiert" +#: html/RTFM/Article/ExtractFromTicket.html:26 +msgid "Use the dropdown menus to select which transactions you want to extract into a new RTFM article" +msgstr "Über die Auswahllisten kann bestimmt werden welche Transaktionen in den neuen RTFM Artikel extrahiert werden" + #: NOT FOUND IN SOURCE msgid "User %1 %2: %3\\n" msgstr "" @@ -4223,6 +4503,14 @@ msgstr "Immer wenn ein neuer Kommentar eingeht" msgid "Whenever correspondence comes in" msgstr "Immer wenn neue Korrespondenz eingeht" +#: html/RTFM/Article/Elements/ShowSearchCriteria:64 +msgid "Which refer to" +msgstr "Beziehen sich auf" + +#: html/RTFM/Article/Elements/ShowSearchCriteria:64 +msgid "Which are referred to by " +msgstr "Bezogen von" + #: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52 msgid "Work" msgstr "Arbeit" @@ -4235,17 +4523,21 @@ msgstr "Arbeitstelefon" msgid "Worked" msgstr "Arbeitszeit" +#: RTFM +msgid "Yes" +msgstr "Ja" + #: lib/RT/Ticket_Overlay.pm:3056 msgid "You already own this ticket" -msgstr "Du besitzt diese Anfrage bereits" +msgstr "Sie besitzen diese Anfrage bereits" #: html/autohandler:121 msgid "You are not an authorized user" -msgstr "Du bist kein authorisierter Benutzer" +msgstr "Sie sind kein authorisierter Benutzer" #: lib/RT/Ticket_Overlay.pm:2930 msgid "You can only reassign tickets that you own or that are unowned" -msgstr "Du kannst nur Anfragen ohne Inhaber zuweisen" +msgstr "Sie können nur Anfragen ohne Inhaber zuweisen" #: NOT FOUND IN SOURCE msgid "You don't have permission to view that ticket.\\n" @@ -4254,23 +4546,23 @@ msgstr "" #: docs/design_docs/string-extraction-guide.txt:47 #. ($num, $queue) msgid "You found %1 tickets in queue %2" -msgstr "Du hast %1 Anfragen in Stapel %2 gefunden" +msgstr "Sie haben %1 Anfragen in Stapel %2 gefunden" #: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25 msgid "You have been logged out of RT." -msgstr "Du wurdest von RT abgemeldet." +msgstr "Sie wurden von RT abgemeldet." #: html/SelfService/Display.html:134 msgid "You have no permission to create tickets in that queue." -msgstr "Du hast kein Recht, Anfragen in diesen Stapel anzulegen." +msgstr "Sie haben kein Recht, Anfragen in diesen Stapel anzulegen." #: lib/RT/Ticket_Overlay.pm:1895 msgid "You may not create requests in that queue." -msgstr "Du darfst in diesem Stapel keine Anfragen erstellen" +msgstr "Sie dürfen in diesem Stapel keine Anfragen erstellen" #: html/NoAuth/Logout.html:36 msgid "You're welcome to login again" -msgstr "Du kannst dich gerne wieder anmelden" +msgstr "Sie können sich gerne wieder anmelden" #: html/SelfService/Elements/MyRequests:25 #. ($friendly_status) @@ -4283,11 +4575,11 @@ msgstr "" #: etc/initialdata:429 etc/upgrade/2.1.71:146 msgid "Your request has been approved by %1. Other approvals may still be pending." -msgstr "Deine Anfrage wurde von %1 freigegeben. Andere Freigaben können noch ausstehen." +msgstr "Ihre Anfrage wurde von %1 freigegeben. Andere Freigaben können noch ausstehen." #: etc/initialdata:463 etc/upgrade/2.1.71:180 msgid "Your request has been approved." -msgstr "Deine Anfrage wurde freigegeben." +msgstr "Ihre Anfrage wurde freigegeben." #: NOT FOUND IN SOURCE msgid "Your request was rejected" @@ -4295,11 +4587,11 @@ msgstr "" #: etc/initialdata:384 etc/upgrade/2.1.71:101 msgid "Your request was rejected." -msgstr "Deine Anfrage wurde abgewiesen" +msgstr "Ihre Anfrage wurde abgewiesen" #: html/autohandler:136 html/autohandler:142 msgid "Your username or password is incorrect" -msgstr "Dein Benutzername oder Passwort ist falsch" +msgstr "Ihr Benutzername oder Passwort ist falsch" #: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96 msgid "Zip" diff --git a/rt/lib/RT/I18N/it.po b/rt/lib/RT/I18N/it.po new file mode 100644 index 000000000..55a478ba2 --- /dev/null +++ b/rt/lib/RT/I18N/it.po @@ -0,0 +1,6175 @@ +# translation of it.po to +# translation of it.po to +# translation of it.po to +# translation of it.po to +# translation of it.po to +# translation of it.po to +# Copyright (c) 2002 Jesse Vincent +# root , 2003 +# +msgid "" +msgstr "" +"Project-Id-Version: it\n" +"POT-Creation-Date: 2002-05-02 11:36+0800\n" +"PO-Revision-Date: 2003-07-21 22:20+0200\n" +"Last-Translator: root \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.1\n" + +#: html/Elements/MyRequests:27 +#: html/Elements/MyTickets:27 +msgid "#" +msgstr "n°" + +#. ($QueueObj->id) +#: html/Admin/Queues/Scrip.html:54 +msgid "#%1" +msgstr "n°%1" + +#. ($Ticket->Id, $Ticket->Subject) +#. ($Ticket->id, $Ticket->Subject) +#. ($ticket->Id, $ticket->Subject) +#. ($link->BaseObj->Id, $link->BaseObj->Subject) +#: html/Approvals/Elements/Approve:26 +#: html/Approvals/Elements/ShowDependency:49 +#: html/SelfService/Display.html:24 +#: html/Ticket/Display.html:25 +#: html/Ticket/Display.html:29 +msgid "#%1: %2" +msgstr "n°%1: %2" + +#. ($s, $time_unit) +#: lib/RT/Date.pm:336 +msgid "%1 %2" +msgstr "%1 %2" + +#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}) +#: lib/RT/Tickets_Overlay.pm:770 +msgid "%1 %2 %3" +msgstr "%1 %2 %3" + +#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900)) +#: lib/RT/Date.pm:372 +msgid "%1 %2 %3 %4:%5:%6 %7" +msgstr "%1 %2 %3 %4:%5:%6 %7" + +#. ($cf->Name, $new_value->Content) +#. ($field, $self->NewValue) +#. ($self->Field, $principal->Object->Name) +#: lib/RT/Ticket_Overlay.pm:3504 +#: lib/RT/Transaction_Overlay.pm:556 +#: lib/RT/Transaction_Overlay.pm:598 +msgid "%1 %2 added" +msgstr "%1 %2 aggiunto" + +#. ($s, $time_unit) +#: lib/RT/Date.pm:333 +msgid "%1 %2 ago" +msgstr "%1 %2 fa" + +#. ($cf->Name, $old_value, $new_value->Content) +#. ($field, $self->OldValue, $self->NewValue) +#: lib/RT/Ticket_Overlay.pm:3510 +#: lib/RT/Transaction_Overlay.pm:563 +msgid "%1 %2 changed to %3" +msgstr "%1 %2 cambiato in %3" + +#. ($cf->Name, $old_value) +#. ($field, $self->OldValue) +#. ($self->Field, $principal->Object->Name) +#: lib/RT/Ticket_Overlay.pm:3507 +#: lib/RT/Transaction_Overlay.pm:559 +#: lib/RT/Transaction_Overlay.pm:604 +msgid "%1 %2 deleted" +msgstr "%1 %2 eliminato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 %2 of group %3" +msgstr "%1 %2 del gruppo %3" + +#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name)) +#: html/Admin/Elements/EditScrips:43 +#: html/Admin/Elements/ListGlobalScrips:27 +msgid "%1 %2 with template %3" +msgstr "%1 %2 con il modello %3" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 (%2) %3 this ticket\\n" +msgstr "%1 (%2) %3 questo ticket\\n" + +#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage() )) +#: html/Search/Listing.html:56 +msgid "%1 - %2 shown" +msgstr "Tickets da %1 a %2" + +#. ("--search-argument", "--search") +#. ("--condition-argument", "--condition") +#. ("--action-argument", "--action") +#: bin/rt-crontool:168 +#: bin/rt-crontool:175 +#: bin/rt-crontool:181 +msgid "%1 - An argument to pass to %2" +msgstr "%1 - Un parametro da passare a %2" + +#. ("--verbose") +#: bin/rt-crontool:184 +msgid "%1 - Output status updates to STDOUT" +msgstr "%1 - Lo stato dell'output è stato aggiornato su STDOUT" + +#. ("--action") +#: bin/rt-crontool:178 +msgid "%1 - Specify the action module you want to use" +msgstr "%1 - Specificare l'azione che si vuole eseguire" + +#. ("--condition") +#: bin/rt-crontool:172 +msgid "%1 - Specify the condition module you want to use" +msgstr "%1 - Specificare la condizione che si vuole utilizzare" + +#. ("--search") +#: bin/rt-crontool:165 +msgid "%1 - Specify the search module you want to use" +msgstr "%1 - Specificare la ricerca che si vuole utilizzare" + +#. ($self->Id) +#: lib/RT/ScripAction_Overlay.pm:121 +msgid "%1 ScripAction loaded" +msgstr "%1 ScripAction caricato" + +#. ($args{'Value'}, $cf->Name) +#: lib/RT/Ticket_Overlay.pm:3537 +msgid "%1 added as a value for %2" +msgstr "%1 aggiunto(i) come valore di %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 aliases require a TicketId to work on" +msgstr "gli alias %1 necessitano di un TicketId su cui lavorare" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 aliases require a TicketId to work on " +msgstr "gli alias %1 necessitano di un TicketId su cui lavorare" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 aliases require a TicketId to work on (from %2) %3" +msgstr "gli alias %1 necessitano di un TicketId per funzionare con (dopo %2) %3" + +#. ($args{'Base'}) +#. ($args{'Target'}) +#: lib/RT/Link_Overlay.pm:116 +#: lib/RT/Link_Overlay.pm:123 +msgid "%1 appears to be a local object, but can't be found in the database" +msgstr "%1 sembra essere un oggetto locale, ma è introvabile nel database" + +#. ($self->BriefDescription , $self->CreatorObj->Name) +#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) +#: html/Ticket/Elements/ShowDates:51 +#: lib/RT/Transaction_Overlay.pm:480 +msgid "%1 by %2" +msgstr "%1 per %2" + +#. ($self->Field , ( $self->OldValue || $no_value ) , $self->NewValue) +#. ($self->Field , $q1->Name , $q2->Name) +#. ($self->Field, $t2->AsString, $t1->AsString) +#. ($self->Field, $self->OldValue, $self->NewValue) +#: lib/RT/Transaction_Overlay.pm:534 +#: lib/RT/Transaction_Overlay.pm:623 +#: lib/RT/Transaction_Overlay.pm:632 +#: lib/RT/Transaction_Overlay.pm:635 +msgid "%1 changed from %2 to %3" +msgstr "%1 cambiato(1) da %2 a %3" + +#: lib/RT/Interface/Web.pm:890 +msgid "%1 could not be set to %2." +msgstr "%1 non può essere impostato a %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 couldn't init a transaction (%2)\\n" +msgstr "%1 non ha potuto iniziare una transazione (%2)\\n" + +#. ($self) +#: lib/RT/Ticket_Overlay.pm:2816 +msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent." +msgstr "%1 non ho potuto mettere lo stato a risolto. Il database RT può essere inconsistente." + +#. ($rows) +#: html/Elements/MyTickets:24 +msgid "%1 highest priority tickets I own..." +msgstr "I miei %1 tickets a più alta priorità che possiedo..." + +#. ($rows) +#: html/Elements/MyRequests:24 +msgid "%1 highest priority tickets I requested..." +msgstr "I miei %1 tickets a più alta priorità che ho richiesto..." + +#. ($0) +#: bin/rt-crontool:160 +msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron." +msgstr "%1 è uno strumento per lavorare sui tickets da uno schedulatore esterno, come cron" + +#. ($principal->Object->Name, $args{'Type'}) +#: lib/RT/Queue_Overlay.pm:742 +msgid "%1 is no longer a %2 for this queue." +msgstr "%1 non è più un %2 per questa coda." + +#. ($principal->Object->Name, $args{'Type'}) +#: lib/RT/Ticket_Overlay.pm:1569 +msgid "%1 is no longer a %2 for this ticket." +msgstr "%1 non è più un %2 per questo ticket." + +#. ($args{'Value'}, $cf->Name) +#: lib/RT/Ticket_Overlay.pm:3593 +msgid "%1 is no longer a value for custom field %2" +msgstr "%1 non è più un valore per il campo personalizzato %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 isn't a valid Queue id." +msgstr "%1 non è un identificativo di coda valido" + +#. ($TimeWorked) +#: html/Ticket/Elements/ShowBasics:35 +msgid "%1 min" +msgstr "%1 min" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 not shown" +msgstr "%1 non mostrato" + +#. (loc($ObjectType =~ /^RT::(.*)$/)) +#: html/User/Elements/DelegateRights:75 +msgid "%1 rights" +msgstr "Diritti di %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 succeeded\\n" +msgstr "%1 riuscito\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 type unknown for $MessageId" +msgstr "Tipo %1 sconosciuto per $MessageId" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 type unknown for %2" +msgstr "Tipo %1 sconosciuto per %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 was created without a CurrentUser\\n" +msgstr "%1 è stato creato senza un CurrentUser\\n" + +#. (ref $self) +#: lib/RT/Action/ResolveMembers.pm:41 +msgid "%1 will resolve all members of a resolved group ticket." +msgstr "%1 risolverà tutti i membri di un gruppo di ticket risolto." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request." +msgstr "%1 bloccherà una BASE [locale] se dipende o è membro di una richeista linkata." + +#. ($self) +#: lib/RT/Transaction_Overlay.pm:432 +msgid "%1: no attachment specified" +msgstr "%1: nessun allegato specificato" + +#. ($size) +#: html/Ticket/Elements/ShowTransaction:101 +msgid "%1b" +msgstr "%1b" + +#. (int($size/102.4)/10) +#: html/Ticket/Elements/ShowTransaction:98 +msgid "%1k" +msgstr "%1k" + +#. ($args{'Status'}) +#: lib/RT/Ticket_Overlay.pm:1139 +msgid "'%1' is an invalid value for status" +msgstr "'%1' è uno stato non valido" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "'%1' not a recognized action. " +msgstr "'%1' non è un'azione conosciuta. " + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(Check box to delete group member)" +msgstr "(Spunta la casella per cancellare il membro di un gruppo)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(Check box to delete scrip)" +msgstr "(Spunta la casella per cancellare uno scrip)" + +#: html/Admin/Elements/EditCustomFieldValues:24 +#: html/Admin/Elements/EditQueueWatchers:28 +#: html/Admin/Elements/EditScrips:34 +#: html/Admin/Elements/EditTemplates:35 +#: html/Admin/Groups/Members.html:51 +#: html/Ticket/Elements/EditLinks:32 +#: html/Ticket/Elements/EditPeople:45 +#: html/User/Groups/Members.html:54 +msgid "(Check box to delete)" +msgstr "(Spunta la casella per cancellare)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(Check boxes to delete)" +msgstr "(Spunta la casella per cancellare)" + +#: html/Ticket/Create.html:177 +msgid "(Enter ticket ids or URLs, seperated with spaces)" +msgstr "(Inserire il numero di tickets o gli URL, separati da spazi)" + +#. ($RT::CorrespondAddress) +#. ($RT::CommentAddress) +#: html/Admin/Queues/Modify.html:53 +#: html/Admin/Queues/Modify.html:59 +msgid "(If left blank, will default to %1" +msgstr "Se lasciato vuoto, valore di default : %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(No Value)" +msgstr "(Nessun Valore)" + +#: html/Admin/Elements/EditCustomFields:32 +#: html/Admin/Elements/ListGlobalCustomFields:31 +msgid "(No custom fields)" +msgstr "Non ci sono campi personalizzati" + +#: html/Admin/Groups/Members.html:49 +#: html/User/Groups/Members.html:52 +msgid "(No members)" +msgstr "(Nessun membro)" + +#: html/Admin/Elements/EditScrips:31 +#: html/Admin/Elements/ListGlobalScrips:31 +msgid "(No scrips)" +msgstr "(Nessuno Scrip)" + +#: html/Admin/Elements/EditTemplates:30 +msgid "(No templates)" +msgstr "Nessun modello" + +#: html/Ticket/Update.html:84 +msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will receive future updates.)" +msgstr "(Invia per copia nascosta questo aggiornamento ad una lista di indirizzi email separati da virgole. Ciò non cambierà i destinatari dei successivi aggiornamenti.)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will recieve future updates.)" +msgstr "(Invia per copia nascosta questo aggiornamento ad una lista di indirizzi email separati da virgole. Ciò non cambierà i destinatari dei successivi aggiornamenti.)" + +#: html/Ticket/Create.html:78 +msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people will receive future updates.)" +msgstr "(Invia una copia di questo aggiornamento ad una lista di indirizzi email amministrativi separati da virgole. Queste persone riceveranno i successivi aggiornamenti.)" + +#: html/Ticket/Update.html:80 +msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will receive future updates.)" +msgstr "(Invia una copia di questo aggiornamento ad una lista di indirizzi email separati da virgole. Ciò non cambierà i destinatari dei successivi aggiornamenti.)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will recieve future updates.)" +msgstr "(Invia una copia di questo aggiornamento ad una lista di indirizzi email separati da virgole. Ciò non cambierà i destinatari dei successivi aggiornamenti.)" + +#: html/Ticket/Create.html:68 +msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people will receive future updates.)" +msgstr "(Invia una copia di questo aggiornamento ad una lista di indirizzi email separati da virgole. Queste persone riceveranno i successivi aggiornamenti.)" + +#: html/Admin/Groups/index.html:32 +#: html/User/Groups/index.html:32 +msgid "(empty)" +msgstr "(vuoto)" + +#: html/Admin/Users/index.html:38 +msgid "(no name listed)" +msgstr "(nessun nome)" + +#: html/Elements/MyRequests:42 +#: html/Elements/MyTickets:44 +msgid "(no subject)" +msgstr "(nessun oggetto)" + +#: html/Admin/Elements/SelectRights:47 +#: html/Elements/SelectCustomFieldValue:29 +#: html/Ticket/Elements/EditCustomField:58 +#: html/Ticket/Elements/ShowCustomFields:35 +#: lib/RT/Transaction_Overlay.pm:533 +msgid "(no value)" +msgstr "(nessun valore)" + +#: html/Ticket/Elements/EditLinks:115 +msgid "(only one ticket)" +msgstr "(solo un ticket)" + +#: html/Elements/MyRequests:51 +#: html/Elements/MyTickets:54 +msgid "(pending approval)" +msgstr "(in attesa di approvazione)" + +#: html/Elements/MyRequests:53 +#: html/Elements/MyTickets:56 +msgid "(pending other tickets)" +msgstr "(in attea di altri tickets)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "(requestor's group)" +msgstr "(gruppo del richiedente)" + +#: html/Admin/Users/Modify.html:49 +msgid "(required)" +msgstr "(richiesto)" + +#: html/Ticket/Elements/ShowTransaction:104 +msgid "(untitled)" +msgstr "(senza titolo)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "25 highest priority tickets I own..." +msgstr "I miei 25 tickets che devo trattare con priorità più alta..." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "25 highest priority tickets I requested..." +msgstr "I miei 25 tickets che hor ichiesto con priorità più alta..." + +#: html/Ticket/Elements/ShowBasics:31 +msgid "<% $Ticket->Status%>" +msgstr "<% $Ticket->Status%>" + +#: html/Elements/SelectTicketTypes:26 +msgid "<% $_ %>" +msgstr "" + +#. ($m->scomp('/Elements/SelectNewTicketQueue')) +#: docs/design_docs/string-extraction-guide.txt:54 +#: html/Elements/CreateTicket:25 +msgid " %1" +msgstr " %1" + +#: etc/initialdata:203 +msgid "A blank template" +msgstr "Un modello vuoto" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "ACE Deleted" +msgstr "ACE Eliminata" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "ACE Loaded" +msgstr "ACE Caricata" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "ACE could not be deleted" +msgstr "l'ACE non è stato possibile elimanarla" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "ACE could not be found" +msgstr "l'ACE non è stato possibile trovarla" + +#: lib/RT/ACE_Overlay.pm:156 +#: lib/RT/Principal_Overlay.pm:180 +msgid "ACE not found" +msgstr "ACE non trovata" + +#: lib/RT/ACE_Overlay.pm:830 +msgid "ACEs can only be created and deleted." +msgstr "Le ACE possono essere solo create e cancellate." + +#: bin/rt-commit-handler:754 +msgid "Aborting to avoid unintended ticket modifications.\\n" +msgstr "Interruzione per evitare modifiche di ticket involontarie.\\n" + +#: html/User/Elements/Tabs:31 +msgid "About me" +msgstr "A proposito" + +#: html/Admin/Users/Modify.html:79 +msgid "Access control" +msgstr "Controllo di Accesso" + +#: html/Admin/Elements/EditScrip:56 +msgid "Action" +msgstr "Azione" + +#. ($args{'ScripAction'}) +#: lib/RT/Scrip_Overlay.pm:146 +msgid "Action %1 not found" +msgstr "Azione %1 non trovata" + +#: bin/rt-crontool:122 +msgid "Action committed." +msgstr "Azione eseguita." + +#: bin/rt-crontool:118 +msgid "Action prepared..." +msgstr "Azione preparata..." + +#: html/Search/Bulk.html:91 +msgid "Add AdminCc" +msgstr "Aggiungi AdminCC" + +#: html/Search/Bulk.html:89 +msgid "Add Cc" +msgstr "Aggiungi CC" + +#: html/Ticket/Create.html:113 +#: html/Ticket/Update.html:99 +msgid "Add More Files" +msgstr "Aggiungi Altri Files" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Add Next State" +msgstr "Aggiungi lo Stato Sucessivo" + +#: html/Search/Bulk.html:87 +msgid "Add Requestor" +msgstr "Aggiungi il Richiedente" + +#: html/Admin/Elements/AddCustomFieldValue:24 +msgid "Add Value" +msgstr "Aggiungi un Valore" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Add a keyword selection to this queue" +msgstr "Aggiungi una selezione di parole chiave a questa coda" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Add a new a global scrip" +msgstr "Aggiungi un nuovo scrip globale" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Add a scrip to this queue" +msgstr "Aggiungi uno scrip a questa coda" + +#: html/Admin/Global/Scrip.html:54 +msgid "Add a scrip which will apply to all queues" +msgstr "Aggiungi uno scrip da applicare a tutte le code" + +#: html/Search/Bulk.html:117 +msgid "Add comments or replies to selected tickets" +msgstr "Agiungere commenti o repliche ai tickets selezionati" + +#: html/Admin/Groups/Members.html:41 +#: html/User/Groups/Members.html:38 +msgid "Add members" +msgstr "Aggiungi membri" + +#: html/Admin/Queues/People.html:65 +#: html/Ticket/Elements/AddWatchers:27 +msgid "Add new watchers" +msgstr "Aggiungi nuovi osservatori" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "AddNextState" +msgstr "AggiungereStatoSuccessivo" + +#. ($args{'Type'}) +#: lib/RT/Queue_Overlay.pm:642 +msgid "Added principal as a %1 for this queue" +msgstr "Aggiunto gruppo/utente come %1 per questa coda" + +#. ($self->loc($args{'Type'})) +#: lib/RT/Ticket_Overlay.pm:1453 +msgid "Added principal as a %1 for this ticket" +msgstr "Aggiunto gruppo/utente come %1 per questo ticket" + +#: html/Admin/Elements/ModifyUser:75 +#: html/Admin/Users/Modify.html:121 +#: html/User/Prefs.html:87 +msgid "Address1" +msgstr "Inidirizzo1" + +#: html/Admin/Elements/ModifyUser:77 +#: html/Admin/Users/Modify.html:126 +#: html/User/Prefs.html:89 +msgid "Address2" +msgstr "Indirizzo2" + +#: html/Ticket/Create.html:73 +msgid "Admin Cc" +msgstr "Admin Cc" + +#: etc/initialdata:280 +msgid "Admin Comment" +msgstr "Commento Amministrativo" + +#: etc/initialdata:259 +msgid "Admin Correspondence" +msgstr "Corrispondenza Amministrativa " + +#: html/Admin/Queues/index.html:24 +#: html/Admin/Queues/index.html:27 +msgid "Admin queues" +msgstr "Amministra le code" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Admin users" +msgstr "Amministra gli Utenti" + +#: html/Admin/Global/index.html:25 +#: html/Admin/Global/index.html:27 +msgid "Admin/Global configuration" +msgstr "configurazione Amministratore/Globale" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Admin/Groups" +msgstr "Amministra/Gruppi" + +#: html/Admin/Queues/Modify.html:24 +#: html/Admin/Queues/Modify.html:28 +msgid "Admin/Queue/Basics" +msgstr "Amministra/Code/Base" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "AdminAllPersonalGroups" +msgstr "AmministraTuttiIGruppiPersonali" + +#: etc/initialdata:56 +#: html/Ticket/Elements/ShowPeople:38 +#: html/Ticket/Update.html:49 +#: lib/RT/ACE_Overlay.pm:88 +msgid "AdminCc" +msgstr "AdminCc" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "AdminComment" +msgstr "CommentoAmministratore" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "AdminCorrespondence" +msgstr "CorrispondenzaAmministratore" + +#: lib/RT/Queue_Overlay.pm:71 +msgid "AdminCustomFields" +msgstr "AmministraCampiPersonalizzati" + +#: lib/RT/Group_Overlay.pm:145 +msgid "AdminGroup" +msgstr "AmministraGruppi" + +#: lib/RT/Group_Overlay.pm:147 +msgid "AdminGroupMembership" +msgstr "AmministraAppartenenzaGruppi" + +#: lib/RT/System.pm:58 +msgid "AdminOwnPersonalGroups" +msgstr "AmministraPropriGruppiPersonali" + +#: lib/RT/Queue_Overlay.pm:67 +msgid "AdminQueue" +msgstr "AmministraCode" + +#: lib/RT/System.pm:59 +msgid "AdminUsers" +msgstr "AmministraUtenti" + +#: html/Admin/Queues/People.html:47 +#: html/Ticket/Elements/EditPeople:53 +msgid "Administrative Cc" +msgstr "Cc Amministrativa" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Admins" +msgstr "Amministratori" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Advanced Search" +msgstr "Ricerca avanzata" + +#: html/Elements/SelectDateRelation:35 +msgid "After" +msgstr "Dopo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Age" +msgstr "Età" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Alias" +msgstr "" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Alias for" +msgstr "Alias per" + +#: html/Admin/Elements/EditCustomFields:95 +msgid "All Custom Fields" +msgstr "Tutti i campi personalizzati" + +#: html/Admin/Queues/index.html:52 +msgid "All Queues" +msgstr "Tutte le code" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Always sends a message to the requestors independent of message sender" +msgstr "Invia sempre un messaggio al richiedente inipendentemente dal mittente" + +#: html/Elements/Tabs:55 +msgid "Approval" +msgstr "Approvazione" + +#. ($Ticket->Id, $Ticket->Subject) +#. ($ticket->id, $msg) +#. ($link->BaseObj->Id, $link->BaseObj->Subject) +#: html/Approvals/Display.html:45 +#: html/Approvals/Elements/ShowDependency:41 +#: html/Approvals/index.html:64 +msgid "Approval #%1: %2" +msgstr "Approvazione n°%1: %2" + +#. ($ticket->Id) +#: html/Approvals/index.html:53 +msgid "Approval #%1: Notes not recorded due to a system error" +msgstr "Approvazione n°%1: Note non registrate a causa di un errore di sistema" + +#. ($ticket->Id) +#: html/Approvals/index.html:51 +msgid "Approval #%1: Notes recorded" +msgstr "Approvazione n°%1: Note registrate" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Approval Details" +msgstr "Dettagli dell'approvazione" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Approval diagram" +msgstr "Diagramma dell'approvazione" + +#: html/Approvals/Elements/Approve:43 +msgid "Approve" +msgstr "Approvare" + +#: etc/initialdata:437 +#: etc/upgrade/2.1.71:148 +msgid "Approver's notes: %1" +msgstr "Note dell'approvatore: %1" + +#: lib/RT/Date.pm:413 +msgid "Apr." +msgstr "Apr." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "April" +msgstr "Aprile" + +#: html/Elements/SelectSortOrder:34 +msgid "Ascending" +msgstr "Ascendente" + +#: html/Search/Bulk.html:126 +#: html/SelfService/Update.html:32 +#: html/Ticket/ModifyAll.html:82 +#: html/Ticket/Update.html:99 +msgid "Attach" +msgstr "Allegato" + +#: html/SelfService/Create.html:64 +#: html/Ticket/Create.html:109 +msgid "Attach file" +msgstr "Allegare un file" + +#: html/Ticket/Create.html:97 +#: html/Ticket/Update.html:88 +msgid "Attached file" +msgstr "File allegato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Attachment '%1' could not be loaded" +msgstr "L'allegato '%1' non può essere caricato" + +#: lib/RT/Transaction_Overlay.pm:440 +msgid "Attachment created" +msgstr "Allegato creato" + +#: lib/RT/Tickets_Overlay.pm:1188 +msgid "Attachment filename" +msgstr "Nome file dell'allegato" + +#: html/Ticket/Elements/ShowAttachments:25 +msgid "Attachments" +msgstr "Allegati" + +#: lib/RT/Date.pm:417 +msgid "Aug." +msgstr "Ago." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "August" +msgstr "Agosto" + +#: html/Admin/Elements/ModifyUser:65 +msgid "AuthSystem" +msgstr "AuthSystem" + +#: etc/initialdata:206 +msgid "Autoreply" +msgstr "RispostaAutomatica" + +#: etc/initialdata:72 +msgid "Autoreply To Requestors" +msgstr "Risposta automatica ai richiedenti" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "AutoreplyToRequestors" +msgstr "RispostaAutomaticaAiRichiedenti" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Bad PGP Signature: %1\\n" +msgstr "Firma PGP non valida: %1\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Bad attachment id. Couldn't find attachment '%1'\\n" +msgstr "Id di allegato errato. Impossibile trovare l'allegato '%1'\\n" + +#. ($val) +#: bin/rt-commit-handler:826 +msgid "Bad data in %1" +msgstr "Dati incorretti in %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Bad transaction number for attachment. %1 should be %2\\n" +msgstr "Numero di transazione incorretto per l'allegato. %1 dovrebbe essere %2\\n" + +#: html/Admin/Elements/GroupTabs:38 +#: html/Admin/Elements/QueueTabs:38 +#: html/Admin/Elements/UserTabs:37 +#: html/Ticket/Elements/Tabs:89 +#: html/User/Elements/GroupTabs:37 +msgid "Basics" +msgstr "Essenziale" + +#: html/Ticket/Update.html:82 +msgid "Bcc" +msgstr "Bcc" + +#: html/Admin/Elements/EditScrip:87 +#: html/Admin/Global/GroupRights.html:84 +#: html/Admin/Global/Template.html:45 +#: html/Admin/Global/UserRights.html:53 +#: html/Admin/Groups/GroupRights.html:72 +#: html/Admin/Groups/Members.html:80 +#: html/Admin/Groups/Modify.html:55 +#: html/Admin/Groups/UserRights.html:54 +#: html/Admin/Queues/GroupRights.html:84 +#: html/Admin/Queues/Template.html:44 +#: html/Admin/Queues/UserRights.html:53 +#: html/User/Groups/Modify.html:55 +msgid "Be sure to save your changes" +msgstr "Assicurarsi di salvare le modifiche" + +#: html/Elements/SelectDateRelation:33 +#: lib/RT/CurrentUser.pm:319 +msgid "Before" +msgstr "Prima" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Begin Approval" +msgstr "Inizio dell'approvazione" + +#: etc/initialdata:202 +msgid "Blank" +msgstr "Vuoto" + +#: html/Search/Listing.html:78 +msgid "Bookmarkable URL for this search" +msgstr "URL predefinito per questa ricerca" + +#: html/Ticket/Elements/ShowHistory:38 +#: html/Ticket/Elements/ShowHistory:44 +msgid "Brief headers" +msgstr "Intestazioni brevi" + +#: html/Search/Bulk.html:24 +#: html/Search/Bulk.html:25 +msgid "Bulk ticket update" +msgstr "Modifica di massa dei tickets" + +#: lib/RT/User_Overlay.pm:1351 +msgid "Can not modify system users" +msgstr "Gli utenti di sistema non possono essere modificati" + +#: lib/RT/Queue_Overlay.pm:66 +msgid "Can this principal see this queue" +msgstr "Il gruppo/utente può vedere questa coda" + +#: lib/RT/CustomField_Overlay.pm:205 +msgid "Can't add a custom field value without a name" +msgstr "Impossibile aggiungere un valore di campo personalizzato senza un nome" + +#: lib/RT/Link_Overlay.pm:131 +msgid "Can't link a ticket to itself" +msgstr "Non è possibile collegare un ticket a se stesso" + +#: lib/RT/Ticket_Overlay.pm:2793 +msgid "Can't merge into a merged ticket. You should never get this error" +msgstr "Impossibile unire un ticket ad un ticket già unito. Non dovrebbe mai comparire questo errore" + +#: lib/RT/Ticket_Overlay.pm:2611 +#: lib/RT/Ticket_Overlay.pm:2680 +msgid "Can't specifiy both base and target" +msgstr "Impossibile specificare sia la base che il target" + +#. ($msg) +#: html/autohandler:98 +msgid "Cannot create user: %1" +msgstr "Impossibile creare l'utente: %1" + +#: etc/initialdata:50 +#: html/Admin/Queues/People.html:43 +#: html/SelfService/Create.html:48 +#: html/Ticket/Create.html:63 +#: html/Ticket/Elements/EditPeople:50 +#: html/Ticket/Elements/ShowPeople:34 +#: html/Ticket/Update.html:44 +#: html/Ticket/Update.html:77 +#: lib/RT/ACE_Overlay.pm:87 +msgid "Cc" +msgstr "Cc" + +#: html/SelfService/Prefs.html:30 +msgid "Change password" +msgstr "Cambiare la passwrd" + +#: html/Ticket/Create.html:100 +#: html/Ticket/Update.html:91 +msgid "Check box to delete" +msgstr "Spunta la casella per eliminare" + +#: html/Admin/Elements/SelectRights:30 +msgid "Check box to revoke right" +msgstr "Spunta la casella per revocare i diritti" + +#: html/Ticket/Create.html:182 +#: html/Ticket/Elements/EditLinks:130 +#: html/Ticket/Elements/EditLinks:68 +#: html/Ticket/Elements/ShowLinks:56 +msgid "Children" +msgstr "Figli" + +#: html/Admin/Elements/ModifyUser:79 +#: html/Admin/Users/Modify.html:131 +#: html/User/Prefs.html:91 +msgid "City" +msgstr "Città" + +#: html/Ticket/Elements/ShowDates:46 +msgid "Closed" +msgstr "Chiuso" + +#: html/SelfService/Closed.html:24 +msgid "Closed Tickets" +msgstr "Tickets Chiusi" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Closed requests" +msgstr "Richieste chiuse" + +#: html/SelfService/Elements/Tabs:44 +msgid "Closed tickets" +msgstr "Tickets chiusi" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Code" +msgstr "" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Command not understood!\\n" +msgstr "Comando non riconosciuto! \\n" + +#: html/Ticket/Elements/ShowTransaction:178 +#: html/Ticket/Elements/Tabs:152 +msgid "Comment" +msgstr "Commento" + +#: html/Admin/Elements/ModifyQueue:44 +#: html/Admin/Queues/Modify.html:57 +msgid "Comment Address" +msgstr "Inidirizzo di Commento" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Comment not recorded" +msgstr "Commento non registrato" + +#: lib/RT/Queue_Overlay.pm:85 +msgid "Comment on tickets" +msgstr "Commento sui tickets" + +#: lib/RT/Queue_Overlay.pm:85 +msgid "CommentOnTicket" +msgstr "CommentoSuiTickets" + +#: html/Admin/Elements/ModifyUser:34 +msgid "Comments" +msgstr "Commenti" + +#: html/Ticket/ModifyAll.html:69 +#: html/Ticket/Update.html:69 +msgid "Comments (Not sent to requestors)" +msgstr "Commenti (Non inviati ai richiedenti)" + +#: html/Search/Bulk.html:121 +msgid "Comments (not sent to requestors)" +msgstr "Commenti (non inviati ai richiedenti)" + +#. ($name) +#: html/Elements/ViewUser:26 +msgid "Comments about %1" +msgstr "Commenti su %1" + +#: html/Admin/Users/Modify.html:184 +#: html/Ticket/Elements/ShowRequestor:43 +msgid "Comments about this user" +msgstr "Commenti su questo utente" + +#: lib/RT/Transaction_Overlay.pm:542 +msgid "Comments added" +msgstr "Commenti aggiunti" + +#: lib/RT/Action/Generic.pm:139 +msgid "Commit Stubbed" +msgstr "tr(Commit Stubbed)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Compile Restrictions" +msgstr "Restrizioni di compilazione" + +#: html/Admin/Elements/EditScrip:40 +msgid "Condition" +msgstr "Condizione" + +#: bin/rt-crontool:108 +msgid "Condition matches..." +msgstr "La condizione soddisfa..." + +#: lib/RT/Scrip_Overlay.pm:159 +msgid "Condition not found" +msgstr "Condizione non trovata" + +#: html/Elements/Tabs:49 +msgid "Configuration" +msgstr "Configurazione" + +#: html/SelfService/Prefs.html:32 +msgid "Confirm" +msgstr "Confermare" + +#: html/Admin/Elements/ModifyUser:59 +msgid "ContactInfoSystem" +msgstr "ContactInfoSystem" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Contacted date '%1' could not be parsed" +msgstr "La data di contatto '%1' non può essere analizzata" + +#: html/Admin/Elements/ModifyTemplate:43 +#: html/Ticket/ModifyAll.html:86 +msgid "Content" +msgstr "Contenuto" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Coould not create group" +msgstr "Non è stato possibile creare il gruppo" + +#: etc/initialdata:271 +msgid "Correspondence" +msgstr "Corrispondenza" + +#: html/Admin/Elements/ModifyQueue:38 +#: html/Admin/Queues/Modify.html:50 +msgid "Correspondence Address" +msgstr "Inidirizzo di corrispondenza" + +#: lib/RT/Transaction_Overlay.pm:538 +msgid "Correspondence added" +msgstr "Corrispondenza aggiunta" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Correspondence not recorded" +msgstr "Corrispondenza non registrata" + +#: lib/RT/Ticket_Overlay.pm:3524 +msgid "Could not add new custom field value for ticket. " +msgstr "Impossibile aggiungere un nuovo valore di campo personalizzato a questo ticket. " + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Could not add new custom field value for ticket. %1 " +msgstr "Il valore di campo personalizzato non è stato possibile aggiungerlo. %1" + +#: lib/RT/Ticket_Overlay.pm:3030 +#: lib/RT/Ticket_Overlay.pm:3038 +#: lib/RT/Ticket_Overlay.pm:3054 +msgid "Could not change owner. " +msgstr "Impossibile cambiare il proprietario. " + +#. ($msg) +#: html/Admin/Elements/EditCustomField:84 +#: html/Admin/Elements/EditCustomFields:165 +msgid "Could not create CustomField" +msgstr "Impossibile creare il campo personalizzato" + +#: html/User/Groups/Modify.html:76 +#: lib/RT/Group_Overlay.pm:473 +#: lib/RT/Group_Overlay.pm:480 +msgid "Could not create group" +msgstr "Impossibile creare il gruppo" + +#. ($msg) +#: html/Admin/Global/Template.html:74 +#: html/Admin/Queues/Template.html:71 +msgid "Could not create template: %1" +msgstr "Impossibile creare il modello : %1" + +#: lib/RT/Ticket_Overlay.pm:1072 +#: lib/RT/Ticket_Overlay.pm:333 +msgid "Could not create ticket. Queue not set" +msgstr "Impossibile creare il ticket. Queue non impostata" + +#: lib/RT/User_Overlay.pm:207 +#: lib/RT/User_Overlay.pm:219 +#: lib/RT/User_Overlay.pm:237 +#: lib/RT/User_Overlay.pm:421 +msgid "Could not create user" +msgstr "Impossibile creare l'utente" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Could not create watcher for requestor" +msgstr "Impossibile creare l'osservatore per il richiedente" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Could not find a ticket with id %1" +msgstr "Impossibile trovare il ticket numero %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Could not find group %1." +msgstr "Impossibile trovare il gruppo %1." + +#: lib/RT/Queue_Overlay.pm:620 +#: lib/RT/Ticket_Overlay.pm:1421 +msgid "Could not find or create that user" +msgstr "Impossibile trovare o creare questo utente" + +#: lib/RT/Queue_Overlay.pm:681 +#: lib/RT/Ticket_Overlay.pm:1500 +msgid "Could not find that principal" +msgstr "Impossibile trovare questo gruppo/utente" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Could not find user %1." +msgstr "Impossibile trovare l'utente %1." + +#: html/Admin/Groups/Members.html:87 +#: html/User/Groups/Members.html:89 +#: html/User/Groups/Modify.html:81 +msgid "Could not load group" +msgstr "Impossibile caricare questo gruppo" + +#. ($args{'Type'}) +#: lib/RT/Queue_Overlay.pm:640 +msgid "Could not make that principal a %1 for this queue" +msgstr "Impossibile rendere questo gruppo/utente un %1 per questa coda" + +#. ($self->loc($args{'Type'})) +#: lib/RT/Ticket_Overlay.pm:1442 +msgid "Could not make that principal a %1 for this ticket" +msgstr "Impossibile rendere questo gruppo/utente un %1 per questo ticket" + +#. ($args{'Type'}) +#: lib/RT/Queue_Overlay.pm:739 +msgid "Could not remove that principal as a %1 for this queue" +msgstr "Impossibile eliminare questo gruppo/utente come un %1 per questa coda" + +#. ($args{'Type'}) +#: lib/RT/Ticket_Overlay.pm:1558 +msgid "Could not remove that principal as a %1 for this ticket" +msgstr "Impossibile eliminare questo gruppo/utente come un %1 per questo ticket" + +#: lib/RT/Group_Overlay.pm:984 +msgid "Couldn't add member to group" +msgstr "Impossibile aggiungere un membro a questo gruppo" + +#. ($Msg) +#: lib/RT/Ticket_Overlay.pm:3534 +#: lib/RT/Ticket_Overlay.pm:3590 +msgid "Couldn't create a transaction: %1" +msgstr "Impossibile creare una transazione : %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't figure out what to do from gpg's reply\\n" +msgstr "Impossibile capire che cosa fare con questa risposta gpg\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't find group\\n" +msgstr "Gruppo introvabile\\n" + +#: lib/RT/Interface/Web.pm:899 +msgid "Couldn't find row" +msgstr "Riga introvabile" + +#: lib/RT/Group_Overlay.pm:958 +msgid "Couldn't find that principal" +msgstr "Gruppo/utente introvabile" + +#: lib/RT/CustomField_Overlay.pm:239 +msgid "Couldn't find that value" +msgstr "Valore introvabile" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't find that watcher" +msgstr "Osservatore introvabile" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't find user\\n" +msgstr "Utente introvabile\\n" + +#. ($self->Id) +#: lib/RT/CurrentUser.pm:111 +msgid "Couldn't load %1 from the users database.\\n" +msgstr "Impossibile caricare %1 dal database degli utenti.\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't load KeywordSelects." +msgstr "KeywordSelects non è stato possibile caricarlo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't load RT config file '%1' %2" +msgstr "Impossibile caricare il file di configurazione RT '%1' %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't load Scrips." +msgstr "Impossibile caricare gli Scrips" + +#. ($id) +#: html/Admin/Groups/GroupRights.html:87 +#: html/Admin/Groups/UserRights.html:74 +msgid "Couldn't load group %1" +msgstr "Impossibile caricare il gruppo %1" + +#: lib/RT/Link_Overlay.pm:174 +#: lib/RT/Link_Overlay.pm:183 +#: lib/RT/Link_Overlay.pm:210 +msgid "Couldn't load link" +msgstr "Impossibile caricare il link" + +#. ($id) +#: html/Admin/Elements/EditCustomFields:146 +#: html/Admin/Queues/People.html:120 +msgid "Couldn't load queue" +msgstr "Impossibile caricare la coda" + +#. ($id) +#: html/Admin/Queues/GroupRights.html:99 +#: html/Admin/Queues/UserRights.html:71 +msgid "Couldn't load queue %1" +msgstr "Impossibile caricare la coda %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't load scrip" +msgstr "Impossibile caricare lo Scrip" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Couldn't load template" +msgstr "Impossibile caricare il modello" + +#. ($id) +#: html/Admin/Users/Prefs.html:78 +msgid "Couldn't load that user (%1)" +msgstr "Impossibile caricare questo utente (%1)" + +#. ($id) +#: html/SelfService/Display.html:108 +msgid "Couldn't load ticket '%1'" +msgstr "Impossibile caricare il ticket '%1'" + +#: html/Admin/Elements/ModifyUser:85 +#: html/Admin/Users/Modify.html:148 +#: html/User/Prefs.html:97 +msgid "Country" +msgstr "Stato" + +#: html/Admin/Elements/CreateUserCalled:25 +#: html/Ticket/Create.html:134 +#: html/Ticket/Create.html:194 +msgid "Create" +msgstr "Crea" + +#: etc/initialdata:128 +msgid "Create Tickets" +msgstr "Crea tickets" + +#: html/Admin/Elements/EditCustomField:74 +msgid "Create a CustomField" +msgstr "Crea un campo Personalizzato" + +#. ($QueueObj->Name()) +#: html/Admin/Queues/CustomField.html:47 +msgid "Create a CustomField for queue %1" +msgstr "Crea un campo Custom per la coda %1" + +#: html/Admin/Global/CustomField.html:47 +msgid "Create a CustomField which applies to all queues" +msgstr "Crea un campo Personalizzato valido per tutte le code" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a new Custom Field" +msgstr "Crea un nuovo campo Personalizzato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a new global scrip" +msgstr "Crea un nuovo scrip globale" + +#: html/Admin/Groups/Modify.html:66 +#: html/Admin/Groups/Modify.html:92 +msgid "Create a new group" +msgstr "Crea un nuovo gruppo" + +#: html/User/Groups/Modify.html:66 +#: html/User/Groups/Modify.html:91 +msgid "Create a new personal group" +msgstr "Crea un nuovo gruppo personale" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a new queue" +msgstr "Crea una nuova coda" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a new scrip" +msgstr "Crea un nuovo scrip" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a new template" +msgstr "Crea un nuovo modello" + +#: html/Ticket/Create.html:24 +#: html/Ticket/Create.html:27 +#: html/Ticket/Create.html:35 +msgid "Create a new ticket" +msgstr "Crea un nuovo ticket" + +#: html/Admin/Users/Modify.html:213 +#: html/Admin/Users/Modify.html:240 +msgid "Create a new user" +msgstr "Crea un nuovo utente" + +#: html/Admin/Queues/Modify.html:102 +msgid "Create a queue" +msgstr "Crea una coda" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a queue called" +msgstr "Crea una nuova coda chiamata" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create a request" +msgstr "Crea una richiesta" + +#. ($QueueObj->Name) +#: html/Admin/Queues/Scrip.html:58 +msgid "Create a scrip for queue %1" +msgstr "Crea uno scrip per la coda %1" + +#: html/Admin/Global/Template.html:68 +#: html/Admin/Queues/Template.html:64 +msgid "Create a template" +msgstr "Crea un modello" + +#: html/SelfService/Create.html:24 +msgid "Create a ticket" +msgstr "Crea un ticket" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create failed: %1 / %2 / %3 " +msgstr "Eccezione durante la creazione: %1 / %2 / %3" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create failed: %1/%2/%3" +msgstr "Eccezione durante la creazione: %1/%2/%3" + +#: etc/initialdata:130 +msgid "Create new tickets based on this scrip's template" +msgstr "Creare nuovi tickets basati su questo modello di scrip" + +#: html/SelfService/Create.html:77 +msgid "Create ticket" +msgstr "Crea un ticket" + +#: lib/RT/Queue_Overlay.pm:83 +msgid "Create tickets in this queue" +msgstr "Crea dei tickets in questa coda" + +#: lib/RT/Queue_Overlay.pm:71 +msgid "Create, delete and modify custom fields" +msgstr "Crea, elimina e modifica campi personalizzati" + +#: lib/RT/Queue_Overlay.pm:67 +msgid "Create, delete and modify queues" +msgstr "Crea, elimina e modifica le code" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Create, delete and modify the members of any user's personal groups" +msgstr "Crea, elimina e modifica i membri dei gruppi personali di un qualunque utente" + +#: lib/RT/System.pm:58 +msgid "Create, delete and modify the members of personal groups" +msgstr "Crea, elimina e modifica i membri dei gruppi personali " + +#: lib/RT/System.pm:59 +msgid "Create, delete and modify users" +msgstr "Crea, elimina e modifica gli utenti" + +#: lib/RT/Queue_Overlay.pm:83 +msgid "CreateTicket" +msgstr "CreaTicket" + +#: html/Elements/SelectDateType:25 +#: html/Ticket/Elements/ShowDates:26 +#: lib/RT/Ticket_Overlay.pm:1166 +msgid "Created" +msgstr "Creato" + +#. ($CustomFieldObj->Name()) +#: html/Admin/Elements/EditCustomField:87 +msgid "Created CustomField %1" +msgstr "Campo Personalizzato %1 creato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Created template %1" +msgstr "Modello %1 creato" + +#: html/Ticket/Elements/EditLinks:27 +msgid "Current Relationships" +msgstr "Relazioni attuali" + +#: html/Admin/Elements/EditScrips:29 +msgid "Current Scrips" +msgstr "Scrips attuali" + +#: html/Admin/Groups/Members.html:38 +#: html/User/Groups/Members.html:41 +msgid "Current members" +msgstr "Membri attuali" + +#: html/Admin/Elements/SelectRights:28 +msgid "Current rights" +msgstr "Diritti attuali" + +#: html/Search/Listing.html:70 +msgid "Current search criteria" +msgstr "Criterio di ricerca corrente" + +#: html/Admin/Queues/People.html:40 +#: html/Ticket/Elements/EditPeople:44 +msgid "Current watchers" +msgstr "Osservatori attuali" + +#. ($CustomField) +#: html/Admin/Global/CustomField.html:54 +msgid "Custom Field #%1" +msgstr "Campo Personalizzato n°%1" + +#: html/Admin/Elements/QueueTabs:52 +#: html/Admin/Elements/SystemTabs:39 +#: html/Admin/Global/index.html:49 +#: html/Ticket/Elements/ShowSummary:35 +msgid "Custom Fields" +msgstr "Campi Personalizzati" + +#: html/Admin/Elements/EditScrip:72 +msgid "Custom action cleanup code" +msgstr "Programma di pulizia dell'azione personalizzata" + +#: html/Admin/Elements/EditScrip:64 +msgid "Custom action preparation code" +msgstr "Programma di preparazione dell'azione personalizzata" + +#: html/Admin/Elements/EditScrip:48 +msgid "Custom condition" +msgstr "Condizione personalizzata" + +#. ($CF->Name , $args{OPERATOR} , $args{VALUE}) +#: lib/RT/Tickets_Overlay.pm:1617 +msgid "Custom field %1 %2 %3" +msgstr "Campi personalizzati %1 %2 %3" + +#. ($CF->Name) +#: lib/RT/Tickets_Overlay.pm:1612 +msgid "Custom field %1 has a value." +msgstr "Il campo personalizzato %1 ha un valore" + +#. ($CF->Name) +#: lib/RT/Tickets_Overlay.pm:1609 +msgid "Custom field %1 has no value." +msgstr "Il campo personalizzato %1 non ha valore" + +#. ($args{'Field'}) +#: lib/RT/Ticket_Overlay.pm:3426 +msgid "Custom field %1 not found" +msgstr "Il campo personalizzato %1 è introvabile" + +#: html/Admin/Elements/EditCustomFields:196 +msgid "Custom field deleted" +msgstr "Campo Personalizzato cancellato" + +#: lib/RT/Ticket_Overlay.pm:3576 +msgid "Custom field not found" +msgstr "Il campo personalizzato è introvabile" + +#. ($args{'Content'}, $self->Name) +#: lib/RT/CustomField_Overlay.pm:349 +msgid "Custom field value %1 could not be found for custom field %2" +msgstr "Il valore del campo personalizzato %1 non è stato possibile trovarlo per il campo personalizzato %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Custom field value changed from %1 to %2" +msgstr "Il valore del campo personalizzato è stato modificato da %1 à %2" + +#: lib/RT/CustomField_Overlay.pm:249 +msgid "Custom field value could not be deleted" +msgstr "Il valore del campo personalizzato non è stato possibile eliminarlo" + +#: lib/RT/CustomField_Overlay.pm:355 +msgid "Custom field value could not be found" +msgstr "Il valore del campo personalizzato non è stato possibile trovarlo" + +#: lib/RT/CustomField_Overlay.pm:247 +#: lib/RT/CustomField_Overlay.pm:357 +msgid "Custom field value deleted" +msgstr "Il valore del vampo personalizzato è stato eliminato" + +#: lib/RT/Transaction_Overlay.pm:547 +msgid "CustomField" +msgstr "CampoPersonalizzato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Data error" +msgstr "Errore nei dati" + +#: html/SelfService/Display.html:38 +#: html/Ticket/Create.html:160 +#: html/Ticket/Elements/ShowSummary:54 +#: html/Ticket/Elements/Tabs:92 +#: html/Ticket/ModifyAll.html:43 +msgid "Dates" +msgstr "Date" + +#: lib/RT/Date.pm:421 +msgid "Dec." +msgstr "Dic." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "December" +msgstr "Dicembre" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Default Autoresponse Template" +msgstr "Modello di default per la risposta automatica" + +#: etc/initialdata:207 +msgid "Default Autoresponse template" +msgstr "Modello di default per la risposta automatica" + +#: etc/initialdata:281 +msgid "Default admin comment template" +msgstr "Modello di default per il commento amministrativo" + +#: etc/initialdata:260 +msgid "Default admin correspondence template" +msgstr "Modello di default per la corrispondenza amministrativa" + +#: etc/initialdata:272 +msgid "Default correspondence template" +msgstr "Modello di default per la corrispondenza" + +#: etc/initialdata:238 +msgid "Default transaction template" +msgstr "Modello di default per la transazione" + +#. ($type, $self->Field, $self->OldValue, $self->NewValue) +#: lib/RT/Transaction_Overlay.pm:642 +msgid "Default: %1/%2 changed from %3 to %4" +msgstr "Defaut: %1/%2 modificato da %3 à %4" + +#: html/User/Delegation.html:24 +#: html/User/Delegation.html:27 +msgid "Delegate rights" +msgstr "Delega i diritti" + +#: lib/RT/System.pm:62 +msgid "Delegate specific rights which have been granted to you." +msgstr "Delega dei diritti specifici che ti sono stati accordati" + +#: lib/RT/System.pm:62 +msgid "DelegateRights" +msgstr "DelegaDiritti" + +#: html/User/Elements/Tabs:37 +msgid "Delegation" +msgstr "Delega" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Delete" +msgstr "Elimina" + +#: lib/RT/Queue_Overlay.pm:89 +msgid "Delete tickets" +msgstr "Elimina dei tickets" + +#: lib/RT/Queue_Overlay.pm:89 +msgid "DeleteTicket" +msgstr "EliminaTicket" + +#: lib/RT/Transaction_Overlay.pm:186 +msgid "Deleting this object could break referential integrity" +msgstr "Eliminare quest'oggetto può interrompere l'integrità referenziale" + +#: lib/RT/Queue_Overlay.pm:291 +msgid "Deleting this object would break referential integrity" +msgstr "Eliminare quest'oggetto interomperà l'integrità referenziale" + +#: lib/RT/User_Overlay.pm:437 +msgid "Deleting this object would violate referential integrity" +msgstr "Eliminare quest'oggetto violerà l'integrità referenziale" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Deleting this object would violate referential integrity." +msgstr "Eliminare quest'oggetto violerà l'integrità referenziale" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Deleting this object would violate referential integrity. That's bad." +msgstr "Eliminare quest'oggetto violerà l'integrità referenziale. Malissimo!" + +#: html/Approvals/Elements/Approve:44 +msgid "Deny" +msgstr "Negare" + +#: html/Ticket/Create.html:180 +#: html/Ticket/Elements/EditLinks:122 +#: html/Ticket/Elements/EditLinks:46 +#: html/Ticket/Elements/ShowDependencies:31 +#: html/Ticket/Elements/ShowLinks:36 +msgid "Depended on by" +msgstr "Usato come dipendenza da" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Dependencies: \\n" +msgstr "Dipendenze : \\n" + +#: html/Elements/SelectLinkType:26 +#: html/Ticket/Create.html:179 +#: html/Ticket/Elements/EditLinks:118 +#: html/Ticket/Elements/EditLinks:35 +#: html/Ticket/Elements/ShowDependencies:24 +#: html/Ticket/Elements/ShowLinks:26 +msgid "Depends on" +msgstr "Dipende da" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "DependsOn" +msgstr "DipendeDa" + +#: html/Elements/SelectSortOrder:34 +msgid "Descending" +msgstr "Discendente" + +#: html/SelfService/Create.html:72 +#: html/Ticket/Create.html:118 +msgid "Describe the issue below" +msgstr "Descrivere il problema qui sotto" + +#: html/Admin/Elements/AddCustomFieldValue:35 +#: html/Admin/Elements/EditCustomField:38 +#: html/Admin/Elements/EditScrip:33 +#: html/Admin/Elements/ModifyQueue:35 +#: html/Admin/Elements/ModifyTemplate:35 +#: html/Admin/Groups/Modify.html:48 +#: html/Admin/Queues/Modify.html:47 +#: html/Elements/SelectGroups:26 +#: html/User/Groups/Modify.html:48 +msgid "Description" +msgstr "Descrizione" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Details" +msgstr "Dettagli" + +#: html/Ticket/Elements/Tabs:84 +msgid "Display" +msgstr "Mostra" + +#: lib/RT/Queue_Overlay.pm:68 +msgid "Display Access Control List" +msgstr "Mostra la Lista Controllo Accessi" + +#: lib/RT/Queue_Overlay.pm:74 +msgid "Display Scrip templates for this queue" +msgstr "Mostra i modelli di Scrips per questa coda" + +#: lib/RT/Queue_Overlay.pm:77 +msgid "Display Scrips for this queue" +msgstr "Mostra gli Scrips per questa coda" + +#: html/Ticket/Elements/ShowHistory:34 +msgid "Display mode" +msgstr "Modalità visualizzazione" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Display ticket #%1" +msgstr "Mostra il ticket n°%1" + +#: lib/RT/System.pm:53 +msgid "Do anything and everything" +msgstr "Fare di tutto e non importa cosa" + +#: html/Elements/Refresh:29 +msgid "Don't refresh this page." +msgstr "Non aggiornare questa pagina." + +#: html/Search/Elements/PickRestriction:113 +msgid "Don't show search results" +msgstr "Non mostrare i risultati della ricerca" + +#: html/Ticket/Elements/ShowTransaction:104 +msgid "Download" +msgstr "Download" + +#: html/Elements/SelectDateType:31 +#: html/Ticket/Create.html:166 +#: html/Ticket/Elements/EditDates:44 +#: html/Ticket/Elements/ShowDates:42 +#: lib/RT/Ticket_Overlay.pm:1170 +msgid "Due" +msgstr "Termine" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Due date '%1' could not be parsed" +msgstr "La data termine '%1' non è stata interpretata" + +#. ($1, $msg) +#: bin/rt-commit-handler:753 +msgid "ERROR: Couldn't load ticket '%1': %2.\\n" +msgstr "ERRORE: impossibile caricare il ticket '%1' : %2.\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Edit" +msgstr "Modifica" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Edit Conditions" +msgstr "Modifica Condizioni" + +#. ($Queue->Name) +#: html/Admin/Queues/CustomFields.html:44 +msgid "Edit Custom Fields for %1" +msgstr "Modifica i Campi Personalizzati per %1" + +#: html/Ticket/ModifyLinks.html:35 +msgid "Edit Relationships" +msgstr "Modifica Relazioni" + +#. ($QueueObj->Name) +#: html/Admin/Queues/Templates.html:41 +msgid "Edit Templates for queue %1" +msgstr "Modifica i modelli per la coda %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Edit keywords" +msgstr "Modifica parole chiave" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Edit scrips" +msgstr "Modifica scrips" + +#: html/Admin/Global/index.html:45 +msgid "Edit system templates" +msgstr "Modifca i modelli di sistema" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Edit templates for %1" +msgstr "Modifica i modelli per %1" + +#. ($QueueObj->Name) +#. ($QueueObj->Id) +#: html/Admin/Elements/ModifyQueue:24 +#: html/Admin/Queues/Modify.html:117 +msgid "Editing Configuration for queue %1" +msgstr "Modifica la Configurazione per la coda %1" + +#. ($UserObj->Name) +#: html/Admin/Elements/ModifyUser:24 +msgid "Editing Configuration for user %1" +msgstr "Modifica la Configurazione per l'utente %1" + +#. ($CustomFieldObj->Name()) +#: html/Admin/Elements/EditCustomField:90 +msgid "Editing CustomField %1" +msgstr "Modifica il CampoPersonalizzato %1" + +#. ($Group->Name) +#: html/Admin/Groups/Members.html:31 +msgid "Editing membership for group %1" +msgstr "Modifica i membri per il gruppo %1" + +#. ($Group->Name) +#: html/User/Groups/Members.html:128 +msgid "Editing membership for personal group %1" +msgstr "Modifica i membri per il gruppo personale %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Editing template %1" +msgstr "Modifica il modello %1" + +#: lib/RT/Ticket_Overlay.pm:2621 +#: lib/RT/Ticket_Overlay.pm:2689 +msgid "Either base or target must be specified" +msgstr "Uno almeno tra base e target deve essere specificato" + +#: html/Admin/Users/Modify.html:52 +#: html/Admin/Users/Prefs.html:45 +#: html/Elements/SelectUsers:26 +#: html/Ticket/Elements/AddWatchers:55 +#: html/User/Prefs.html:41 +msgid "Email" +msgstr "Email" + +#: lib/RT/User_Overlay.pm:187 +msgid "Email address in use" +msgstr "Inidirizzo email in uso" + +#: html/Admin/Elements/ModifyUser:41 +msgid "EmailAddress" +msgstr "IndirizzoEmail" + +#: html/Admin/Elements/ModifyUser:53 +msgid "EmailEncoding" +msgstr "EmailEncoding" + +#: html/Admin/Elements/EditCustomField:50 +msgid "Enabled (Unchecking this box disables this custom field)" +msgstr "Abilitato (Togliere il segno di spunta disabilita questo campo personalizzato)" + +#: html/Admin/Groups/Modify.html:52 +#: html/User/Groups/Modify.html:52 +msgid "Enabled (Unchecking this box disables this group)" +msgstr "Abilitato (Togliere il segno di spunta disabilita questo gruppo)" + +#: html/Admin/Queues/Modify.html:83 +msgid "Enabled (Unchecking this box disables this queue)" +msgstr "Abilitato (Togliere il segno di spunta disabilita questa coda)" + +#: html/Admin/Elements/EditCustomFields:98 +msgid "Enabled Custom Fields" +msgstr "Campi Personalizzati Abilitati" + +#: html/Admin/Queues/index.html:55 +msgid "Enabled Queues" +msgstr "Code Abilitate" + +#. (loc_fuzzy($msg)) +#: html/Admin/Elements/EditCustomField:106 +#: html/Admin/Groups/Modify.html:116 +#: html/Admin/Queues/Modify.html:139 +#: html/Admin/Users/Modify.html:282 +#: html/User/Groups/Modify.html:116 +msgid "Enabled status %1" +msgstr "Stato %1 abilitato" + +#: lib/RT/CustomField_Overlay.pm:427 +msgid "Enter multiple values" +msgstr "Inserire valori multipli" + +#: lib/RT/CustomField_Overlay.pm:424 +msgid "Enter one value" +msgstr "Inserire un valore" + +#: html/Ticket/Elements/EditLinks:111 +msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." +msgstr "Inserire tickets o URI di tickets da collegare. Separare più valori con spazi." + +#: html/Elements/Login:38 +#: html/SelfService/Error.html:24 +#: html/SelfService/Error.html:25 +msgid "Error" +msgstr "Errore" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Error adding watcher" +msgstr "Errore cercando di aggiungere un osservatore" + +#: lib/RT/Queue_Overlay.pm:554 +msgid "Error in parameters to Queue->AddWatcher" +msgstr "Errore nei parametri di Queue->AddWatcher" + +#: lib/RT/Queue_Overlay.pm:712 +msgid "Error in parameters to Queue->DelWatcher" +msgstr "Errore nei parametri di Queue->DelWatcher" + +#: lib/RT/Ticket_Overlay.pm:1355 +msgid "Error in parameters to Ticket->AddWatcher" +msgstr "Errore nei parametri di Ticket->AddWatcher" + +#: lib/RT/Ticket_Overlay.pm:1531 +msgid "Error in parameters to Ticket->DelWatcher" +msgstr "Errore nei parametri di Ticket->DelWatcher" + +#: etc/initialdata:20 +msgid "Everyone" +msgstr "Chiunque" + +#: bin/rt-crontool:193 +msgid "Example:" +msgstr "Esempio:" + +#: html/Admin/Elements/ModifyUser:63 +msgid "ExternalAuthId" +msgstr "ExternalAuthId" + +#: html/Admin/Elements/ModifyUser:57 +msgid "ExternalContactInfoId" +msgstr "ExternalContactInfoId" + +#: html/Admin/Users/Modify.html:72 +msgid "Extra info" +msgstr "Informazioni aggiuntive" + +#: lib/RT/User_Overlay.pm:301 +msgid "Failed to find 'Privileged' users pseudogroup." +msgstr "Impossibile trovare il pseudogruppo 'Privilegiato' di utenti." + +#: lib/RT/User_Overlay.pm:308 +msgid "Failed to find 'Unprivileged' users pseudogroup" +msgstr "Impossibile trovare il pseudogruppo 'Non Privilegiato' di utenti." + +#. ($modname, $@) +#: bin/rt-crontool:137 +msgid "Failed to load module %1. (%2)" +msgstr "Errore nel caricare il modulo %1. (%2)" + +#: lib/RT/Date.pm:411 +msgid "Feb." +msgstr "Feb." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "February" +msgstr "Febbraio" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Fin" +msgstr "Fin" + +#: html/Ticket/Create.html:154 +#: html/Ticket/Elements/EditBasics:58 +#: lib/RT/Tickets_Overlay.pm:1090 +msgid "Final Priority" +msgstr "Priorità Finale" + +#: lib/RT/Ticket_Overlay.pm:1161 +msgid "FinalPriority" +msgstr "PrioritàFinale" + +#: html/Admin/Queues/People.html:60 +#: html/Ticket/Elements/EditPeople:33 +msgid "Find group whose" +msgstr "Cerca il gruppo che" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Find new/open tickets" +msgstr "Cerca tickets nuovi/aperti" + +#: html/Admin/Queues/People.html:56 +#: html/Admin/Users/index.html:45 +#: html/Ticket/Elements/EditPeople:29 +msgid "Find people whose" +msgstr "Cerca le persone che" + +#: html/Search/Listing.html:107 +msgid "Find tickets" +msgstr "Cerca tickets" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Finish Approval" +msgstr "Approvazione Finale" + +#: html/Ticket/Elements/Tabs:57 +msgid "First" +msgstr "Primo" + +#: html/Search/Listing.html:40 +msgid "First page" +msgstr "Prima Pagina" + +#: docs/design_docs/string-extraction-guide.txt:33 +msgid "Foo Bar Baz" +msgstr "Foo Bar Baz" + +#: docs/design_docs/string-extraction-guide.txt:24 +msgid "Foo!" +msgstr "Foo!" + +#: html/Search/Bulk.html:86 +msgid "Force change" +msgstr "Forza il cambiamento" + +#. ($ticketcount) +#: html/Search/Listing.html:105 +msgid "Found %quant(%1,ticket)" +msgstr "Trovati %quant(%1,ticket)" + +#: lib/RT/Interface/Web.pm:901 +msgid "Found Object" +msgstr "Trovato Oggetto" + +#: html/Admin/Elements/ModifyUser:43 +msgid "FreeformContactInfo" +msgstr "FreeformContactInfo" + +#: lib/RT/CustomField_Overlay.pm:37 +msgid "FreeformMultiple" +msgstr "FreeformMultiple" + +#: lib/RT/CustomField_Overlay.pm:36 +msgid "FreeformSingle" +msgstr "FreeformSingle" + +#: lib/RT/Date.pm:391 +msgid "Fri." +msgstr "Gio." + +#: html/Ticket/Elements/ShowHistory:40 +#: html/Ticket/Elements/ShowHistory:50 +msgid "Full headers" +msgstr "Intestazioni Estese" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Getting the current user from a pgp sig\\n" +msgstr "Sto prendendo l'utente corrente da una firma pgp\\n" + +#. ($New->Name) +#: lib/RT/Transaction_Overlay.pm:592 +msgid "Given to %1" +msgstr "Assegnato a %1" + +#: html/Admin/Elements/Tabs:40 +#: html/Admin/index.html:37 +msgid "Global" +msgstr "Globale" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Global Keyword Selections" +msgstr "Selezione Globale delle Parole Chiave" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Global Scrips" +msgstr "Scrips Globali" + +#. (loc($Template->Name)) +#: html/Admin/Elements/SelectTemplate:37 +msgid "Global template: %1" +msgstr "Modello globale: %1" + +#: html/Admin/Elements/EditCustomFields:74 +#: html/Admin/Queues/People.html:58 +#: html/Admin/Queues/People.html:62 +#: html/Admin/Queues/index.html:43 +#: html/Admin/Users/index.html:48 +#: html/Ticket/Elements/EditPeople:31 +#: html/Ticket/Elements/EditPeople:35 +#: html/index.html:40 +msgid "Go!" +msgstr "Vai!" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Good pgp sig from %1\\n" +msgstr "Firma pgp valida da %1\\n" + +#: html/Search/Listing.html:49 +msgid "Goto page" +msgstr "Vai a pagina" + +#: html/Elements/GotoTicket:24 +#: html/SelfService/Elements/GotoTicket:24 +msgid "Goto ticket" +msgstr "Vai al ticket" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Grand" +msgstr "Grand" + +#: html/Ticket/Elements/AddWatchers:45 +#: html/User/Elements/DelegateRights:77 +msgid "Group" +msgstr "Gruppo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Group %1 %2: %3" +msgstr "Gruppo %1 %2: %3" + +#: html/Admin/Elements/GroupTabs:44 +#: html/Admin/Elements/QueueTabs:56 +#: html/Admin/Elements/SystemTabs:43 +#: html/Admin/Global/index.html:54 +msgid "Group Rights" +msgstr "Diritti di Gruppo" + +#: lib/RT/Group_Overlay.pm:964 +msgid "Group already has member" +msgstr "Il gruppo ha già il membro" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Group could not be created." +msgstr "Il gruppo non può essere creato." + +#. ($create_msg) +#: html/Admin/Groups/Modify.html:76 +msgid "Group could not be created: %1" +msgstr "Il gruppo non può essere creato: %1" + +#: lib/RT/Group_Overlay.pm:496 +msgid "Group created" +msgstr "Gruppo creato" + +#: lib/RT/Group_Overlay.pm:1132 +msgid "Group has no such member" +msgstr "Il gruppo non ho questo membro" + +#: lib/RT/Group_Overlay.pm:944 +#: lib/RT/Queue_Overlay.pm:627 +#: lib/RT/Queue_Overlay.pm:687 +#: lib/RT/Ticket_Overlay.pm:1428 +#: lib/RT/Ticket_Overlay.pm:1506 +msgid "Group not found" +msgstr "Gruppo non trovato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Group not found.\\n" +msgstr "Gruppo non trovato.\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Group not specified.\\n" +msgstr "Gruppo non specificato.\\n" + +#: html/Admin/Elements/SelectNewGroupMembers:34 +#: html/Admin/Elements/Tabs:34 +#: html/Admin/Groups/Members.html:63 +#: html/Admin/Queues/People.html:82 +#: html/Admin/index.html:31 +#: html/User/Groups/Members.html:66 +msgid "Groups" +msgstr "Gruppi" + +#: lib/RT/Group_Overlay.pm:970 +msgid "Groups can't be members of their members" +msgstr "I gruppi non possono essere membri dei loro membri" + +#: lib/RT/Interface/CLI.pm:72 +msgid "Hello!" +msgstr "Ciao!" + +#. ($name) +#: docs/design_docs/string-extraction-guide.txt:40 +msgid "Hello, %1" +msgstr "Ciao, %1" + +#: html/Ticket/Elements/ShowHistory:29 +#: html/Ticket/Elements/Tabs:87 +msgid "History" +msgstr "Storia" + +#: html/Admin/Elements/ModifyUser:67 +msgid "HomePhone" +msgstr "TelefonoCasa" + +#: html/Elements/Tabs:43 +msgid "Homepage" +msgstr "Homepage" + +#. (6) +#: lib/RT/Base.pm:73 +msgid "I have %quant(%1,concrete mixer)." +msgstr "Ho %quant(%1,concrete mixer)." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "I have [quant,_1,concrete mixer]." +msgstr "Ho [quant,_1,concrete mixer]." + +#: html/Ticket/Elements/ShowBasics:26 +#: lib/RT/Tickets_Overlay.pm:1017 +msgid "Id" +msgstr "Id" + +#: html/Admin/Users/Modify.html:43 +#: html/User/Prefs.html:38 +msgid "Identity" +msgstr "Identità" + +#: etc/upgrade/2.1.71:86 +msgid "If an approval is rejected, reject the original and delete pending approvals" +msgstr "Se una richiesta di approvazione è rifiutata, rifiuta l'originale e elimina le richieste di approvazione pendenti" + +#: bin/rt-crontool:189 +msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT." +msgstr "Se questo strumento viene utilizzato con setgid, un utente locale mlintenzionato può usrae questo strumento per ottenere accesso amministrativo su RT." + +#: html/Admin/Queues/People.html:104 +#: html/Ticket/Modify.html:38 +#: html/Ticket/ModifyAll.html:93 +#: html/Ticket/ModifyPeople.html:37 +msgid "If you've updated anything above, be sure to" +msgstr "Se hai aggiornato qualchecosa qui sopra, assicurati di" + +#: lib/RT/Interface/Web.pm:893 +msgid "Illegal value for %1" +msgstr "Valore non valido per %1" + +#: lib/RT/Interface/Web.pm:896 +msgid "Immutable field" +msgstr "Campo immutabile" + +#: html/Admin/Elements/EditCustomFields:73 +msgid "Include disabled custom fields in listing." +msgstr "Includi nella lista i campi personalizzati disabilitati." + +#: html/Admin/Queues/index.html:42 +msgid "Include disabled queues in listing." +msgstr "Includi nella lista le code disabilitate." + +#: html/Admin/Users/index.html:46 +msgid "Include disabled users in search." +msgstr "Includi nella ricerca gli utenti disabilitati." + +#: lib/RT/Tickets_Overlay.pm:1066 +msgid "Initial Priority" +msgstr "Priorità Iniziale" + +#: lib/RT/Ticket_Overlay.pm:1160 +#: lib/RT/Ticket_Overlay.pm:1162 +msgid "InitialPriority" +msgstr "PrioritàIniziale" + +#: lib/RT/ScripAction_Overlay.pm:104 +msgid "Input error" +msgstr "Errore in Input" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Interest noted" +msgstr "Interesse annotato" + +#: lib/RT/Ticket_Overlay.pm:3795 +msgid "Internal Error" +msgstr "Errore Interno" + +#. ($id->{error_message}) +#: lib/RT/Record.pm:142 +msgid "Internal Error: %1" +msgstr "Errore Interno: %1" + +#: lib/RT/Group_Overlay.pm:643 +msgid "Invalid Group Type" +msgstr "Tipo di Gruppo non valido" + +#: lib/RT/Principal_Overlay.pm:127 +msgid "Invalid Right" +msgstr "Diritto non valido" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Invalid Type" +msgstr "Tipo non valido" + +#: lib/RT/Interface/Web.pm:898 +msgid "Invalid data" +msgstr "Dati non validi" + +#: lib/RT/Ticket_Overlay.pm:438 +msgid "Invalid owner. Defaulting to 'nobody'." +msgstr "Proprietraio non valido. Verrà usato il default 'nobody'." + +#: lib/RT/Scrip_Overlay.pm:133 +#: lib/RT/Template_Overlay.pm:250 +msgid "Invalid queue" +msgstr "Coda non valida" + +#: lib/RT/ACE_Overlay.pm:243 +#: lib/RT/ACE_Overlay.pm:252 +#: lib/RT/ACE_Overlay.pm:258 +#: lib/RT/ACE_Overlay.pm:269 +#: lib/RT/ACE_Overlay.pm:274 +msgid "Invalid right" +msgstr "Diritto non valido" + +#. ($key) +#: lib/RT/Record.pm:117 +msgid "Invalid value for %1" +msgstr "Valore non valido per %1" + +#: lib/RT/Ticket_Overlay.pm:3433 +msgid "Invalid value for custom field" +msgstr "Valore non valido per il campo personalizzato" + +#: lib/RT/Ticket_Overlay.pm:345 +msgid "Invalid value for status" +msgstr "Valore non valido per lo stato" + +#: bin/rt-crontool:190 +msgid "It is incredibly important that nonprivileged users not be allowed to run this tool." +msgstr "E' estremamente importante che agli utenti non previlegiati non sia consentito eseguire questo strumento." + +#: bin/rt-crontool:191 +msgid "It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool." +msgstr "It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool." + +#: bin/rt-crontool:162 +msgid "It takes several arguments:" +msgstr "Richide molteplici argomenti:" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Items pending my approval" +msgstr "Oggetti in attesa della mia approvazione" + +#: lib/RT/Date.pm:410 +msgid "Jan." +msgstr "Gen." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "January" +msgstr "Gennaio" + +#: lib/RT/Group_Overlay.pm:148 +msgid "Join or leave this group" +msgstr "Unisciti o lascia questo gruppo" + +#: lib/RT/Date.pm:416 +msgid "Jul." +msgstr "Lug." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "July" +msgstr "Luglio" + +#: html/Ticket/Elements/Tabs:98 +msgid "Jumbo" +msgstr "Jumbo" + +#: lib/RT/Date.pm:415 +msgid "Jun." +msgstr "Giu." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "June" +msgstr "Giugno" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Keyword" +msgstr "Parola chiave" + +#: html/Admin/Elements/ModifyUser:51 +msgid "Lang" +msgstr "Linguaggio" + +#: html/Ticket/Elements/Tabs:72 +msgid "Last" +msgstr "Ultimo" + +#: html/Ticket/Elements/EditDates:37 +#: html/Ticket/Elements/ShowDates:38 +msgid "Last Contact" +msgstr "Ultimo Contatto" + +#: html/Elements/SelectDateType:28 +msgid "Last Contacted" +msgstr "Ultimo Contatto" + +#: html/Search/Elements/TicketHeader:40 +msgid "Last Notified" +msgstr "Ultima Notifica" + +#: html/Elements/SelectDateType:29 +msgid "Last Updated" +msgstr "Ultimo Aggiornamento" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "LastUpdated" +msgstr "UltimoAggiornamento" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Left" +msgstr "Rimasti" + +#: html/Admin/Users/Modify.html:82 +msgid "Let this user access RT" +msgstr "Consenti a questo utente di accedere a RT" + +#: html/Admin/Users/Modify.html:86 +msgid "Let this user be granted rights" +msgstr "Concedi a questo utente che gli vengano assegnati i diritti" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Limiting owner to %1 %2" +msgstr "Limitare il proprietario %1 %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Limiting queue to %1 %2" +msgstr "Limitare la coda a %1 %2" + +#: lib/RT/Ticket_Overlay.pm:2703 +msgid "Link already exists" +msgstr "Il collegamento già esiste" + +#: lib/RT/Ticket_Overlay.pm:2715 +msgid "Link could not be created" +msgstr "Il collegamento non può essere creato" + +#. ($TransString) +#: lib/RT/Ticket_Overlay.pm:2723 +#: lib/RT/Ticket_Overlay.pm:2733 +msgid "Link created (%1)" +msgstr "Collegamento creato (%1)" + +#. ($TransString) +#: lib/RT/Ticket_Overlay.pm:2644 +msgid "Link deleted (%1)" +msgstr "Collegamento eliminato (%1)" + +#: lib/RT/Ticket_Overlay.pm:2650 +msgid "Link not found" +msgstr "Collegamento non trovato" + +#. ($Ticket->Id) +#: html/Ticket/ModifyLinks.html:24 +#: html/Ticket/ModifyLinks.html:28 +msgid "Link ticket #%1" +msgstr "Collega ticket n°%1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Link ticket %1" +msgstr "Collega ticket %1" + +#: html/Ticket/Elements/Tabs:96 +msgid "Links" +msgstr "Collegamenti" + +#: html/Admin/Users/Modify.html:113 +#: html/User/Prefs.html:84 +msgid "Location" +msgstr "Località" + +#. ($RT::LogDir) +#: lib/RT.pm:159 +msgid "" +"Log directory %1 not found or couldn't be written.\\n" +" RT can't run." +msgstr "" +"Directory di log %1 non trovata o non scrivibile.\\n" +" RT non può essere eseguito." + +#. ("".$session{'CurrentUser'}->Name."") +#: html/Elements/Header:56 +msgid "Logged in as %1" +msgstr "Collegato come %1" + +#: docs/design_docs/string-extraction-guide.txt:71 +#: html/Elements/Login:34 +#: html/Elements/Login:43 +#: html/Elements/Login:53 +msgid "Login" +msgstr "Collegamento" + +#: html/Elements/Header:53 +msgid "Logout" +msgstr "Scollegati" + +#: html/Search/Bulk.html:85 +msgid "Make Owner" +msgstr "Crea Proprietario" + +#: html/Search/Bulk.html:101 +msgid "Make Status" +msgstr "Crea Stato" + +#: html/Search/Bulk.html:108 +msgid "Make date Due" +msgstr "Crea data Scadenza" + +#: html/Search/Bulk.html:109 +msgid "Make date Resolved" +msgstr "Crea data Risolto" + +#: html/Search/Bulk.html:106 +msgid "Make date Started" +msgstr "Crea data Iniziato" + +#: html/Search/Bulk.html:105 +msgid "Make date Starts" +msgstr "Crea data Inizia" + +#: html/Search/Bulk.html:107 +msgid "Make date Told" +msgstr "Crea data Detto" + +#: html/Search/Bulk.html:98 +msgid "Make priority" +msgstr "Crea priorità" + +#: html/Search/Bulk.html:99 +msgid "Make queue" +msgstr "Crea coda" + +#: html/Search/Bulk.html:97 +msgid "Make subject" +msgstr "Crea oggetto" + +#: html/Admin/index.html:32 +msgid "Manage groups and group membership" +msgstr "Gestisci i gruppi e le appartenenze" + +#: html/Admin/index.html:38 +msgid "Manage properties and configuration which apply to all queues" +msgstr "Gestisci le proprietà e le configurazioni che si applicano a tutte le code" + +#: html/Admin/index.html:35 +msgid "Manage queues and queue-specific properties" +msgstr "Gestisci le code e le propietà specifiche delle code" + +#: html/Admin/index.html:29 +msgid "Manage users and passwords" +msgstr "Gestisci gli utenti e le password" + +#: lib/RT/Date.pm:412 +msgid "Mar." +msgstr "Mar." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "March" +msgstr "Marzo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "May" +msgstr "Maggio" + +#: lib/RT/Date.pm:414 +msgid "May." +msgstr "Mag." + +#: lib/RT/Group_Overlay.pm:981 +msgid "Member added" +msgstr "Aggiunto membro" + +#: lib/RT/Group_Overlay.pm:1139 +msgid "Member deleted" +msgstr "Eliminato membro" + +#: lib/RT/Group_Overlay.pm:1143 +msgid "Member not deleted" +msgstr "Membro non eliminato" + +#: html/Elements/SelectLinkType:25 +msgid "Member of" +msgstr "Membro di" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "MemberOf" +msgstr "MembroDi" + +#: html/Admin/Elements/GroupTabs:41 +#: html/User/Elements/GroupTabs:41 +msgid "Members" +msgstr "Membri" + +#: lib/RT/Ticket_Overlay.pm:2890 +msgid "Merge Successful" +msgstr "Unione avvenuta con Successo" + +#: lib/RT/Ticket_Overlay.pm:2810 +msgid "Merge failed. Couldn't set EffectiveId" +msgstr "Unione fallita. Impossibile impostare EffectiveId" + +#: html/Ticket/Elements/EditLinks:114 +msgid "Merge into" +msgstr "Unisci in" + +#: html/Ticket/Update.html:101 +msgid "Message" +msgstr "Messaggio" + +#: lib/RT/Interface/Web.pm:900 +msgid "Missing a primary key?: %1" +msgstr "Manca una chiave primaria?: %1" + +#: html/Admin/Users/Modify.html:168 +#: html/User/Prefs.html:53 +msgid "Mobile" +msgstr "Cellulare" + +#: html/Admin/Elements/ModifyUser:71 +msgid "MobilePhone" +msgstr "TelefonoCellulare" + +#: lib/RT/Queue_Overlay.pm:69 +msgid "Modify Access Control List" +msgstr "Modifca la Lista Controllo Accessi" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify Custom Field %1" +msgstr "Modifica il Campo Personalizzato %1" + +#: html/Admin/Global/CustomFields.html:43 +#: html/Admin/Global/index.html:50 +msgid "Modify Custom Fields which apply to all queues" +msgstr "Modifica i Campi Personalizzati validi per tutte le code" + +#: lib/RT/Queue_Overlay.pm:72 +msgid "Modify Scrip templates for this queue" +msgstr "Modifica i modelli di Scips per questa coda" + +#: lib/RT/Queue_Overlay.pm:75 +msgid "Modify Scrips for this queue" +msgstr "Modifica gli Scrips per questa coda" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify System ACLS" +msgstr "Modifica le LCA di Sistema" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify Template %1" +msgstr "Modifica il Modello %1" + +#. ($QueueObj->Name()) +#: html/Admin/Queues/CustomField.html:44 +msgid "Modify a CustomField for queue %1" +msgstr "Modifica un CampoPersonalizzato per la coda %1" + +#: html/Admin/Global/CustomField.html:52 +msgid "Modify a CustomField which applies to all queues" +msgstr "Modifica un CampoPersonalizzato valido per tutte le code" + +#. ($QueueObj->Name) +#: html/Admin/Queues/Scrip.html:53 +msgid "Modify a scrip for queue %1" +msgstr "Modifica uno scrip per la coda %1" + +#: html/Admin/Global/Scrip.html:47 +msgid "Modify a scrip which applies to all queues" +msgstr "Modifica uno scrip valido per tutte le code" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify dates for # %1" +msgstr "Modifica le date per n° %1" + +#. ($TicketObj->Id) +#: html/Ticket/ModifyDates.html:24 +#: html/Ticket/ModifyDates.html:28 +msgid "Modify dates for #%1" +msgstr "Modifica le date per n°%1" + +#. ($TicketObj->Id) +#: html/Ticket/ModifyDates.html:34 +msgid "Modify dates for ticket # %1" +msgstr "Modifica le date per il ticket n° %1" + +#: html/Admin/Global/GroupRights.html:24 +#: html/Admin/Global/GroupRights.html:27 +#: html/Admin/Global/index.html:55 +msgid "Modify global group rights" +msgstr "Modifica i diritti di gruppo globali" + +#: html/Admin/Global/GroupRights.html:32 +msgid "Modify global group rights." +msgstr "Modifica i diritti di gruppo globali." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify global rights for groups" +msgstr "Modifica i diritti di gruppo globali" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify global rights for users" +msgstr "Modifica i diritti globali per gli utenti" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify global scrips" +msgstr "Modifica gli scrips globali" + +#: html/Admin/Global/UserRights.html:24 +#: html/Admin/Global/UserRights.html:27 +#: html/Admin/Global/index.html:59 +msgid "Modify global user rights" +msgstr "Modifica i diritti globali per gli utenti" + +#: html/Admin/Global/UserRights.html:32 +msgid "Modify global user rights." +msgstr "Modifica i diritti globali per gli utenti." + +#: lib/RT/Group_Overlay.pm:145 +msgid "Modify group metadata or delete group" +msgstr "Modifica i metadati di gruppo o elimina un gruppo" + +#. ($GroupObj->Name) +#: html/Admin/Groups/GroupRights.html:24 +#: html/Admin/Groups/GroupRights.html:28 +#: html/Admin/Groups/GroupRights.html:34 +msgid "Modify group rights for group %1" +msgstr "Modifica i diritti di gruppo per il gruppo %1" + +#. ($QueueObj->Name) +#: html/Admin/Queues/GroupRights.html:24 +#: html/Admin/Queues/GroupRights.html:28 +msgid "Modify group rights for queue %1" +msgstr "Modifica i diritti di gruppo per la coda %1" + +#: lib/RT/Group_Overlay.pm:147 +msgid "Modify membership roster for this group" +msgstr "Modofica i membri di questo gruppo" + +#: lib/RT/System.pm:60 +msgid "Modify one's own RT account" +msgstr "Modifica il proprio account RT" + +#. ($QueueObj->Name) +#: html/Admin/Queues/People.html:24 +#: html/Admin/Queues/People.html:28 +msgid "Modify people related to queue %1" +msgstr "Modifica le persone relative alla coda %1" + +#. ($Ticket->id) +#. ($Ticket->Id) +#: html/Ticket/ModifyPeople.html:24 +#: html/Ticket/ModifyPeople.html:28 +#: html/Ticket/ModifyPeople.html:34 +msgid "Modify people related to ticket #%1" +msgstr "Modifica le persone relative al ticket n°%1" + +#. ($QueueObj->Name) +#: html/Admin/Queues/Scrips.html:43 +msgid "Modify scrips for queue %1" +msgstr "Modifica gli scrips per la coda %1" + +#: html/Admin/Global/Scrips.html:43 +#: html/Admin/Global/index.html:41 +msgid "Modify scrips which apply to all queues" +msgstr "Modifica gli scrips validi per tutte le code" + +#. (loc($TemplateObj->Name())) +#. ($TemplateObj->id) +#: html/Admin/Global/Template.html:24 +#: html/Admin/Global/Template.html:29 +#: html/Admin/Global/Template.html:80 +#: html/Admin/Queues/Template.html:77 +msgid "Modify template %1" +msgstr "Modifica modello %1" + +#: html/Admin/Global/Templates.html:43 +msgid "Modify templates which apply to all queues" +msgstr "Modifica i modelli validi per tutte le code" + +#. ($Group->Name) +#: html/Admin/Groups/Modify.html:86 +#: html/User/Groups/Modify.html:85 +msgid "Modify the group %1" +msgstr "Modifica il gruppo %1" + +#: lib/RT/Queue_Overlay.pm:70 +msgid "Modify the queue watchers" +msgstr "Modifica gli osservatori della coda" + +#. ($UserObj->Name) +#: html/Admin/Users/Modify.html:235 +msgid "Modify the user %1" +msgstr "Modifica l'utente %1" + +#. ($Ticket->Id) +#: html/Ticket/ModifyAll.html:36 +msgid "Modify ticket # %1" +msgstr "Modifica il ticket n° %1" + +#. ($TicketObj->Id) +#: html/Ticket/Modify.html:24 +#: html/Ticket/Modify.html:27 +#: html/Ticket/Modify.html:33 +msgid "Modify ticket #%1" +msgstr "Modifica il ticket n°%1" + +#: lib/RT/Queue_Overlay.pm:87 +msgid "Modify tickets" +msgstr "Modifica i tickets" + +#. ($GroupObj->Name) +#: html/Admin/Groups/UserRights.html:24 +#: html/Admin/Groups/UserRights.html:28 +#: html/Admin/Groups/UserRights.html:34 +msgid "Modify user rights for group %1" +msgstr "Modifica i diritti utente per il gruppo %1" + +#. ($QueueObj->Name) +#: html/Admin/Queues/UserRights.html:24 +#: html/Admin/Queues/UserRights.html:28 +msgid "Modify user rights for queue %1" +msgstr "Modifica i diritti dell'utente per la coda %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Modify watchers for queue '%1'" +msgstr "Modifica gli osservatori per la coda '%1'" + +#: lib/RT/Queue_Overlay.pm:69 +msgid "ModifyACL" +msgstr "ModificaLCA" + +#: lib/RT/Group_Overlay.pm:148 +msgid "ModifyOwnMembership" +msgstr "ModificaPropriaAppartenenza" + +#: lib/RT/Queue_Overlay.pm:70 +msgid "ModifyQueueWatchers" +msgstr "ModificaOsservatoriCoda" + +#: lib/RT/Queue_Overlay.pm:75 +msgid "ModifyScrips" +msgstr "ModificaScrips" + +#: lib/RT/System.pm:60 +msgid "ModifySelf" +msgstr "ModificaSeStesso" + +#: lib/RT/Queue_Overlay.pm:72 +msgid "ModifyTemplate" +msgstr "ModificaModello" + +#: lib/RT/Queue_Overlay.pm:87 +msgid "ModifyTicket" +msgstr "ModificaTicket" + +#: lib/RT/Date.pm:387 +msgid "Mon." +msgstr "Lun." + +#. ($name) +#: html/Ticket/Elements/ShowRequestor:41 +msgid "More about %1" +msgstr "Altre info su %1" + +#: html/Admin/Elements/EditCustomFields:60 +msgid "Move down" +msgstr "Move down" + +#: html/Admin/Elements/EditCustomFields:52 +msgid "Move up" +msgstr "Move up" + +#: html/Admin/Elements/SelectSingleOrMultiple:26 +msgid "Multiple" +msgstr "Multiple" + +#: lib/RT/User_Overlay.pm:178 +msgid "Must specify 'Name' attribute" +msgstr "Must specify 'Name' attribute" + +#. ($friendly_status) +#: html/SelfService/Elements/MyRequests:48 +msgid "My %1 tickets" +msgstr "I miei%1 tickets" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "My Approvals" +msgstr "Le mie richieste di Approvazione" + +#: html/Approvals/index.html:24 +#: html/Approvals/index.html:25 +msgid "My approvals" +msgstr "Le mie richieste di approvazione" + +#: html/Admin/Elements/AddCustomFieldValue:31 +#: html/Admin/Elements/EditCustomField:33 +#: html/Admin/Elements/ModifyTemplate:27 +#: html/Admin/Elements/ModifyUser:29 +#: html/Admin/Groups/Modify.html:43 +#: html/Elements/SelectGroups:25 +#: html/Elements/SelectUsers:27 +#: html/User/Groups/Modify.html:43 +msgid "Name" +msgstr "Nome" + +#: lib/RT/User_Overlay.pm:185 +msgid "Name in use" +msgstr "Name in use" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Need approval from system administrator" +msgstr "Need approval from system administrator" + +#: html/Ticket/Elements/ShowDates:51 +msgid "Never" +msgstr "Never" + +#: html/Elements/Quicksearch:29 +msgid "New" +msgstr "Nuovo" + +#: html/Admin/Elements/ModifyUser:31 +#: html/Admin/Users/Modify.html:92 +#: html/User/Prefs.html:64 +msgid "New Password" +msgstr "Nuova Password" + +#: etc/initialdata:317 +#: etc/upgrade/2.1.71:16 +msgid "New Pending Approval" +msgstr "New Pending Approval" + +#: html/Ticket/Elements/EditLinks:110 +msgid "New Relationships" +msgstr "New Relationships" + +#: html/Ticket/Elements/Tabs:35 +msgid "New Search" +msgstr "Nuova Ricerca" + +#: html/Admin/Global/CustomField.html:40 +#: html/Admin/Global/CustomFields.html:38 +#: html/Admin/Queues/CustomField.html:51 +#: html/Admin/Queues/CustomFields.html:39 +msgid "New custom field" +msgstr "Nuovo campo Personalizzato" + +#: html/Admin/Elements/GroupTabs:53 +#: html/User/Elements/GroupTabs:51 +msgid "New group" +msgstr "Nuovo gruppo" + +#: html/SelfService/Prefs.html:31 +msgid "New password" +msgstr "Nuova password" + +#: lib/RT/User_Overlay.pm:646 +msgid "New password notification sent" +msgstr "New password notification sent" + +#: html/Admin/Elements/QueueTabs:69 +msgid "New queue" +msgstr "Nuova coda" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "New request" +msgstr "Nuova richiesta" + +#: html/Admin/Elements/SelectRights:41 +msgid "New rights" +msgstr "Nuovi diritti" + +#: html/Admin/Global/Scrip.html:39 +#: html/Admin/Global/Scrips.html:38 +#: html/Admin/Queues/Scrip.html:42 +#: html/Admin/Queues/Scrips.html:52 +msgid "New scrip" +msgstr "Nuovo scrip" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "New search" +msgstr "Nuova ricerca" + +#: html/Admin/Global/Template.html:59 +#: html/Admin/Global/Templates.html:38 +#: html/Admin/Queues/Template.html:57 +#: html/Admin/Queues/Templates.html:49 +msgid "New template" +msgstr "Nuovo modello" + +#: html/SelfService/Elements/Tabs:47 +msgid "New ticket" +msgstr "Nuovo ticket" + +#: lib/RT/Ticket_Overlay.pm:2777 +msgid "New ticket doesn't exist" +msgstr "Il nuovo ticket non esiste" + +#: html/Admin/Elements/UserTabs:51 +msgid "New user" +msgstr "Nuovo utente" + +#: html/Admin/Elements/CreateUserCalled:25 +msgid "New user called" +msgstr "New user called" + +#: html/Admin/Queues/People.html:54 +#: html/Ticket/Elements/EditPeople:28 +msgid "New watchers" +msgstr "Nuovo osservatore" + +#: html/Admin/Users/Prefs.html:41 +msgid "New window setting" +msgstr "New window setting" + +#: html/Ticket/Elements/Tabs:68 +msgid "Next" +msgstr "Succesivo" + +#: html/Search/Listing.html:47 +msgid "Next page" +msgstr "Pagina succesiva" + +#: html/Admin/Elements/ModifyUser:49 +msgid "NickName" +msgstr "NickName" + +#: html/Admin/Users/Modify.html:62 +#: html/User/Prefs.html:45 +msgid "Nickname" +msgstr "Soprannome" + +#: html/Admin/Elements/EditCustomField:89 +#: html/Admin/Elements/EditCustomFields:104 +msgid "No CustomField" +msgstr "No CustomField" + +#: html/Admin/Groups/GroupRights.html:83 +#: html/Admin/Groups/UserRights.html:70 +msgid "No Group defined" +msgstr "No Group defined" + +#: html/Admin/Queues/GroupRights.html:95 +#: html/Admin/Queues/UserRights.html:67 +msgid "No Queue defined" +msgstr "No Queue defined" + +#: bin/rt-crontool:55 +msgid "No RT user found. Please consult your RT administrator.\\n" +msgstr "No RT user found. Please consult your RT administrator.\\n" + +#: html/Admin/Global/Template.html:78 +#: html/Admin/Queues/Template.html:75 +msgid "No Template" +msgstr "Nessun Modello" + +#: bin/rt-commit-handler:763 +msgid "No Ticket specified. Aborting ticket " +msgstr "No Ticket specified. Aborting ticket " + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "" +"No Ticket specified. Aborting ticket modifications\\n" +"\\n" +msgstr "" +"No Ticket specified. Aborting ticket modifications\\n" +"\\n" + +#: html/Approvals/Elements/Approve:45 +msgid "No action" +msgstr "No action" + +#: lib/RT/Interface/Web.pm:895 +msgid "No column specified" +msgstr "No column specified" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "No command found\\n" +msgstr "No command found\\n" + +#: html/Elements/ViewUser:35 +#: html/Ticket/Elements/ShowRequestor:44 +msgid "No comment entered about this user" +msgstr "No comment entered about this user" + +#: lib/RT/Ticket_Overlay.pm:2188 +#: lib/RT/Ticket_Overlay.pm:2256 +msgid "No correspondence attached" +msgstr "No correspondence attached" + +#. (ref $self) +#: lib/RT/Action/Generic.pm:149 +#: lib/RT/Condition/Generic.pm:175 +#: lib/RT/Search/ActiveTicketsInQueue.pm:55 +#: lib/RT/Search/Generic.pm:112 +msgid "No description for %1" +msgstr "Nessuna descrizione per %1" + +#: lib/RT/Users_Overlay.pm:151 +msgid "No group specified" +msgstr "No group specified" + +#: lib/RT/User_Overlay.pm:864 +msgid "No password set" +msgstr "No password set" + +#: lib/RT/Queue_Overlay.pm:258 +msgid "No permission to create queues" +msgstr "No permission to create code" + +#. ($QueueObj->Name) +#: lib/RT/Ticket_Overlay.pm:341 +msgid "No permission to create tickets in the queue '%1'" +msgstr "No permission to create tickets in the coda '%1'" + +#: lib/RT/User_Overlay.pm:151 +msgid "No permission to create users" +msgstr "No permission to create users" + +#: html/SelfService/Display.html:117 +msgid "No permission to display that ticket" +msgstr "No permission to display that ticket" + +#: html/SelfService/Update.html:51 +msgid "No permission to view update ticket" +msgstr "No permission to view update ticket" + +#: lib/RT/Queue_Overlay.pm:674 +#: lib/RT/Ticket_Overlay.pm:1487 +msgid "No principal specified" +msgstr "No principal specified" + +#: html/Admin/Queues/People.html:153 +#: html/Admin/Queues/People.html:163 +msgid "No principals selected." +msgstr "No principals selected." + +#: html/Admin/Queues/index.html:34 +msgid "No queues matching search criteria found." +msgstr "No code matching search criteria found." + +#: html/Admin/Elements/SelectRights:80 +msgid "No rights found" +msgstr "Nessun diritto trovato" + +#: html/Admin/Elements/SelectRights:32 +msgid "No rights granted." +msgstr "Nessun diritto concesso." + +#: html/Search/Bulk.html:148 +msgid "No search to operate on." +msgstr "No search to operate on." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "No ticket id specified" +msgstr "No ticket id specified" + +#: lib/RT/Transaction_Overlay.pm:477 +#: lib/RT/Transaction_Overlay.pm:515 +msgid "No transaction type specified" +msgstr "No transaction type specified" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "No user or email address specified" +msgstr "No user or email address specified" + +#: html/Admin/Users/index.html:35 +msgid "No users matching search criteria found." +msgstr "No users matching search criteria found." + +#: bin/rt-commit-handler:643 +msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" +msgstr "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" + +#: lib/RT/Interface/Web.pm:892 +msgid "No value sent to _Set!\\n" +msgstr "No value sent to _Set!\\n" + +#: html/Search/Elements/TicketRow:36 +msgid "Nobody" +msgstr "Nessuno" + +#: lib/RT/Interface/Web.pm:897 +msgid "Nonexistant field?" +msgstr "Nonexistant field?" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Not logged in" +msgstr "Not logged in" + +#: html/Elements/Header:58 +msgid "Not logged in." +msgstr "Non collegato." + +#: lib/RT/Date.pm:368 +msgid "Not set" +msgstr "Non valorizzato" + +#: html/NoAuth/Reminder.html:26 +msgid "Not yet implemented." +msgstr "Not yet implemented." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Not yet implemented...." +msgstr "Not yet implemented...." + +#: html/Approvals/Elements/Approve:48 +msgid "Notes" +msgstr "Notes" + +#: lib/RT/User_Overlay.pm:649 +msgid "Notification could not be sent" +msgstr "Notification could not be sent" + +#: etc/initialdata:94 +msgid "Notify AdminCcs" +msgstr "Notify AdminCcs" + +#: etc/initialdata:90 +msgid "Notify AdminCcs as Comment" +msgstr "Notify AdminCcs as Comment" + +#: etc/initialdata:121 +msgid "Notify Other Recipients" +msgstr "Notify Other Recipients" + +#: etc/initialdata:117 +msgid "Notify Other Recipients as Comment" +msgstr "Notify Other Recipients as Comment" + +#: etc/initialdata:86 +msgid "Notify Owner" +msgstr "Notify Proprietario" + +#: etc/initialdata:82 +msgid "Notify Owner as Comment" +msgstr "Notify Proprietario as Comment" + +#: etc/initialdata:319 +#: etc/upgrade/2.1.71:17 +msgid "Notify Owners and AdminCcs of new items pending their approval" +msgstr "Notify Proprietari and AdminCcs of new items pending their approval" + +#: etc/initialdata:78 +msgid "Notify Requestors" +msgstr "Notifica al Richiedente" + +#: etc/initialdata:104 +msgid "Notify Requestors and Ccs" +msgstr "Notifica ai Richiedenti e ai Ccs" + +#: etc/initialdata:99 +msgid "Notify Requestors and Ccs as Comment" +msgstr "Notifica ai Richiedenti e ai Ccs come Commento" + +#: etc/initialdata:113 +msgid "Notify Requestors, Ccs and AdminCcs" +msgstr "Notifica ai Richiedenti, Ccs e AdminCcs" + +#: etc/initialdata:109 +msgid "Notify Requestors, Ccs and AdminCcs as Comment" +msgstr "Notifica ai Richiedenti, Ccs a AdminCcs come Commento" + +#: lib/RT/Date.pm:420 +msgid "Nov." +msgstr "Nov." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "November" +msgstr "November" + +#: lib/RT/Record.pm:156 +msgid "Object could not be created" +msgstr "Object could not be created" + +#: lib/RT/Record.pm:175 +msgid "Object created" +msgstr "Object created" + +#: lib/RT/Date.pm:419 +msgid "Oct." +msgstr "Oct." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "October" +msgstr "October" + +#: html/Elements/SelectDateRelation:34 +msgid "On" +msgstr "On" + +#: etc/initialdata:155 +msgid "On Comment" +msgstr "On Comment" + +#: etc/initialdata:148 +msgid "On Correspond" +msgstr "On Correspond" + +#: etc/initialdata:137 +msgid "On Create" +msgstr "On Create" + +#: etc/initialdata:169 +msgid "On Owner Change" +msgstr "On Owner Change" + +#: etc/initialdata:177 +msgid "On Queue Change" +msgstr "On Queue Change" + +#: etc/initialdata:183 +msgid "On Resolve" +msgstr "On Resolve" + +#: etc/initialdata:161 +msgid "On Status Change" +msgstr "On Status Change" + +#: etc/initialdata:142 +msgid "On Transaction" +msgstr "On Transaction" + +#. ("") +#: html/Approvals/Elements/PendingMyApproval:49 +msgid "Only show approvals for requests created after %1" +msgstr "Mostra le approvazioni solo per le richieste create dopo %1" + +#. ("") +#: html/Approvals/Elements/PendingMyApproval:47 +msgid "Only show approvals for requests created before %1" +msgstr "Mostra le approvazioni solo per le richieste create prima %1" + +#: html/Elements/Quicksearch:30 +msgid "Open" +msgstr "Aperto" + +#: html/Ticket/Elements/Tabs:135 +msgid "Open it" +msgstr "Aprilo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Open requests" +msgstr "Richieste aperte" + +#: html/SelfService/Elements/Tabs:41 +msgid "Open tickets" +msgstr "Open tickets" + +#: html/Admin/Users/Prefs.html:40 +msgid "Open tickets (from listing) in a new window" +msgstr "Open tickets (from listing) in a new window" + +#: html/Admin/Users/Prefs.html:39 +msgid "Open tickets (from listing) in another window" +msgstr "Open tickets (from listing) in another window" + +#: etc/initialdata:133 +msgid "Open tickets on correspondence" +msgstr "Open tickets on correspondence" + +#: html/Search/Elements/PickRestriction:100 +msgid "Ordering and sorting" +msgstr "Visualizzazione e Ordinamento" + +#: html/Admin/Elements/ModifyUser:45 +#: html/Admin/Users/Modify.html:116 +#: html/Elements/SelectUsers:28 +#: html/User/Prefs.html:85 +msgid "Organization" +msgstr "Azienda" + +#. ($approving->Id, $approving->Subject) +#: html/Approvals/Elements/Approve:32 +msgid "Originating ticket: #%1" +msgstr "Originating ticket: n°%1" + +#: html/Admin/Elements/ModifyQueue:54 +#: html/Admin/Queues/Modify.html:68 +msgid "Over time, priority moves toward" +msgstr "Se scade il tempo, la priorità sale di" + +#: lib/RT/Queue_Overlay.pm:86 +msgid "Own tickets" +msgstr "Own tickets" + +#: lib/RT/Queue_Overlay.pm:86 +msgid "OwnTicket" +msgstr "PossiediTicket" + +#: etc/initialdata:38 +#: html/Elements/MyRequests:31 +#: html/SelfService/Elements/MyRequests:29 +#: html/Ticket/Create.html:47 +#: html/Ticket/Elements/EditPeople:42 +#: html/Ticket/Elements/EditPeople:43 +#: html/Ticket/Elements/ShowPeople:26 +#: html/Ticket/Update.html:62 +#: lib/RT/ACE_Overlay.pm:85 +#: lib/RT/Tickets_Overlay.pm:1243 +msgid "Owner" +msgstr "Proprietario" + +#. ($OldOwnerObj->Name, $NewOwnerObj->Name) +#: lib/RT/Ticket_Overlay.pm:3070 +msgid "Owner changed from %1 to %2" +msgstr "Proprietario changed from %1 to %2" + +#. ($Old->Name , $New->Name) +#: lib/RT/Transaction_Overlay.pm:581 +msgid "Owner forcibly changed from %1 to %2" +msgstr "Owner forcibly changed from %1 to %2" + +#: html/Search/Elements/PickRestriction:30 +msgid "Owner is" +msgstr "Il Proprietario è" + +#: html/Admin/Users/Modify.html:173 +#: html/User/Prefs.html:55 +msgid "Pager" +msgstr "Pager" + +#: html/Admin/Elements/ModifyUser:73 +msgid "PagerPhone" +msgstr "PagerPhone" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Parent" +msgstr "" + +#: html/Ticket/Create.html:181 +#: html/Ticket/Elements/EditLinks:126 +#: html/Ticket/Elements/EditLinks:57 +#: html/Ticket/Elements/ShowLinks:46 +msgid "Parents" +msgstr "Genitori" + +#: html/Elements/Login:51 +#: html/User/Prefs.html:60 +msgid "Password" +msgstr "Password" + +#: html/NoAuth/Reminder.html:24 +msgid "Password Reminder" +msgstr "Password Reminder" + +#: lib/RT/User_Overlay.pm:168 +#: lib/RT/User_Overlay.pm:867 +msgid "Password too short" +msgstr "Password too short" + +#. (loc_fuzzy($msg)) +#: html/Admin/Users/Modify.html:290 +#: html/User/Prefs.html:171 +msgid "Password: %1" +msgstr "Password: %1" + +#: html/Admin/Users/Modify.html:292 +msgid "Passwords do not match." +msgstr "Passwords do not match." + +#: html/User/Prefs.html:173 +msgid "Passwords do not match. Your password has not been changed" +msgstr "Passwords do not match. Your password has not been changed" + +#: html/Ticket/Elements/ShowSummary:44 +#: html/Ticket/Elements/Tabs:95 +#: html/Ticket/ModifyAll.html:50 +msgid "People" +msgstr "Persone" + +#: etc/initialdata:126 +msgid "Perform a user-defined action" +msgstr "Perform a user-defined action" + +#: lib/RT/ACE_Overlay.pm:230 +#: lib/RT/ACE_Overlay.pm:236 +#: lib/RT/ACE_Overlay.pm:562 +#: lib/RT/ACE_Overlay.pm:572 +#: lib/RT/ACE_Overlay.pm:582 +#: lib/RT/ACE_Overlay.pm:647 +#: lib/RT/CurrentUser.pm:82 +#: lib/RT/CurrentUser.pm:91 +#: lib/RT/CustomField_Overlay.pm:100 +#: lib/RT/CustomField_Overlay.pm:201 +#: lib/RT/CustomField_Overlay.pm:233 +#: lib/RT/CustomField_Overlay.pm:510 +#: lib/RT/CustomField_Overlay.pm:90 +#: lib/RT/Group_Overlay.pm:1094 +#: lib/RT/Group_Overlay.pm:1098 +#: lib/RT/Group_Overlay.pm:1107 +#: lib/RT/Group_Overlay.pm:1158 +#: lib/RT/Group_Overlay.pm:1162 +#: lib/RT/Group_Overlay.pm:1168 +#: lib/RT/Group_Overlay.pm:425 +#: lib/RT/Group_Overlay.pm:517 +#: lib/RT/Group_Overlay.pm:595 +#: lib/RT/Group_Overlay.pm:603 +#: lib/RT/Group_Overlay.pm:700 +#: lib/RT/Group_Overlay.pm:704 +#: lib/RT/Group_Overlay.pm:710 +#: lib/RT/Group_Overlay.pm:903 +#: lib/RT/Group_Overlay.pm:907 +#: lib/RT/Group_Overlay.pm:920 +#: lib/RT/Queue_Overlay.pm:539 +#: lib/RT/Queue_Overlay.pm:549 +#: lib/RT/Queue_Overlay.pm:563 +#: lib/RT/Queue_Overlay.pm:698 +#: lib/RT/Queue_Overlay.pm:707 +#: lib/RT/Queue_Overlay.pm:720 +#: lib/RT/Queue_Overlay.pm:930 +#: lib/RT/Scrip_Overlay.pm:125 +#: lib/RT/Scrip_Overlay.pm:136 +#: lib/RT/Scrip_Overlay.pm:196 +#: lib/RT/Scrip_Overlay.pm:429 +#: lib/RT/Template_Overlay.pm:283 +#: lib/RT/Template_Overlay.pm:87 +#: lib/RT/Template_Overlay.pm:93 +#: lib/RT/Ticket_Overlay.pm:1340 +#: lib/RT/Ticket_Overlay.pm:1350 +#: lib/RT/Ticket_Overlay.pm:1364 +#: lib/RT/Ticket_Overlay.pm:1517 +#: lib/RT/Ticket_Overlay.pm:1526 +#: lib/RT/Ticket_Overlay.pm:1539 +#: lib/RT/Ticket_Overlay.pm:1874 +#: lib/RT/Ticket_Overlay.pm:2012 +#: lib/RT/Ticket_Overlay.pm:2176 +#: lib/RT/Ticket_Overlay.pm:2243 +#: lib/RT/Ticket_Overlay.pm:2602 +#: lib/RT/Ticket_Overlay.pm:2674 +#: lib/RT/Ticket_Overlay.pm:2768 +#: lib/RT/Ticket_Overlay.pm:2783 +#: lib/RT/Ticket_Overlay.pm:2977 +#: lib/RT/Ticket_Overlay.pm:3205 +#: lib/RT/Ticket_Overlay.pm:3403 +#: lib/RT/Ticket_Overlay.pm:3565 +#: lib/RT/Ticket_Overlay.pm:3617 +#: lib/RT/Ticket_Overlay.pm:3782 +#: lib/RT/Transaction_Overlay.pm:465 +#: lib/RT/Transaction_Overlay.pm:472 +#: lib/RT/Transaction_Overlay.pm:501 +#: lib/RT/Transaction_Overlay.pm:508 +#: lib/RT/User_Overlay.pm:1354 +#: lib/RT/User_Overlay.pm:569 +#: lib/RT/User_Overlay.pm:604 +#: lib/RT/User_Overlay.pm:860 +#: lib/RT/User_Overlay.pm:961 +msgid "Permission Denied" +msgstr "Permission Denied" + +#: html/User/Elements/Tabs:34 +msgid "Personal Groups" +msgstr "Gruppi Personali" + +#: html/User/Groups/index.html:29 +#: html/User/Groups/index.html:39 +msgid "Personal groups" +msgstr "Gruppi personali" + +#: html/User/Elements/DelegateRights:36 +msgid "Personal groups:" +msgstr "Gruppi personali:" + +#: html/Admin/Users/Modify.html:155 +#: html/User/Prefs.html:48 +msgid "Phone numbers" +msgstr "Numeri Telefonici" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Placeholder" +msgstr "Placeholder" + +#: html/Elements/Header:51 +#: html/Elements/Tabs:52 +#: html/SelfService/Elements/Tabs:50 +#: html/SelfService/Prefs.html:24 +#: html/User/Prefs.html:24 +#: html/User/Prefs.html:27 +msgid "Preferences" +msgstr "Preferenze" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Prefs" +msgstr "Prefs" + +#: lib/RT/Action/Generic.pm:159 +msgid "Prepare Stubbed" +msgstr "Prepare Stubbed" + +#: html/Ticket/Elements/Tabs:60 +msgid "Prev" +msgstr "Precedente" + +#: html/Search/Listing.html:43 +msgid "Previous page" +msgstr "Previous page" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Pri" +msgstr "Pri" + +#. ($args{'PrincipalId'}) +#: lib/RT/ACE_Overlay.pm:132 +#: lib/RT/ACE_Overlay.pm:207 +#: lib/RT/ACE_Overlay.pm:551 +msgid "Principal %1 not found." +msgstr "Principal %1 not found." + +#: html/Search/Elements/PickRestriction:53 +#: html/Ticket/Create.html:153 +#: html/Ticket/Elements/EditBasics:53 +#: html/Ticket/Elements/ShowBasics:38 +#: lib/RT/Tickets_Overlay.pm:1041 +msgid "Priority" +msgstr "Priorità" + +#: html/Admin/Elements/ModifyQueue:50 +#: html/Admin/Queues/Modify.html:64 +msgid "Priority starts at" +msgstr "La priorità inizia da" + +#: etc/initialdata:25 +msgid "Privileged" +msgstr "Privilegiato" + +#. (loc_fuzzy($msg)) +#: html/Admin/Users/Modify.html:270 +#: html/User/Prefs.html:162 +msgid "Privileged status: %1" +msgstr "Stato previlegiato: %1" + +#: html/Admin/Users/index.html:61 +msgid "Privileged users" +msgstr "Utenti privilegiati" + +#: etc/initialdata:23 +#: etc/initialdata:29 +#: etc/initialdata:35 +#: etc/initialdata:59 +msgid "Pseudogroup for internal use" +msgstr "Pseudogroup for internal use" + +#: html/Elements/MyRequests:29 +#: html/Elements/MyTickets:29 +#: html/Elements/Quicksearch:28 +#: html/Search/Elements/PickRestriction:45 +#: html/SelfService/Create.html:32 +#: html/Ticket/Create.html:37 +#: html/Ticket/Elements/EditBasics:63 +#: html/Ticket/Elements/ShowBasics:42 +#: html/User/Elements/DelegateRights:79 +#: lib/RT/Tickets_Overlay.pm:882 +msgid "Queue" +msgstr "Coda" + +#. ($Queue) +#. ($id) +#: html/Admin/Queues/CustomField.html:41 +#: html/Admin/Queues/Scrip.html:49 +#: html/Admin/Queues/Scrips.html:45 +#: html/Admin/Queues/Templates.html:43 +msgid "Queue %1 not found" +msgstr "Queue %1 not found" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Queue '%1' not found\\n" +msgstr "Queue '%1' not found\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Queue Keyword Selections" +msgstr "Queue Keyword Selections" + +#: html/Admin/Elements/ModifyQueue:30 +#: html/Admin/Queues/Modify.html:42 +msgid "Queue Name" +msgstr "Nome della coda" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Queue Scrips" +msgstr "Queue Scrips" + +#: lib/RT/Queue_Overlay.pm:262 +msgid "Queue already exists" +msgstr "Queue already exists" + +#: lib/RT/Queue_Overlay.pm:271 +#: lib/RT/Queue_Overlay.pm:277 +msgid "Queue could not be created" +msgstr "Queue could not be created" + +#: html/Ticket/Create.html:204 +msgid "Queue could not be loaded." +msgstr "Queue could not be loaded." + +#: docs/design_docs/string-extraction-guide.txt:83 +#: lib/RT/Queue_Overlay.pm:281 +msgid "Queue created" +msgstr "Queue created" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Queue is not specified." +msgstr "Queue is not specified." + +#: html/SelfService/Display.html:70 +#: lib/RT/CustomField_Overlay.pm:97 +msgid "Queue not found" +msgstr "Queue not found" + +#: html/Admin/Elements/Tabs:37 +#: html/Admin/index.html:34 +msgid "Queues" +msgstr "Code" + +#: html/Elements/Quicksearch:24 +msgid "Quick search" +msgstr "Ricerca veloce" + +#. ($RT::VERSION) +#: html/Elements/Login:43 +msgid "RT %1" +msgstr "RT %1" + +#. ($RT::VERSION, $RT::rtname) +#: docs/design_docs/string-extraction-guide.txt:70 +msgid "RT %1 for %2" +msgstr "RT %1 per %2" + +#. ($RT::VERSION) +#: html/Elements/Footer:31 +msgid "RT %1 from Best Practical Solutions, LLC." +msgstr "RT %1 da Best Practical Solutions, LLC." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT %1. Copyright 1996-%1 Jesse Vincent \\n" +msgstr "RT %1. Copyright 1996-%1 Jesse Vincent \\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT %1. Copyright 1996-2002 Jesse Vincent \\n" +msgstr "RT %1. Copyright 1996-2002 Jesse Vincent \\n" + +#: html/Admin/index.html:24 +#: html/Admin/index.html:25 +msgid "RT Administration" +msgstr "RT Administration" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Authentication error." +msgstr "RT Authentication error." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Bounce: %1" +msgstr "RT Bounce: %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Configuration error" +msgstr "RT Configuration error" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Critical error. Message not recorded!" +msgstr "RT Critical error. Message not recorded!" + +#: html/Elements/Error:40 +#: html/SelfService/Error.html:40 +msgid "RT Error" +msgstr "RT Error" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Received mail (%1) from itself." +msgstr "RT Received mail (%1) from itself." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Recieved mail (%1) from itself." +msgstr "RT Recieved mail (%1) from itself." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT Self Service / Closed Tickets" +msgstr "RT Self Service / Closed Tickets" + +#: html/index.html:24 +#: html/index.html:27 +msgid "RT at a glance" +msgstr "Colpo d'occhio di RT" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT couldn't authenticate you" +msgstr "RT couldn't authenticate you" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT couldn't find requestor via its external database lookup" +msgstr "RT couldn't find requestor via its external database lookup" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT couldn't find the queue: %1" +msgstr "RT couldn't find the coda: %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT couldn't validate this PGP signature. \\n" +msgstr "RT couldn't validate this PGP signature. \\n" + +#. ($RT::rtname) +#: html/Elements/PageLayout:25 +msgid "RT for %1" +msgstr "RT per %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT for %1: %2" +msgstr "RT per %1: %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT has proccessed your commands" +msgstr "RT has proccessed your commands" + +#. ('2003') +#: html/Elements/Login:91 +msgid "RT is © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>. It is distributed under Version 2 of the GNU General Public License." +msgstr "RT is © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>. RT viene distribuito con la Versione 2 della GNU General Public License." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT is © Copyright 1996-2002 Jesse Vincent <jesse@bestpractical.com>. It is distributed under Version 2 of the GNU General Public License." +msgstr "RT is © Copyright 1996-2002 Jesse Vincent <jesse@bestpractical.com>. RT viene distribuito con la Versione 2 della GNU General Public License." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT thinks this message may be a bounce" +msgstr "RT thinks this message may be a bounce" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT will process this message as if it were unsigned.\\n" +msgstr "RT will process this message as if it were unsigned.\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RT's email command mode requires PGP authentication. Either you didn't sign your message, or your signature could not be verified." +msgstr "RT's email command mode requires PGP authentication. Either you didn't sign your message, or your signature could not be verified." + +#: html/Admin/Users/Modify.html:57 +#: html/Admin/Users/Prefs.html:51 +#: html/User/Prefs.html:43 +msgid "Real Name" +msgstr "Nome Reale" + +#: html/Admin/Elements/ModifyUser:47 +msgid "RealName" +msgstr "RealName" + +#: html/Ticket/Create.html:184 +#: html/Ticket/Elements/EditLinks:138 +#: html/Ticket/Elements/EditLinks:93 +#: html/Ticket/Elements/ShowLinks:70 +msgid "Referred to by" +msgstr "Riferito da" + +#: html/Elements/SelectLinkType:27 +#: html/Ticket/Create.html:183 +#: html/Ticket/Elements/EditLinks:134 +#: html/Ticket/Elements/EditLinks:79 +#: html/Ticket/Elements/ShowLinks:60 +msgid "Refers to" +msgstr "Fa riferimento a" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RefersTo" +msgstr "RefersTo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Refine" +msgstr "Refine" + +#: html/Search/Elements/PickRestriction:26 +msgid "Refine search" +msgstr "Rifinisci la ricerca" + +#. ($value/60) +#: html/Elements/Refresh:35 +msgid "Refresh this page every %1 minutes." +msgstr "Aggiorna questa pagina ogni %1 minuti." + +#: html/Ticket/Create.html:173 +#: html/Ticket/Elements/ShowSummary:61 +#: html/Ticket/ModifyAll.html:56 +msgid "Relationships" +msgstr "Relazioni" + +#: html/Search/Bulk.html:92 +msgid "Remove AdminCc" +msgstr "Remove AdminCc" + +#: html/Search/Bulk.html:90 +msgid "Remove Cc" +msgstr "Remove Cc" + +#: html/Search/Bulk.html:88 +msgid "Remove Requestor" +msgstr "Rimuovi il RIchiedente" + +#: html/Ticket/Elements/ShowTransaction:172 +#: html/Ticket/Elements/Tabs:121 +msgid "Reply" +msgstr "Risposta" + +#: lib/RT/Queue_Overlay.pm:84 +msgid "Reply to tickets" +msgstr "Rispondi ai tickets" + +#: lib/RT/Queue_Overlay.pm:84 +msgid "ReplyToTicket" +msgstr "RispondiAlTicket" + +#: etc/initialdata:44 +#: html/Ticket/Update.html:39 +#: lib/RT/ACE_Overlay.pm:86 +msgid "Requestor" +msgstr "Richiedente" + +#: html/Search/Elements/PickRestriction:37 +msgid "Requestor email address" +msgstr "Indirizzo emaildel richiedente" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Requestor(s)" +msgstr "Richiedente(i)" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RequestorAddresses" +msgstr "IndirizzoRichiedente" + +#: html/SelfService/Create.html:40 +#: html/Ticket/Create.html:55 +#: html/Ticket/Elements/EditPeople:47 +#: html/Ticket/Elements/ShowPeople:30 +msgid "Requestors" +msgstr "Richiedenti" + +#: html/Admin/Elements/ModifyQueue:60 +#: html/Admin/Queues/Modify.html:74 +msgid "Requests should be due in" +msgstr "Le richieste devono essere soddisfatte in" + +#: html/Elements/Submit:61 +msgid "Reset" +msgstr "Azzera" + +#: html/Admin/Users/Modify.html:158 +#: html/User/Prefs.html:49 +msgid "Residence" +msgstr "Casa" + +#: html/Ticket/Elements/Tabs:131 +msgid "Resolve" +msgstr "Risolvi" + +#. ($Ticket->id, $Ticket->Subject) +#: html/Ticket/Update.html:132 +msgid "Resolve ticket #%1 (%2)" +msgstr "Risolvi il ticket n°%1 (%2)" + +#: etc/initialdata:308 +#: html/Elements/SelectDateType:27 +#: lib/RT/Ticket_Overlay.pm:1169 +msgid "Resolved" +msgstr "Risolto" + +#: html/Search/Bulk.html:122 +#: html/Ticket/ModifyAll.html:72 +#: html/Ticket/Update.html:72 +msgid "Response to requestors" +msgstr "Risposta ai richiedenti" + +#: html/Elements/ListActions:25 +msgid "Results" +msgstr "Risultati" + +#: html/Search/Elements/PickRestriction:104 +msgid "Results per page" +msgstr "Risultati per pagina" + +#: html/Admin/Elements/ModifyUser:32 +#: html/Admin/Users/Modify.html:99 +#: html/User/Prefs.html:71 +msgid "Retype Password" +msgstr "Ridigita Password" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Right %1 not found for %2 %3 in scope %4 (%5)\\n" +msgstr "Right %1 not found for %2 %3 in scope %4 (%5)\\n" + +#: lib/RT/ACE_Overlay.pm:612 +msgid "Right Delegated" +msgstr "Right Delegated" + +#: lib/RT/ACE_Overlay.pm:302 +msgid "Right Granted" +msgstr "Right Granted" + +#: lib/RT/ACE_Overlay.pm:160 +msgid "Right Loaded" +msgstr "Right Loaded" + +#: lib/RT/ACE_Overlay.pm:677 +#: lib/RT/ACE_Overlay.pm:692 +msgid "Right could not be revoked" +msgstr "Right could not be revoked" + +#: html/User/Delegation.html:63 +msgid "Right not found" +msgstr "Right not found" + +#: lib/RT/ACE_Overlay.pm:542 +#: lib/RT/ACE_Overlay.pm:637 +msgid "Right not loaded." +msgstr "Right not loaded." + +#: lib/RT/ACE_Overlay.pm:688 +msgid "Right revoked" +msgstr "Right revoked" + +#: html/Admin/Elements/UserTabs:40 +msgid "Rights" +msgstr "Diritti" + +#. ($object_type) +#: lib/RT/Interface/Web.pm:791 +msgid "Rights could not be granted for %1" +msgstr "I diritti non possono essere concessi per %1" + +#. ($object_type) +#: lib/RT/Interface/Web.pm:824 +msgid "Rights could not be revoked for %1" +msgstr "I diritti non possono essere revocaqti per %1" + +#: html/Admin/Global/GroupRights.html:50 +#: html/Admin/Queues/GroupRights.html:51 +msgid "Roles" +msgstr "Ruoli" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "RootApproval" +msgstr "RootApproval" + +#: lib/RT/Date.pm:392 +msgid "Sat." +msgstr "Sab." + +#: html/Admin/Queues/People.html:104 +#: html/Ticket/Modify.html:38 +#: html/Ticket/ModifyAll.html:93 +#: html/Ticket/ModifyLinks.html:38 +#: html/Ticket/ModifyPeople.html:37 +msgid "Save Changes" +msgstr "Salva i Cambiamenti" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Save changes" +msgstr "Salva i cambiamenti" + +#. ($ARGS{'id'}) +#: html/Admin/Global/Scrip.html:48 +msgid "Scrip #%1" +msgstr "Scrip n°%1" + +#: lib/RT/Scrip_Overlay.pm:175 +msgid "Scrip Created" +msgstr "Scrip Created" + +#: html/Admin/Elements/EditScrips:83 +msgid "Scrip deleted" +msgstr "Scrip eliminato" + +#: html/Admin/Elements/QueueTabs:45 +#: html/Admin/Elements/SystemTabs:32 +#: html/Admin/Global/index.html:40 +msgid "Scrips" +msgstr "Scrips" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Scrips for %1\\n" +msgstr "Scrips per %1\\n" + +#: html/Admin/Queues/Scrips.html:32 +msgid "Scrips which apply to all queues" +msgstr "Scrips which apply to all code" + +#: html/Elements/SimpleSearch:26 +#: html/Search/Elements/PickRestriction:125 +#: html/Ticket/Elements/Tabs:158 +msgid "Search" +msgstr "Cerca" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Search Criteria" +msgstr "Crieri di Ricerca" + +#: html/Approvals/Elements/PendingMyApproval:38 +msgid "Search for approvals" +msgstr "Ricerca le richieste di approvazione" + +#: bin/rt-crontool:187 +msgid "Security:" +msgstr "Security:" + +#: lib/RT/Queue_Overlay.pm:66 +msgid "SeeQueue" +msgstr "VediCoda" + +#: html/Admin/Groups/index.html:39 +msgid "Select a group" +msgstr "Seleziona un gruppo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Select a queue" +msgstr "Seleziona una coda" + +#: html/Admin/Users/index.html:24 +#: html/Admin/Users/index.html:27 +msgid "Select a user" +msgstr "Seleziona un utente" + +#: html/Admin/Global/CustomField.html:37 +#: html/Admin/Global/CustomFields.html:35 +msgid "Select custom field" +msgstr "Seleziona un campo personalizzato" + +#: html/Admin/Elements/GroupTabs:51 +#: html/User/Elements/GroupTabs:49 +msgid "Select group" +msgstr "Seleziona gruppo" + +#: lib/RT/CustomField_Overlay.pm:421 +msgid "Select multiple values" +msgstr "Seleziona valori multipli" + +#: lib/RT/CustomField_Overlay.pm:418 +msgid "Select one value" +msgstr "Seleziona un volore solo" + +#: html/Admin/Elements/QueueTabs:66 +msgid "Select queue" +msgstr "Seleziona una coda" + +#: html/Admin/Global/Scrip.html:36 +#: html/Admin/Global/Scrips.html:35 +#: html/Admin/Queues/Scrip.html:39 +#: html/Admin/Queues/Scrips.html:49 +msgid "Select scrip" +msgstr "Seleziona uno scrip" + +#: html/Admin/Global/Template.html:56 +#: html/Admin/Global/Templates.html:35 +#: html/Admin/Queues/Template.html:54 +#: html/Admin/Queues/Templates.html:46 +msgid "Select template" +msgstr "Seleziona un modello" + +#: html/Admin/Elements/UserTabs:48 +msgid "Select user" +msgstr "Seleziona utente" + +#: lib/RT/CustomField_Overlay.pm:35 +msgid "SelectMultiple" +msgstr "SelectMultiple" + +#: lib/RT/CustomField_Overlay.pm:34 +msgid "SelectSingle" +msgstr "SelectSingle" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Self Service" +msgstr "Self Service" + +#: etc/initialdata:114 +msgid "Send mail to all watchers" +msgstr "Invia una mail a tutti gli osservatori" + +#: etc/initialdata:110 +msgid "Send mail to all watchers as a \"comment\"" +msgstr "Invia una mail atutti gli osservatori come un \"commento\"" + +#: etc/initialdata:105 +msgid "Send mail to requestors and Ccs" +msgstr "Invia mail ai richiedenti e Ccs" + +#: etc/initialdata:100 +msgid "Send mail to requestors and Ccs as a comment" +msgstr "Invia mail ai richiedenti e Ccs come commento" + +#: etc/initialdata:79 +msgid "Sends a message to the requestors" +msgstr "Invia un messaggio ai richiedenti" + +#: etc/initialdata:118 +#: etc/initialdata:122 +msgid "Sends mail to explicitly listed Ccs and Bccs" +msgstr "Sends mail to explicitly listed Ccs and Bccs" + +#: etc/initialdata:95 +msgid "Sends mail to the administrative Ccs" +msgstr "Sends mail to the administrative Ccs" + +#: etc/initialdata:91 +msgid "Sends mail to the administrative Ccs as a comment" +msgstr "Sends mail to the administrative Ccs as a comment" + +#: etc/initialdata:83 +#: etc/initialdata:87 +msgid "Sends mail to the owner" +msgstr "Sends mail to the owner" + +#: lib/RT/Date.pm:418 +msgid "Sep." +msgstr "Sep." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "September" +msgstr "September" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Show Results" +msgstr "Mostra i Risultati" + +#: html/Approvals/Elements/PendingMyApproval:43 +msgid "Show approved requests" +msgstr "Mostra le richieste approvate" + +#: html/Ticket/Create.html:143 +#: html/Ticket/Create.html:33 +msgid "Show basics" +msgstr "Mostra info di base" + +#: html/Approvals/Elements/PendingMyApproval:44 +msgid "Show denied requests" +msgstr "Mostra le richieste negate" + +#: html/Ticket/Create.html:143 +#: html/Ticket/Create.html:33 +msgid "Show details" +msgstr "Mostra i dettagli" + +#: html/Approvals/Elements/PendingMyApproval:42 +msgid "Show pending requests" +msgstr "Mostra le richieste in attesa" + +#: html/Approvals/Elements/PendingMyApproval:45 +msgid "Show requests awaiting other approvals" +msgstr "Mostra le richieste in attesa di altre approvazioni" + +#: lib/RT/Queue_Overlay.pm:80 +msgid "Show ticket private commentary" +msgstr "Show ticket private commentary" + +#: lib/RT/Queue_Overlay.pm:78 +msgid "Show ticket summaries" +msgstr "Show ticket summaries" + +#: lib/RT/Queue_Overlay.pm:68 +msgid "ShowACL" +msgstr "MostraLCA" + +#: lib/RT/Queue_Overlay.pm:77 +msgid "ShowScrips" +msgstr "MostraScrips" + +#: lib/RT/Queue_Overlay.pm:74 +msgid "ShowTemplate" +msgstr "MostraModello" + +#: lib/RT/Queue_Overlay.pm:78 +msgid "ShowTicket" +msgstr "MostraTicket" + +#: lib/RT/Queue_Overlay.pm:80 +msgid "ShowTicketComments" +msgstr "MostraICommentiAlTicket" + +#: lib/RT/Queue_Overlay.pm:81 +msgid "Sign up as a ticket Requestor or ticket or queue Cc" +msgstr "Sign up as a ticket Requestor or ticket or coda Cc" + +#: lib/RT/Queue_Overlay.pm:82 +msgid "Sign up as a ticket or queue AdminCc" +msgstr "Sign up as a ticket or coda AdminCc" + +#: html/Admin/Elements/ModifyUser:38 +#: html/Admin/Users/Modify.html:190 +#: html/Admin/Users/Prefs.html:31 +#: html/User/Prefs.html:111 +msgid "Signature" +msgstr "Firma" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Signed in as %1" +msgstr "Signed in as %1" + +#: html/Admin/Elements/SelectSingleOrMultiple:25 +msgid "Single" +msgstr "Single" + +#: html/Elements/Header:50 +msgid "Skip Menu" +msgstr "Skip Menu" + +#: html/Admin/Elements/AddCustomFieldValue:27 +msgid "Sort" +msgstr "Ordina" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Sort key" +msgstr "Sort key" + +#: html/Search/Elements/PickRestriction:108 +msgid "Sort results by" +msgstr "Ordina i risultati per" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "SortOrder" +msgstr "SortOrder" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Stalled" +msgstr "In stallo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Start page" +msgstr "Pagina iniziale" + +#: html/Elements/SelectDateType:26 +#: html/Ticket/Elements/EditDates:31 +#: html/Ticket/Elements/ShowDates:34 +msgid "Started" +msgstr "Iniziato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Started date '%1' could not be parsed" +msgstr "Started date '%1' could not be parsed" + +#: html/Elements/SelectDateType:30 +#: html/Ticket/Create.html:165 +#: html/Ticket/Elements/EditDates:26 +#: html/Ticket/Elements/ShowDates:30 +msgid "Starts" +msgstr "Inizia" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Starts By" +msgstr "Inizia Da" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Starts date '%1' could not be parsed" +msgstr "Starts date '%1' could not be parsed" + +#: html/Admin/Elements/ModifyUser:81 +#: html/Admin/Users/Modify.html:137 +#: html/User/Prefs.html:93 +msgid "State" +msgstr "Provincia" + +#: html/Elements/MyRequests:30 +#: html/Elements/MyTickets:30 +#: html/Search/Elements/PickRestriction:73 +#: html/SelfService/Elements/MyRequests:28 +#: html/SelfService/Update.html:30 +#: html/Ticket/Create.html:41 +#: html/Ticket/Elements/EditBasics:37 +#: html/Ticket/Elements/ShowBasics:30 +#: html/Ticket/Update.html:59 +#: lib/RT/Ticket_Overlay.pm:1163 +#: lib/RT/Tickets_Overlay.pm:907 +msgid "Status" +msgstr "Stato" + +#: etc/initialdata:294 +msgid "Status Change" +msgstr "Cambiamento di Stato" + +#. ($self->loc($self->OldValue), $self->loc($self->NewValue)) +#: lib/RT/Transaction_Overlay.pm:527 +msgid "Status changed from %1 to %2" +msgstr "Cambiato lo Stato da %1 a %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "StatusChange" +msgstr "StatusChange" + +#: html/Ticket/Elements/Tabs:146 +msgid "Steal" +msgstr "Ruba" + +#. ($Old->Name) +#: lib/RT/Transaction_Overlay.pm:586 +msgid "Stolen from %1 " +msgstr "Rubato da %1 " + +#: html/Elements/MyRequests:28 +#: html/Elements/MyTickets:28 +#: html/Search/Bulk.html:125 +#: html/Search/Elements/PickRestriction:42 +#: html/SelfService/Create.html:56 +#: html/SelfService/Elements/MyRequests:27 +#: html/SelfService/Update.html:31 +#: html/Ticket/Create.html:83 +#: html/Ticket/Elements/EditBasics:27 +#: html/Ticket/ModifyAll.html:78 +#: html/Ticket/Update.html:76 +#: lib/RT/Ticket_Overlay.pm:1159 +#: lib/RT/Tickets_Overlay.pm:986 +msgid "Subject" +msgstr "Oggetto" + +#. ($self->Data) +#: docs/design_docs/string-extraction-guide.txt:89 +#: lib/RT/Transaction_Overlay.pm:608 +msgid "Subject changed to %1" +msgstr "Subject changed to %1" + +#: html/Elements/Submit:58 +msgid "Submit" +msgstr "Invia" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Submit Workflow" +msgstr "Submit Workflow" + +#: lib/RT/Group_Overlay.pm:748 +msgid "Succeeded" +msgstr "Succeeded" + +#: lib/RT/Date.pm:393 +msgid "Sun." +msgstr "Dom." + +#: lib/RT/System.pm:53 +msgid "SuperUser" +msgstr "SuperUtente" + +#: html/User/Elements/DelegateRights:76 +msgid "System" +msgstr "Sistema" + +#: html/Admin/Elements/SelectRights:80 +#: lib/RT/ACE_Overlay.pm:566 +#: lib/RT/Interface/Web.pm:790 +#: lib/RT/Interface/Web.pm:823 +msgid "System Error" +msgstr "Errore di Sistema" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "System Error. Right not granted." +msgstr "Errore di Sistema. Diritto non concesso." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "System Error. right not granted" +msgstr "Errore di Sistema. Diritto non concesso" + +#: lib/RT/ACE_Overlay.pm:615 +msgid "System error. Right not delegated." +msgstr "Errore di Sistema. Diritto non delegato." + +#: lib/RT/ACE_Overlay.pm:145 +#: lib/RT/ACE_Overlay.pm:222 +#: lib/RT/ACE_Overlay.pm:305 +#: lib/RT/ACE_Overlay.pm:897 +msgid "System error. Right not granted." +msgstr "Errore di Sistema. Diritto non concesso." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "System error. Unable to grant rights." +msgstr "Errore di sistema. Impossibile concedere i diritti." + +#: html/Admin/Global/GroupRights.html:34 +#: html/Admin/Groups/GroupRights.html:36 +#: html/Admin/Queues/GroupRights.html:35 +msgid "System groups" +msgstr "Gruppi di sistema" + +#: etc/initialdata:41 +#: etc/initialdata:47 +#: etc/initialdata:53 +msgid "SystemRolegroup for internal use" +msgstr "SystemRolegroup for internal use" + +#: lib/RT/CurrentUser.pm:317 +msgid "TEST_STRING" +msgstr "TEST_STRING" + +#: html/Ticket/Elements/Tabs:142 +msgid "Take" +msgstr "Prendi" + +#: lib/RT/Transaction_Overlay.pm:572 +msgid "Taken" +msgstr "Preso" + +#: html/Admin/Elements/EditScrip:80 +msgid "Template" +msgstr "Modello" + +#. ($TemplateObj->Id()) +#: html/Admin/Global/Template.html:90 +#: html/Admin/Queues/Template.html:89 +msgid "Template #%1" +msgstr "Modello n°%1" + +#: html/Admin/Elements/EditTemplates:88 +msgid "Template deleted" +msgstr "Modello eliminato" + +#: lib/RT/Scrip_Overlay.pm:152 +msgid "Template not found" +msgstr "Modello non trovato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Template not found\\n" +msgstr "Modello non trovato\\n" + +#: lib/RT/Template_Overlay.pm:346 +msgid "Template parsed" +msgstr "Modello elaborato" + +#: html/Admin/Elements/QueueTabs:48 +#: html/Admin/Elements/SystemTabs:35 +#: html/Admin/Global/index.html:44 +msgid "Templates" +msgstr "Modelli" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Templates for %1\\n" +msgstr "Modelli per %1\\n" + +#: lib/RT/Interface/Web.pm:891 +msgid "That is already the current value" +msgstr "That is already the current value" + +#: lib/RT/CustomField_Overlay.pm:242 +msgid "That is not a value for this custom field" +msgstr "That is not a value for this custom field" + +#: lib/RT/Ticket_Overlay.pm:1885 +msgid "That is the same value" +msgstr "That is the same value" + +#: lib/RT/ACE_Overlay.pm:287 +#: lib/RT/ACE_Overlay.pm:596 +msgid "That principal already has that right" +msgstr "That principal already has that right" + +#. ($args{'Type'}) +#: lib/RT/Queue_Overlay.pm:632 +msgid "That principal is already a %1 for this queue" +msgstr "That principal is already a %1 for this coda" + +#. ($self->loc($args{'Type'})) +#: lib/RT/Ticket_Overlay.pm:1433 +msgid "That principal is already a %1 for this ticket" +msgstr "That principal is already a %1 for this ticket" + +#. ($args{'Type'}) +#: lib/RT/Queue_Overlay.pm:731 +msgid "That principal is not a %1 for this queue" +msgstr "That principal is not a %1 for this coda" + +#. ($args{'Type'}) +#: lib/RT/Ticket_Overlay.pm:1550 +msgid "That principal is not a %1 for this ticket" +msgstr "That principal is not a %1 for this ticket" + +#: lib/RT/Ticket_Overlay.pm:1881 +msgid "That queue does not exist" +msgstr "That coda does not exist" + +#: lib/RT/Ticket_Overlay.pm:3209 +msgid "That ticket has unresolved dependencies" +msgstr "That ticket has unresolved dependencies" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "That user already has that right" +msgstr "That user already has that right" + +#: lib/RT/Ticket_Overlay.pm:3019 +msgid "That user already owns that ticket" +msgstr "That user already owns that ticket" + +#: lib/RT/Ticket_Overlay.pm:2985 +msgid "That user does not exist" +msgstr "That user does not exist" + +#: lib/RT/User_Overlay.pm:314 +msgid "That user is already privileged" +msgstr "Questo utente è già previlegiato" + +#: lib/RT/User_Overlay.pm:335 +msgid "That user is already unprivileged" +msgstr "Questo utente è già non previlegiato" + +#: lib/RT/User_Overlay.pm:327 +msgid "That user is now privileged" +msgstr "Ora questo utente è previlegiato" + +#: lib/RT/User_Overlay.pm:348 +msgid "That user is now unprivileged" +msgstr "Ora questo utente è non previlegiato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "That user is now unprivilegedileged" +msgstr "Questo utente ora è non previlegiato" + +#: lib/RT/Ticket_Overlay.pm:3011 +msgid "That user may not own tickets in that queue" +msgstr "That user may not own tickets in that coda" + +#: lib/RT/Link_Overlay.pm:205 +msgid "That's not a numerical id" +msgstr "That's not a numerical id" + +#: html/SelfService/Display.html:31 +#: html/Ticket/Create.html:149 +#: html/Ticket/Elements/ShowSummary:27 +msgid "The Basics" +msgstr "Dati di base" + +#: lib/RT/ACE_Overlay.pm:87 +msgid "The CC of a ticket" +msgstr "The CC of a ticket" + +#: lib/RT/ACE_Overlay.pm:88 +msgid "The administrative CC of a ticket" +msgstr "The administrative CC of a ticket" + +#: lib/RT/Ticket_Overlay.pm:2212 +msgid "The comment has been recorded" +msgstr "The comment has been recorded" + +#: bin/rt-crontool:197 +msgid "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:" +msgstr "The following command will find all active tickets in the coda 'general' and set their priority to 99 if they haven't been touched in 4 hours:" + +#: bin/rt-commit-handler:755 +#: bin/rt-commit-handler:765 +msgid "" +"The following commands were not proccessed:\\n" +"\\n" +msgstr "" +"The following commands were not proccessed:\\n" +"\\n" + +#: lib/RT/Interface/Web.pm:894 +msgid "The new value has been set." +msgstr "The new value has been set." + +#: lib/RT/ACE_Overlay.pm:85 +msgid "The owner of a ticket" +msgstr "The owner of a ticket" + +#: lib/RT/ACE_Overlay.pm:86 +msgid "The requestor of a ticket" +msgstr "Il richiedente di un ticket" + +#: html/Admin/Elements/EditUserComments:25 +msgid "These comments aren't generally visible to the user" +msgstr "These comments aren't generally visible to the user" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "This ticket %1 %2 (%3)\\n" +msgstr "This ticket %1 %2 (%3)\\n" + +#: bin/rt-crontool:188 +msgid "This tool allows the user to run arbitrary perl modules from within RT." +msgstr "This tool allows the user to run arbitrary perl modules from within RT." + +#: lib/RT/Transaction_Overlay.pm:250 +msgid "This transaction appears to have no content" +msgstr "This transaction appears to have no content" + +#. ($rows) +#: html/Ticket/Elements/ShowRequestor:46 +msgid "This user's %1 highest priority tickets" +msgstr "I %1 tickets di questo utente a più alta priorità" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "This user's 25 highest priority tickets" +msgstr "I 25 tickets a più alta priorità di questo utente" + +#: lib/RT/Date.pm:390 +msgid "Thu." +msgstr "Gio." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket" +msgstr "" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket # %1 %2" +msgstr "Ticket n° %1 %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket # %1 Jumbo update: %2" +msgstr "Ticket n° %1 aggiornamento Jumbo: %2" + +#. ($Ticket->Id, $Ticket->Subject) +#: html/Ticket/ModifyAll.html:24 +#: html/Ticket/ModifyAll.html:28 +msgid "Ticket #%1 Jumbo update: %2" +msgstr "Ticket n° %1 Jumbo update: %2" + +#. ($link->BaseObj->Id, $link->BaseObj->Subject) +#: html/Approvals/Elements/ShowDependency:45 +msgid "Ticket #%1: %2" +msgstr "Ticket n°%1: %2" + +#. ($self->Id, $QueueObj->Name) +#: lib/RT/Ticket_Overlay.pm:586 +#: lib/RT/Ticket_Overlay.pm:607 +msgid "Ticket %1 created in queue '%2'" +msgstr "Ticket %1 created in coda '%2'" + +#. ($Ticket->Id) +#: bin/rt-commit-handler:759 +msgid "Ticket %1 loaded\\n" +msgstr "Ticket %1 loaded\\n" + +#. ($Ticket->Id,$_) +#: html/Search/Bulk.html:180 +msgid "Ticket %1: %2" +msgstr "Ticket %1: %2" + +#. ($Ticket->Id, $Ticket->Subject) +#: html/Ticket/History.html:24 +#: html/Ticket/History.html:27 +msgid "Ticket History # %1 %2" +msgstr "Ticket History n° %1 %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket Id" +msgstr "Ticket Id" + +#: etc/initialdata:309 +msgid "Ticket Resolved" +msgstr "Ticket Risolto" + +#: html/Search/Elements/PickRestriction:62 +msgid "Ticket attachment" +msgstr "Allegato al ticket: il " + +#: lib/RT/Tickets_Overlay.pm:1165 +msgid "Ticket content" +msgstr "Contenuto del ticket" + +#: lib/RT/Tickets_Overlay.pm:1211 +msgid "Ticket content type" +msgstr "Ticket content type" + +#: lib/RT/Ticket_Overlay.pm:495 +#: lib/RT/Ticket_Overlay.pm:596 +msgid "Ticket could not be created due to an internal error" +msgstr "Ticket could not be created due to an internal error" + +#: lib/RT/Transaction_Overlay.pm:519 +msgid "Ticket created" +msgstr "Ticket creato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket creation failed" +msgstr "Ticket creation failed" + +#: lib/RT/Transaction_Overlay.pm:524 +msgid "Ticket deleted" +msgstr "Ticket eliminato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket id not found" +msgstr "Ticket id not found" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket killed" +msgstr "Ticket killed" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Ticket not found" +msgstr "Ticket not found" + +#: etc/initialdata:295 +msgid "Ticket status changed" +msgstr "Ticket status changed" + +#: html/Ticket/Update.html:38 +msgid "Ticket watchers" +msgstr "Osservatori del ticket" + +#: html/Elements/Tabs:46 +msgid "Tickets" +msgstr "" + +#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) +#: lib/RT/Tickets_Overlay.pm:1382 +msgid "Tickets %1 %2" +msgstr "" + +#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})) +#: lib/RT/Tickets_Overlay.pm:1347 +msgid "Tickets %1 by %2" +msgstr "Tickets %1 by %2" + +#. ($name) +#: html/Elements/ViewUser:25 +msgid "Tickets from %1" +msgstr "Tickets from %1" + +#: html/Approvals/Elements/ShowDependency:26 +msgid "Tickets which depend on this approval:" +msgstr "Tickets which depend on this approval:" + +#: html/Ticket/Create.html:156 +#: html/Ticket/Elements/EditBasics:47 +msgid "Time Left" +msgstr "Tempo RImasto" + +#: html/Ticket/Create.html:155 +#: html/Ticket/Elements/EditBasics:42 +msgid "Time Worked" +msgstr "Tempo Lavorato" + +#: lib/RT/Tickets_Overlay.pm:1138 +msgid "Time left" +msgstr "Tempo rimasto" + +#: html/Elements/Footer:35 +msgid "Time to display" +msgstr "Time to display" + +#: lib/RT/Tickets_Overlay.pm:1114 +msgid "Time worked" +msgstr "Tempo lavorato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "TimeLeft" +msgstr "TempoRimasto" + +#: lib/RT/Ticket_Overlay.pm:1164 +msgid "TimeWorked" +msgstr "TempoLavorato" + +#: bin/rt-commit-handler:401 +msgid "To generate a diff of this commit:" +msgstr "To generate a diff of this commit:" + +#: bin/rt-commit-handler:390 +msgid "To generate a diff of this commit:\\n" +msgstr "To generate a diff of this commit:\\n" + +#: lib/RT/Ticket_Overlay.pm:1167 +msgid "Told" +msgstr "Told" + +#: etc/initialdata:237 +msgid "Transaction" +msgstr "Transaction" + +#. ($self->Data) +#: lib/RT/Transaction_Overlay.pm:639 +msgid "Transaction %1 purged" +msgstr "Transaction %1 purged" + +#: lib/RT/Transaction_Overlay.pm:176 +msgid "Transaction Created" +msgstr "Transaction Created" + +#: lib/RT/Transaction_Overlay.pm:88 +msgid "Transaction->Create couldn't, as you didn't specify a ticket id" +msgstr "Transaction->Create couldn't, as you didn't specify a ticket id" + +#: lib/RT/Transaction_Overlay.pm:698 +msgid "Transactions are immutable" +msgstr "Transactions are immutable" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Trying to delete a right: %1" +msgstr "Sto cercando di eliminare un diritto: %1" + +#: lib/RT/Date.pm:388 +msgid "Tue." +msgstr "Mar." + +#: html/Admin/Elements/EditCustomField:43 +#: html/Ticket/Elements/AddWatchers:32 +#: html/Ticket/Elements/AddWatchers:43 +#: html/Ticket/Elements/AddWatchers:53 +#: lib/RT/Ticket_Overlay.pm:1165 +#: lib/RT/Tickets_Overlay.pm:958 +msgid "Type" +msgstr "Type" + +#: lib/RT/ScripCondition_Overlay.pm:103 +msgid "Unimplemented" +msgstr "Unimplemented" + +#: html/Admin/Users/Modify.html:67 +msgid "Unix login" +msgstr "Unix login" + +#: html/Admin/Elements/ModifyUser:61 +msgid "UnixUsername" +msgstr "UnixUsername" + +#. ($self->ContentEncoding) +#: lib/RT/Attachment_Overlay.pm:264 +msgid "Unknown ContentEncoding %1" +msgstr "Unknown ContentEncoding %1" + +#: html/Elements/SelectResultsPerPage:36 +msgid "Unlimited" +msgstr "Unlimited" + +#: etc/initialdata:32 +msgid "Unprivileged" +msgstr "Non previlegiato" + +#: lib/RT/Transaction_Overlay.pm:568 +msgid "Untaken" +msgstr "Untaken" + +#: html/Elements/MyTickets:63 +#: html/Search/Bulk.html:32 +msgid "Update" +msgstr "Aggiornamento" + +#: html/Admin/Users/Prefs.html:61 +msgid "Update ID" +msgstr "ID Aggiornamento" + +#: html/Search/Bulk.html:119 +#: html/Ticket/ModifyAll.html:65 +#: html/Ticket/Update.html:66 +msgid "Update Type" +msgstr "Tipo Aggiornamento" + +#: html/Search/Listing.html:60 +msgid "Update all these tickets at once" +msgstr "Aggiorna tutti questi tickets in una sola volta" + +#: html/Admin/Users/Prefs.html:48 +msgid "Update email" +msgstr "Email aggiornamento" + +#: html/Admin/Users/Prefs.html:54 +msgid "Update name" +msgstr "Nome aggiornamento" + +#: lib/RT/Interface/Web.pm:408 +msgid "Update not recorded." +msgstr "Aggiornamento non registrato." + +#: html/Search/Bulk.html:80 +msgid "Update selected tickets" +msgstr "Aggiorna i tickets selezionati" + +#: html/Admin/Users/Prefs.html:35 +msgid "Update signature" +msgstr "Aggiorna la firma" + +#: html/Ticket/ModifyAll.html:62 +msgid "Update ticket" +msgstr "Aggiorna il ticket" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Update ticket # %1" +msgstr "Aggiorna il ticket n° %1" + +#. ($Ticket->id) +#: html/SelfService/Update.html:24 +#: html/SelfService/Update.html:46 +msgid "Update ticket #%1" +msgstr "Aggiorna il ticket n°%1" + +#. ($Ticket->id, $Ticket->Subject) +#: html/Ticket/Update.html:134 +msgid "Update ticket #%1 (%2)" +msgstr "Aggiorna il ticket n°%1 (%2)" + +#: lib/RT/Interface/Web.pm:406 +msgid "Update type was neither correspondence nor comment." +msgstr "Update type was neither correspondence nor comment." + +#: html/Elements/SelectDateType:32 +#: html/Ticket/Elements/ShowDates:50 +#: lib/RT/Ticket_Overlay.pm:1168 +msgid "Updated" +msgstr "Aggiornato" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "User %1 %2: %3\\n" +msgstr "User %1 %2: %3\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "User %1 Password: %2\\n" +msgstr "User %1 Password: %2\\n" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "User '%1' not found" +msgstr "User '%1' not found" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "User '%1' not found\\n" +msgstr "User '%1' not found\\n" + +#: etc/initialdata:125 +#: etc/initialdata:191 +msgid "User Defined" +msgstr "Definito da Utente" + +#: html/Admin/Users/Prefs.html:58 +msgid "User ID" +msgstr "User ID" + +#: html/Elements/SelectUsers:25 +msgid "User Id" +msgstr "User Id" + +#: html/Admin/Elements/GroupTabs:46 +#: html/Admin/Elements/QueueTabs:59 +#: html/Admin/Elements/SystemTabs:46 +#: html/Admin/Global/index.html:58 +msgid "User Rights" +msgstr "Diritti Utente" + +#. ($msg) +#: html/Admin/Users/Modify.html:225 +msgid "User could not be created: %1" +msgstr "User could not be created: %1" + +#: lib/RT/User_Overlay.pm:261 +msgid "User created" +msgstr "User created" + +#: html/Admin/Global/GroupRights.html:66 +#: html/Admin/Groups/GroupRights.html:53 +#: html/Admin/Queues/GroupRights.html:67 +msgid "User defined groups" +msgstr "Gruppi definiti dall'utente" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "User notified" +msgstr "User notified" + +#: html/Admin/Users/Prefs.html:24 +#: html/Admin/Users/Prefs.html:28 +msgid "User view" +msgstr "User view" + +#: html/Admin/Users/Modify.html:47 +#: html/Elements/Login:50 +#: html/Ticket/Elements/AddWatchers:34 +msgid "Username" +msgstr "Username" + +#: html/Admin/Elements/SelectNewGroupMembers:25 +#: html/Admin/Elements/Tabs:31 +#: html/Admin/Groups/Members.html:54 +#: html/Admin/Queues/People.html:67 +#: html/Admin/index.html:28 +#: html/User/Groups/Members.html:57 +msgid "Users" +msgstr "Utenti" + +#: html/Admin/Users/index.html:64 +msgid "Users matching search criteria" +msgstr "Utenti che soddisfano il criterio di ricerca" + +#: html/Search/Elements/PickRestriction:50 +msgid "ValueOfQueue" +msgstr "ValueOfQueue" + +#: html/Admin/Elements/EditCustomField:56 +msgid "Values" +msgstr "Valori" + +#: lib/RT/Queue_Overlay.pm:81 +msgid "Watch" +msgstr "Osserva" + +#: lib/RT/Queue_Overlay.pm:82 +msgid "WatchAsAdminCc" +msgstr "OsservaComeAdminCc" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Watcher loaded" +msgstr "Osservatore caricato" + +#: html/Admin/Elements/QueueTabs:41 +msgid "Watchers" +msgstr "Osservatori" + +#: html/Admin/Elements/ModifyUser:55 +msgid "WebEncoding" +msgstr "WebEncoding" + +#: lib/RT/Date.pm:389 +msgid "Wed." +msgstr "Mer." + +#: etc/upgrade/2.1.71:161 +msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket" +msgstr "When a ticket has been approved by all approvers, add correspondence to the original ticket" + +#: etc/upgrade/2.1.71:135 +msgid "When a ticket has been approved by any approver, add correspondence to the original ticket" +msgstr "When a ticket has been approved by any approver, add correspondence to the original ticket" + +#: etc/initialdata:138 +msgid "When a ticket is created" +msgstr "When a ticket is created" + +#: etc/upgrade/2.1.71:79 +msgid "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" +msgstr "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" + +#: etc/initialdata:143 +msgid "When anything happens" +msgstr "When anything happens" + +#: etc/initialdata:184 +msgid "Whenever a ticket is resolved" +msgstr "Whenever a ticket is resolved" + +#: etc/initialdata:170 +msgid "Whenever a ticket's owner changes" +msgstr "Whenever a ticket's owner changes" + +#: etc/initialdata:178 +msgid "Whenever a ticket's queue changes" +msgstr "Whenever a ticket's coda changes" + +#: etc/initialdata:162 +msgid "Whenever a ticket's status changes" +msgstr "Whenever a ticket's status changes" + +#: etc/initialdata:192 +msgid "Whenever a user-defined condition occurs" +msgstr "Whenever a user-defined condition occurs" + +#: etc/initialdata:156 +msgid "Whenever comments come in" +msgstr "Whenever comments come in" + +#: etc/initialdata:149 +msgid "Whenever correspondence comes in" +msgstr "Whenever correspondence comes in" + +#: html/Admin/Users/Modify.html:163 +#: html/User/Prefs.html:51 +msgid "Work" +msgstr "Lavoro" + +#: html/Admin/Elements/ModifyUser:69 +msgid "WorkPhone" +msgstr "TelefonoLavoro" + +#: html/Ticket/Elements/ShowBasics:34 +#: html/Ticket/Update.html:64 +msgid "Worked" +msgstr "Lavoro" + +#: lib/RT/Ticket_Overlay.pm:3122 +msgid "You already own this ticket" +msgstr "You already own this ticket" + +#: html/autohandler:107 +msgid "You are not an authorized user" +msgstr "You are not an authorized user" + +#: lib/RT/Ticket_Overlay.pm:2997 +msgid "You can only reassign tickets that you own or that are unowned" +msgstr "You can only reassign tickets that you own or that are unowned" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "You don't have permission to view that ticket.\\n" +msgstr "Non hai i permessi per visualizzare questo ticket.\\n" + +#. ($num, $queue) +#: docs/design_docs/string-extraction-guide.txt:47 +msgid "You found %1 tickets in queue %2" +msgstr "Hai trovato %1 tickets nella coda %2" + +#: html/NoAuth/Logout.html:30 +msgid "You have been logged out of RT." +msgstr "Ti sei scollegato da RT." + +#: html/SelfService/Display.html:77 +msgid "You have no permission to create tickets in that queue." +msgstr "Non hai permessi per creare tickets in questa coda." + +#: lib/RT/Ticket_Overlay.pm:1894 +msgid "You may not create requests in that queue." +msgstr "Non puoi creare richieste in questa coda." + +#: html/NoAuth/Logout.html:35 +msgid "You're welcome to login again" +msgstr "Collegati di nuovo" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Your %1 requests" +msgstr "Le tue %1 richieste" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Your RT administrator has misconfigured the mail aliases which invoke RT" +msgstr "Your RT administrator has misconfigured the mail aliases which invoke RT" + +#: etc/initialdata:435 +#: etc/upgrade/2.1.71:146 +msgid "Your request has been approved by %1. Other approvals may still be pending." +msgstr "Your request has been approved by %1. Other approvals may still be pending." + +#: etc/initialdata:469 +#: etc/upgrade/2.1.71:180 +msgid "Your request has been approved." +msgstr "Your request has been approved." + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "Your request was rejected" +msgstr "Your request was rejected" + +#: etc/initialdata:390 +#: etc/upgrade/2.1.71:101 +msgid "Your request was rejected." +msgstr "Your request was rejected." + +#: html/autohandler:126 +msgid "Your username or password is incorrect" +msgstr "Il tuo username o la tua password non sono corretti" + +#: html/Admin/Elements/ModifyUser:83 +#: html/Admin/Users/Modify.html:143 +#: html/User/Prefs.html:95 +msgid "Zip" +msgstr "CAP" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "[no subject]" +msgstr "[nessun oggetto]" + +#. ($right->PrincipalObj->Object->SelfDescription) +#: html/User/Elements/DelegateRights:58 +msgid "as granted to %1" +msgstr "come concesso a %1" + +#: html/SelfService/Closed.html:27 +msgid "closed" +msgstr "chiuso" + +#: html/Elements/SelectCustomFieldOperator:37 +#: html/Elements/SelectMatch:33 +msgid "contains" +msgstr "contiene" + +#: html/Elements/SelectAttachmentField:25 +msgid "content" +msgstr "contenuto" + +#: html/Elements/SelectAttachmentField:26 +msgid "content-type" +msgstr "content-type" + +#: lib/RT/Ticket_Overlay.pm:2281 +msgid "correspondence (probably) not sent" +msgstr "corrispondenza (probabilmente) non inviata" + +#: lib/RT/Ticket_Overlay.pm:2291 +msgid "correspondence sent" +msgstr "corrispondenza inviata" + +#: html/Admin/Elements/ModifyQueue:62 +#: html/Admin/Queues/Modify.html:76 +#: lib/RT/Date.pm:318 +msgid "days" +msgstr "giorni" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "dead" +msgstr "morto" + +#: html/Search/Listing.html:74 +msgid "delete" +msgstr "elimina" + +#: lib/RT/Queue_Overlay.pm:62 +msgid "deleted" +msgstr "eliminato" + +#: html/Search/Elements/PickRestriction:67 +msgid "does not match" +msgstr "non corrisponde a" + +#: html/Elements/SelectCustomFieldOperator:37 +#: html/Elements/SelectMatch:34 +msgid "doesn't contain" +msgstr "non contiene" + +#: html/Elements/SelectEqualityOperator:37 +msgid "equal to" +msgstr "uguale a" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "false" +msgstr "falso" + +#: html/Elements/SelectAttachmentField:27 +msgid "filename" +msgstr "nome file" + +#: html/Elements/SelectCustomFieldOperator:37 +#: html/Elements/SelectEqualityOperator:37 +msgid "greater than" +msgstr "più grande di" + +#. ($self->Name) +#: lib/RT/Group_Overlay.pm:193 +msgid "group '%1'" +msgstr "gruppo '%1'" + +#: lib/RT/Date.pm:314 +msgid "hours" +msgstr "ore" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "id" +msgstr "id" + +#: html/Elements/SelectBoolean:31 +#: html/Elements/SelectCustomFieldOperator:37 +#: html/Elements/SelectMatch:35 +#: html/Search/Elements/PickRestriction:46 +#: html/Search/Elements/PickRestriction:75 +#: html/Search/Elements/PickRestriction:87 +msgid "is" +msgstr "è" + +#: html/Elements/SelectBoolean:35 +#: html/Elements/SelectCustomFieldOperator:37 +#: html/Elements/SelectMatch:36 +#: html/Search/Elements/PickRestriction:47 +#: html/Search/Elements/PickRestriction:76 +#: html/Search/Elements/PickRestriction:88 +msgid "isn't" +msgstr "non è" + +#: html/Elements/SelectCustomFieldOperator:37 +#: html/Elements/SelectEqualityOperator:37 +msgid "less than" +msgstr "minore di" + +#: html/Search/Elements/PickRestriction:66 +msgid "matches" +msgstr "corrisponde a" + +#: lib/RT/Date.pm:310 +msgid "min" +msgstr "min" + +#: html/Ticket/Update.html:65 +msgid "minutes" +msgstr "minuti" + +#: bin/rt-commit-handler:764 +msgid "" +"modifications\\n" +"\\n" +msgstr "" +"modifiche\\n" +"\\n" + +#: lib/RT/Date.pm:326 +msgid "months" +msgstr "mesi" + +#: lib/RT/Queue_Overlay.pm:57 +msgid "new" +msgstr "nuovo" + +#: html/Admin/Elements/EditScrips:42 +msgid "no value" +msgstr "nessun valore" + +#: html/Ticket/Elements/EditWatchers:27 +msgid "none" +msgstr "nessuno" + +#: html/Elements/SelectEqualityOperator:37 +msgid "not equal to" +msgstr "diverso da" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "notlike" +msgstr "diverso da" + +#: html/SelfService/Elements/MyRequests:60 +#: lib/RT/Queue_Overlay.pm:58 +msgid "open" +msgstr "aperto" + +#. ($self->Name, $user->Name) +#: lib/RT/Group_Overlay.pm:198 +msgid "personal group '%1' for user '%2'" +msgstr "Gruppo personale '%1' per l'utente '%2'" + +#. ($queue->Name, $self->Type) +#: lib/RT/Group_Overlay.pm:206 +msgid "queue %1 %2" +msgstr "coda %1 %2" + +#: lib/RT/Queue_Overlay.pm:61 +msgid "rejected" +msgstr "rifiutato" + +#: lib/RT/Queue_Overlay.pm:60 +msgid "resolved" +msgstr "risolto" + +#: lib/RT/Date.pm:306 +msgid "sec" +msgstr "sec" + +#: lib/RT/Queue_Overlay.pm:59 +msgid "stalled" +msgstr "in stallo" + +#. ($self->Type) +#: lib/RT/Group_Overlay.pm:201 +msgid "system %1" +msgstr "sistema %1" + +#. ($self->Type) +#: lib/RT/Group_Overlay.pm:212 +msgid "system group '%1'" +msgstr "gruppo di sistema '%1'" + +#: html/Elements/Error:41 +#: html/SelfService/Error.html:41 +msgid "the calling component did not specify why" +msgstr "the calling component did not specify why" + +#. ($self->Instance, $self->Type) +#: lib/RT/Group_Overlay.pm:209 +msgid "ticket #%1 %2" +msgstr "ticket n°%1 %2" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "true" +msgstr "vero" + +#. ($self->Id) +#: lib/RT/Group_Overlay.pm:215 +msgid "undescribed group %1" +msgstr "undescribed group %1" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "undescripbed group %1" +msgstr "undescripbed group %1" + +#. ($user->Object->Name) +#: lib/RT/Group_Overlay.pm:190 +msgid "user %1" +msgstr "utente %1" + +#: lib/RT/Date.pm:322 +msgid "weeks" +msgstr "settimane" + +#: NOT +#: FOUND +#: IN +#: SOURCE +msgid "with template %1" +msgstr "con il modello %1" + +#: lib/RT/Date.pm:330 +msgid "years" +msgstr "anni" + diff --git a/rt/lib/RT/I18N/ru.po b/rt/lib/RT/I18N/ru.po index eb1434606..d5ef7fd0c 100644 --- a/rt/lib/RT/I18N/ru.po +++ b/rt/lib/RT/I18N/ru.po @@ -62,10 +62,6 @@ msgstr "%1 %2 изменено на %3" msgid "%1 %2 deleted" msgstr "" -#: NOT FOUND IN SOURCE -msgid "%1 %2 of group %3" -msgstr "" - #: html/Admin/Elements/EditScrips:44 html/Admin/Elements/ListGlobalScrips:28 #. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name)) msgid "%1 %2 with template %3" @@ -151,11 +147,7 @@ msgstr "%1 изменилось с %2 на %3" #: lib/RT/Interface/Web.pm:857 msgid "%1 could not be set to %2." -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "%1 couldn't init a transaction (%2)\\n" -msgstr "" +msgstr "Нельзя установить %1 в %2." #: lib/RT/Ticket_Overlay.pm:2813 #. ($self) @@ -165,12 +157,12 @@ msgstr "%1 не могу закрыть тикет. Возможно, база #: html/Elements/MyTickets:25 #. ($rows) msgid "%1 highest priority tickets I own..." -msgstr "" +msgstr "%1 самых приоритетных моих тикетов..." #: html/Elements/MyRequests:25 #. ($rows) msgid "%1 highest priority tickets I requested..." -msgstr "" +msgstr "%1 самых приоритетных тикетов, запрошенных мной..." #: bin/rt-crontool:161 #. ($0) @@ -192,10 +184,6 @@ msgstr "%1 больше не является %2 для этого тикета. msgid "%1 is no longer a value for custom field %2" msgstr "%1 больше не является значением для нестандартного поля %2" -#: NOT FOUND IN SOURCE -msgid "%1 isn't a valid Queue id." -msgstr "" - #: html/Ticket/Elements/ShowBasics:36 #. ($TimeWorked) msgid "%1 min" @@ -208,7 +196,7 @@ msgstr "%1 не отображается" #: html/User/Elements/DelegateRights:76 #. (loc($ObjectType =~ /^RT::(.*)$/)) msgid "%1 rights" -msgstr "" +msgstr "%1 права" #: NOT FOUND IN SOURCE msgid "%1 succeeded\\n" @@ -222,10 +210,6 @@ msgstr "%1 тип не известен для $MessageId" msgid "%1 type unknown for %2" msgstr "%1 тип не известен для %2" -#: NOT FOUND IN SOURCE -msgid "%1 was created without a CurrentUser\\n" -msgstr "" - #: lib/RT/Action/ResolveMembers.pm:42 #. (ref $self) msgid "%1 will resolve all members of a resolved group ticket." @@ -259,22 +243,11 @@ msgstr "'%1' является неверным значением статуса msgid "'%1' not a recognized action. " msgstr "Что делать ? : '%1'" -#: NOT FOUND IN SOURCE -msgid "(Check box to delete group member)" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "(Check box to delete scrip)" -msgstr "" #: html/Admin/Elements/EditQueueWatchers:29 html/Admin/Elements/EditScrips:35 html/Admin/Elements/EditTemplates:36 html/Admin/Groups/Members.html:52 html/Ticket/Elements/EditLinks:33 html/Ticket/Elements/EditPeople:46 html/User/Groups/Members.html:55 msgid "(Check box to delete)" msgstr "(Пометьте то, что хотите удалить)" -#: NOT FOUND IN SOURCE -msgid "(Check boxes to delete)" -msgstr "" - #: html/Ticket/Create.html:178 msgid "(Enter ticket ids or URLs, seperated with spaces)" msgstr "(Введите номера или ссылки на тикеты. Несколько тикетов разделяются пробелами.)" @@ -283,15 +256,11 @@ msgstr "(Введите номера или ссылки на тикеты. Не #. ($RT::CorrespondAddress) #. ($RT::CommentAddress) msgid "(If left blank, will default to %1" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "(No Value)" -msgstr "" +msgstr "(Если пустое, то по умолчанию равно %1" #: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32 msgid "(No custom fields)" -msgstr "" +msgstr "(Нет дополнительных полей)" #: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53 msgid "(No members)" @@ -303,11 +272,11 @@ msgstr "(Нет скриптов)" #: html/Admin/Elements/EditTemplates:31 msgid "(No templates)" -msgstr "" +msgstr "(Нет шаблонов)" #: html/Ticket/Update.html:85 msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will receive future updates.)" -msgstr "" +msgstr "(На эти адреса [разделенные запятой] отправляются копии сообщения. Адреса не сохраняются для последующих уведомлений.)" #: NOT FOUND IN SOURCE msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will recieve future updates.)" @@ -315,11 +284,11 @@ msgstr "(На эти адреса [разделенные запятой] отп #: html/Ticket/Create.html:79 msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people will receive future updates.)" -msgstr "" +msgstr "(На эти адреса [разделенные запятой] отправляются копии сообщения. Адреса сохраняются для последующих уведомлений.)" #: html/Ticket/Update.html:81 msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will receive future updates.)" -msgstr "" +msgstr "(На эти адреса [разделенные запятой] отправляются копии сообщения. Адреса не сохраняются для последующих уведомлений.)" #: NOT FOUND IN SOURCE msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will recieve future updates.)" @@ -327,7 +296,7 @@ msgstr "(На эти адреса [разделенные запятой] отп #: html/Ticket/Create.html:69 msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people will receive future updates.)" -msgstr "" +msgstr "(На эти адреса [разделенные запятой] отправляются копии сообщения. Адреса сохраняются для последующих уведомлений.)" #: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33 msgid "(empty)" @@ -335,7 +304,7 @@ msgstr "(пусто)" #: html/Admin/Users/index.html:39 msgid "(no name listed)" -msgstr "" +msgstr "(не указано имен)" #: html/Elements/MyRequests:43 html/Elements/MyTickets:45 msgid "(no subject)" @@ -351,15 +320,11 @@ msgstr "(только один тикет)" #: html/Elements/MyRequests:52 html/Elements/MyTickets:55 msgid "(pending approval)" -msgstr "" +msgstr "(в ожидании визы)" #: html/Elements/MyRequests:54 html/Elements/MyTickets:57 msgid "(pending other tickets)" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "(requestor's group)" -msgstr "" +msgstr "(в ожидании других тикетов)" #: html/Admin/Users/Modify.html:50 msgid "(required)" @@ -367,7 +332,7 @@ msgstr "(требуется)" #: html/Ticket/Elements/ShowTransaction:105 msgid "(untitled)" -msgstr "" +msgstr "(без названия)" #: NOT FOUND IN SOURCE msgid "25 highest priority tickets I own..." @@ -390,29 +355,9 @@ msgstr "" msgid " %1" msgstr " %1" -#: NOT FOUND IN SOURCE -msgid "??????" -msgstr "" - #: etc/initialdata:203 msgid "A blank template" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "ACE Deleted" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "ACE Loaded" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "ACE could not be deleted" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "ACE could not be found" -msgstr "" +msgstr "Пустой шаблон" #: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181 msgid "ACE not found" @@ -428,7 +373,7 @@ msgstr "Прекращаем работу во избежание нежелат #: html/User/Elements/Tabs:32 msgid "About me" -msgstr "" +msgstr "Обо мне" #: html/Admin/Users/Modify.html:80 msgid "Access control" @@ -441,7 +386,7 @@ msgstr "Действие" #: lib/RT/Scrip_Overlay.pm:147 #. ($args{'ScripAction'}) msgid "Action %1 not found" -msgstr "" +msgstr "действие %1 не найдено" #: bin/rt-crontool:123 msgid "Action committed." @@ -461,35 +406,12 @@ msgstr "Добавить копию" #: html/Ticket/Create.html:114 html/Ticket/Update.html:100 msgid "Add More Files" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Add Next State" -msgstr "" +msgstr "Добавить еще файлы" #: html/Search/Bulk.html:88 msgid "Add Requestor" msgstr "Добавить просителя" -#: NOT FOUND IN SOURCE -msgid "Add a Scrip to this queue" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Add a Scrip which will apply to all queues" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Add a keyword selection to this queue" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Add a new a global scrip" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Add a scrip to this queue" -msgstr "" #: html/Admin/Global/Scrip.html:55 msgid "Add a scrip which will apply to all queues" @@ -507,10 +429,6 @@ msgstr "Добавить пользователей" msgid "Add new watchers" msgstr "Добавить наблюдателей" -#: NOT FOUND IN SOURCE -msgid "AddNextState" -msgstr "" - #: lib/RT/Queue_Overlay.pm:643 #. ($args{'Type'}) msgid "Added principal as a %1 for this queue" @@ -535,7 +453,7 @@ msgstr "Административная копия" #: etc/initialdata:274 msgid "Admin Comment" -msgstr "" +msgstr "Комментарий админа" #: etc/initialdata:256 msgid "Admin Correspondence" @@ -561,22 +479,10 @@ msgstr "Группы" msgid "Admin/Queue/Basics" msgstr "Параметры очереди" -#: NOT FOUND IN SOURCE -msgid "AdminAllPersonalGroups" -msgstr "" - #: etc/initialdata:56 html/Ticket/Elements/ShowPeople:39 html/Ticket/Update.html:50 lib/RT/ACE_Overlay.pm:89 msgid "AdminCc" msgstr "Административная копия" -#: NOT FOUND IN SOURCE -msgid "AdminComment" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "AdminCorrespondence" -msgstr "" - #: lib/RT/Queue_Overlay.pm:72 msgid "AdminCustomFields" msgstr "" @@ -605,45 +511,21 @@ msgstr "" msgid "Administrative Cc" msgstr "Административная копия" -#: NOT FOUND IN SOURCE -msgid "Admins" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Advanced Search" -msgstr "" - #: html/Elements/SelectDateRelation:36 msgid "After" msgstr "После" -#: NOT FOUND IN SOURCE -msgid "Age" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Alias" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Alias for" -msgstr "" - #: html/Admin/Elements/EditCustomFields:96 msgid "All Custom Fields" -msgstr "" +msgstr "Все дополнительные поля" #: html/Admin/Queues/index.html:53 msgid "All Queues" msgstr "Все очереди" -#: NOT FOUND IN SOURCE -msgid "Always sends a message to the requestors independent of message sender" -msgstr "" - #: html/Elements/Tabs:58 msgid "Approval" -msgstr "" +msgstr "Виза" #: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65 #. ($Ticket->Id, $Ticket->Subject) @@ -663,14 +545,6 @@ msgstr "Виза #%1: Примечания не сохранены из-за о msgid "Approval #%1: Notes recorded" msgstr "Виза #%1: Примечания записаны" -#: NOT FOUND IN SOURCE -msgid "Approval Details" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Approval diagram" -msgstr "" - #: html/Approvals/Elements/Approve:45 msgid "Approve" msgstr "Завизировать" @@ -701,7 +575,7 @@ msgstr "Вложить файл" #: html/Ticket/Create.html:98 html/Ticket/Update.html:89 msgid "Attached file" -msgstr "" +msgstr "Вложенный файл" #: html/SelfService/Attachment/dhandler:36 msgid "Attachment '%1' could not be loaded" @@ -723,25 +597,17 @@ msgstr "Вложения" msgid "Aug." msgstr "Авг." -#: NOT FOUND IN SOURCE -msgid "August" -msgstr "" - #: html/Admin/Elements/ModifyUser:66 msgid "AuthSystem" msgstr "Тип регистрации" #: etc/initialdata:206 msgid "Autoreply" -msgstr "" +msgstr "Автоответ" #: etc/initialdata:72 msgid "Autoreply To Requestors" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "AutoreplyToRequestors" -msgstr "" +msgstr "Автоответ инициатору запроса" #: NOT FOUND IN SOURCE msgid "Bad PGP Signature: %1\\n" @@ -1007,9 +873,9 @@ msgstr "Не могу создать пользователя" #: NOT FOUND IN SOURCE msgid "Could not create watcher for requestor" -msgstr "" +msgstr "Не могу создать наблюдателя для инициатора запроса" -#: NOT FOUND IN SOURCE +#: NOT FOUND IN SOURCНе могу создать наблюдателя для инициатора запросаE msgid "Could not find a ticket with id %1" msgstr "Не могу найти тикет по идентификатору %1" @@ -1084,7 +950,7 @@ msgstr "Не найти этого значения" #: NOT FOUND IN SOURCE msgid "Couldn't find that watcher" -msgstr "" +msgstr "Не могу найти данного наблюдателя" #: NOT FOUND IN SOURCE msgid "Couldn't find user\\n" @@ -1163,11 +1029,11 @@ msgstr "Добавить поле" #: html/Admin/Queues/CustomField.html:48 #. ($QueueObj->Name()) msgid "Create a CustomField for queue %1" -msgstr "" +msgstr "Создать дополнительное поле для очереди 1" #: html/Admin/Global/CustomField.html:48 msgid "Create a CustomField which applies to all queues" -msgstr "" +msgstr "Создать дополнительное поле для всех очередей" #: NOT FOUND IN SOURCE msgid "Create a new Custom Field" @@ -1272,7 +1138,7 @@ msgstr "" #: lib/RT/Queue_Overlay.pm:84 msgid "CreateTicket" -msgstr "" +msgstr "Создать тикет" #: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167 msgid "Created" @@ -1305,7 +1171,7 @@ msgstr "Текущие права" #: html/Search/Listing.html:71 msgid "Current search criteria" -msgstr "" +msgstr "Текущие критерии поиска" #: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45 msgid "Current watchers" @@ -1314,7 +1180,7 @@ msgstr "Текущие наблюдатели" #: html/Admin/Global/CustomField.html:55 #. ($CustomField) msgid "Custom Field #%1" -msgstr "" +msgstr "Дополнительное поле #%1" #: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:35 msgid "Custom Fields" @@ -1397,21 +1263,13 @@ msgstr "Даты" msgid "Dec." msgstr "Дек." -#: NOT FOUND IN SOURCE -msgid "December" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Default Autoresponse Template" -msgstr "" - #: etc/initialdata:207 msgid "Default Autoresponse template" -msgstr "" +msgstr "Шаблон автоответа по умолчанию" #: etc/initialdata:275 msgid "Default admin comment template" -msgstr "" +msgstr "Шаблон ответа админа по умолчанию" #: etc/initialdata:257 msgid "Default admin correspondence template" @@ -1423,7 +1281,7 @@ msgstr "" #: etc/initialdata:238 msgid "Default transaction template" -msgstr "" +msgstr "Шаблон транзакции по умолчанию" #: lib/RT/Transaction_Overlay.pm:645 #. ($type, $self->Field, $self->OldValue, $self->NewValue) @@ -1436,7 +1294,7 @@ msgstr "Передача прав" #: lib/RT/System.pm:63 msgid "Delegate specific rights which have been granted to you." -msgstr "" +msgstr "Делегирование отдельных прав, которые вам даны." #: lib/RT/System.pm:63 msgid "DelegateRights" @@ -1444,15 +1302,11 @@ msgstr "" #: html/User/Elements/Tabs:38 msgid "Delegation" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Delete" -msgstr "" +msgstr "Делегирование прав" #: lib/RT/Queue_Overlay.pm:90 msgid "Delete tickets" -msgstr "" +msgstr "Удаление тикетов" #: lib/RT/Queue_Overlay.pm:90 msgid "DeleteTicket" @@ -1470,14 +1324,6 @@ msgstr "Удаление этого объекта нарушит ссылочн msgid "Deleting this object would violate referential integrity" msgstr "Удаление этого объекта нарушит ссылочную целостность" -#: NOT FOUND IN SOURCE -msgid "Deleting this object would violate referential integrity." -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Deleting this object would violate referential integrity. That's bad." -msgstr "" - #: html/Approvals/Elements/Approve:46 msgid "Deny" msgstr "Отказать" @@ -1549,7 +1395,7 @@ msgstr "Не обновлять эту страницу" #: html/Search/Elements/PickRestriction:114 msgid "Don't show search results" -msgstr "" +msgstr "Не показывать результаты поиска" #: html/Ticket/Elements/ShowTransaction:105 msgid "Download" @@ -1588,7 +1434,7 @@ msgstr "Изменение связей" #: html/Admin/Queues/Templates.html:41 #. ($QueueObj->Name) msgid "Edit Templates for queue %1" -msgstr "" +msgstr "Редактировать шаблоны для очереди %1" #: NOT FOUND IN SOURCE msgid "Edit keywords" @@ -1658,11 +1504,11 @@ msgstr "EmailEncoding" #: html/Admin/Elements/EditCustomField:36 msgid "Enabled (Unchecking this box disables this custom field)" -msgstr "" +msgstr "Разрешено (снятие отметки запрещает данное дополнительное поле)" #: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53 msgid "Enabled (Unchecking this box disables this group)" -msgstr "" +msgstr "Разрешено (снятие отметки запрещает данную группу)" #: html/Admin/Queues/Modify.html:84 msgid "Enabled (Unchecking this box disables this queue)" @@ -1670,7 +1516,7 @@ msgstr "Включена (Снятая галочка означает откл #: html/Admin/Elements/EditCustomFields:99 msgid "Enabled Custom Fields" -msgstr "" +msgstr "Разрешенные дополнительные поля" #: html/Admin/Queues/index.html:56 msgid "Enabled Queues" @@ -1683,11 +1529,11 @@ msgstr "Включен статус %1" #: lib/RT/CustomField_Overlay.pm:361 msgid "Enter multiple values" -msgstr "" +msgstr "Введите несколько значений" #: lib/RT/CustomField_Overlay.pm:358 msgid "Enter one value" -msgstr "" +msgstr "Введите одно значение" #: html/Ticket/Elements/EditLinks:112 msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." @@ -1697,10 +1543,6 @@ msgstr "Введите номера или ссылки на тикеты. Не msgid "Error" msgstr "Ошибка" -#: NOT FOUND IN SOURCE -msgid "Error adding watcher" -msgstr "" - #: lib/RT/Queue_Overlay.pm:555 msgid "Error in parameters to Queue->AddWatcher" msgstr "Ошибка в параметрах Queue->AddWatcher" @@ -1772,7 +1614,7 @@ msgstr "" #: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34 msgid "Find group whose" -msgstr "" +msgstr "Найти группы, у которых" #: html/Elements/Quicksearch:25 msgid "Find new/open tickets" @@ -1784,11 +1626,7 @@ msgstr "Найти людей, у которых" #: html/Search/Listing.html:108 msgid "Find tickets" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Finish Approval" -msgstr "" +msgstr "Поиск тикетов" #: html/Ticket/Elements/Tabs:58 msgid "First" @@ -1887,7 +1725,7 @@ msgstr "" #: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78 msgid "Group" -msgstr "" +msgstr "Групповые" #: NOT FOUND IN SOURCE msgid "Group %1 %2: %3" @@ -1901,10 +1739,6 @@ msgstr "Права группы" msgid "Group already has member" msgstr "Пользователь уже входит в группу" -#: NOT FOUND IN SOURCE -msgid "Group could not be created." -msgstr "" - #: html/Admin/Groups/Modify.html:77 #. ($create_msg) msgid "Group could not be created: %1" @@ -1998,7 +1832,7 @@ msgstr "" #: html/Admin/Elements/EditCustomFields:74 msgid "Include disabled custom fields in listing." -msgstr "" +msgstr "Включать отключенные дополнительные поля в список." #: html/Admin/Queues/index.html:43 msgid "Include disabled queues in listing." @@ -2357,7 +2191,7 @@ msgstr "MobilePhone" #: lib/RT/Queue_Overlay.pm:70 msgid "Modify Access Control List" -msgstr "" +msgstr "Изменить список контроля доступа" #: NOT FOUND IN SOURCE msgid "Modify Custom Field %1" @@ -2365,23 +2199,15 @@ msgstr "Изменение дополнительного поля %1" #: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51 msgid "Modify Custom Fields which apply to all queues" -msgstr "" +msgstr "Изменить дополнительные поля, применяемые кл всем очередям" #: lib/RT/Queue_Overlay.pm:73 msgid "Modify Scrip templates for this queue" -msgstr "" +msgstr "Изменить шаблоны скриплетов для данной очереди" #: lib/RT/Queue_Overlay.pm:76 msgid "Modify Scrips for this queue" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Modify System ACLS" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Modify Template %1" -msgstr "" +msgstr "Изменить скриплеты для данной очереди" #: html/Admin/Queues/CustomField.html:45 #. ($QueueObj->Name()) @@ -2401,10 +2227,6 @@ msgstr "Изменить скрипт для очереди %1" msgid "Modify a scrip which applies to all queues" msgstr "Изменение скрипта, который действует для всех очередей" -#: NOT FOUND IN SOURCE -msgid "Modify dates for # %1" -msgstr "" - #: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29 #. ($TicketObj->Id) msgid "Modify dates for #%1" @@ -2423,29 +2245,18 @@ msgstr "Изменение глобальных прав группы" msgid "Modify global group rights." msgstr "Изменение глобальных прав группы" -#: NOT FOUND IN SOURCE -msgid "Modify global rights for groups" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Modify global rights for users" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Modify global scrips" -msgstr "" #: html/Admin/Global/UserRights.html:25 html/Admin/Global/UserRights.html:28 html/Admin/Global/index.html:60 msgid "Modify global user rights" -msgstr "" +msgstr "Изменение глобальных прав пользователя" #: html/Admin/Global/UserRights.html:33 msgid "Modify global user rights." -msgstr "Изменение глобальных прав пользователя" +msgstr "Изменение глобальных прав пользователя." #: lib/RT/Group_Overlay.pm:146 msgid "Modify group metadata or delete group" -msgstr "" +msgstr "Изменение метаданных группы или ее удаление" #: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35 #. ($GroupObj->Name) @@ -2493,7 +2304,7 @@ msgstr "Изменение шаблона %1" #: html/Admin/Global/Templates.html:44 msgid "Modify templates which apply to all queues" -msgstr "" +msgstr "Изменить шаблоны, которые применяются ко всем очередям" #: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86 #. ($Group->Name) @@ -2502,7 +2313,7 @@ msgstr "Настройки для группы %1" #: lib/RT/Queue_Overlay.pm:71 msgid "Modify the queue watchers" -msgstr "" +msgstr "Изменить очередь наблюдателей" #: html/Admin/Users/Modify.html:236 #. ($UserObj->Name) @@ -2521,7 +2332,7 @@ msgstr "Изменение тикета # %1" #: lib/RT/Queue_Overlay.pm:88 msgid "Modify tickets" -msgstr "" +msgstr "Изменить тикеты" #: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35 #. ($GroupObj->Name) @@ -2596,7 +2407,7 @@ msgstr "Мои визы" #: html/Approvals/index.html:25 html/Approvals/index.html:26 msgid "My approvals" -msgstr "" +msgstr "Мои визы" #: html/Admin/Elements/AddCustomFieldValue:26 html/Admin/Elements/EditCustomField:32 html/Admin/Elements/ModifyTemplate:28 html/Admin/Elements/ModifyUser:30 html/Admin/Groups/Modify.html:44 html/Elements/SelectGroups:26 html/Elements/SelectUsers:28 html/User/Groups/Modify.html:44 msgid "Name" @@ -2606,10 +2417,6 @@ msgstr "Имя" msgid "Name in use" msgstr "Имя уже используется" -#: NOT FOUND IN SOURCE -msgid "Need approval from system administrator" -msgstr "" - #: html/Ticket/Elements/ShowDates:52 msgid "Never" msgstr "" @@ -2632,15 +2439,15 @@ msgstr "Новые связи" #: html/Ticket/Elements/Tabs:36 msgid "New Search" -msgstr "" +msgstr "Новый поиск" #: html/Admin/Global/CustomField.html:41 html/Admin/Global/CustomFields.html:39 html/Admin/Queues/CustomField.html:52 html/Admin/Queues/CustomFields.html:40 msgid "New custom field" -msgstr "" +msgstr "Новое дополнительное поле" #: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52 msgid "New group" -msgstr "" +msgstr "Новая группа" #: html/SelfService/Prefs.html:32 msgid "New password" @@ -2652,7 +2459,7 @@ msgstr "Отправлено сообщение с новым паролем" #: html/Admin/Elements/QueueTabs:70 msgid "New queue" -msgstr "" +msgstr "Новая очередь" #: html/SelfService/Elements/Tabs:63 msgid "New request" @@ -2664,7 +2471,7 @@ msgstr "Новые права" #: html/Admin/Global/Scrip.html:40 html/Admin/Global/Scrips.html:39 html/Admin/Queues/Scrip.html:43 html/Admin/Queues/Scrips.html:53 msgid "New scrip" -msgstr "" +msgstr "Новый скриплет" #: NOT FOUND IN SOURCE msgid "New search" @@ -2672,7 +2479,7 @@ msgstr "Новый поиск" #: html/Admin/Global/Template.html:60 html/Admin/Global/Templates.html:39 html/Admin/Queues/Template.html:58 html/Admin/Queues/Templates.html:46 msgid "New template" -msgstr "" +msgstr "Новый шаблон" #: lib/RT/Ticket_Overlay.pm:2771 msgid "New ticket doesn't exist" @@ -2680,7 +2487,7 @@ msgstr "Новый тикет не существует" #: html/Admin/Elements/UserTabs:52 msgid "New user" -msgstr "" +msgstr "Новый пользователь" #: html/Admin/Elements/CreateUserCalled:26 msgid "New user called" @@ -2954,7 +2761,7 @@ msgstr "На" #: etc/initialdata:155 msgid "On Comment" -msgstr "" +msgstr "На комментарий" #: etc/initialdata:148 msgid "On Correspond" @@ -2962,15 +2769,15 @@ msgstr "" #: etc/initialdata:137 msgid "On Create" -msgstr "" +msgstr "На создание" #: etc/initialdata:169 msgid "On Owner Change" -msgstr "" +msgstr "На изменение владельца" #: etc/initialdata:177 msgid "On Queue Change" -msgstr "" +msgstr "На изменение очереди" #: etc/initialdata:183 msgid "On Resolve" @@ -2978,11 +2785,11 @@ msgstr "" #: etc/initialdata:161 msgid "On Status Change" -msgstr "" +msgstr "на изменение статуса" #: etc/initialdata:142 msgid "On Transaction" -msgstr "" +msgstr "На транзакцию" #: html/Approvals/Elements/PendingMyApproval:50 #. ("") @@ -3108,7 +2915,7 @@ msgstr "В доступе отказано" #: html/User/Elements/Tabs:35 msgid "Personal Groups" -msgstr "" +msgstr "Личные группы" #: html/User/Groups/index.html:30 html/User/Groups/index.html:40 msgid "Personal groups" @@ -3169,7 +2976,7 @@ msgstr "Приоритет начинается с" #: etc/initialdata:25 msgid "Privileged" -msgstr "" +msgstr "Привилегированные" #: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163 #. (loc_fuzzy($msg)) @@ -3299,7 +3106,7 @@ msgstr "Самообслуживание RT / Закрытые тикеты" #: html/index.html:25 html/index.html:28 msgid "RT at a glance" -msgstr "" +msgstr "Обзор RT" #: NOT FOUND IN SOURCE msgid "RT couldn't authenticate you" @@ -3320,11 +3127,7 @@ msgstr "RT не смог проверить эту подпись PGP. \\n" #: html/Elements/PageLayout:26 #. ($RT::rtname) msgid "RT for %1" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "RT for %1: %2" -msgstr "" +msgstr "RT для %1" #: NOT FOUND IN SOURCE msgid "RT has proccessed your commands" @@ -3602,39 +3405,39 @@ msgstr "" #: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50 msgid "Select group" -msgstr "" +msgstr "Выбрать группу" #: lib/RT/CustomField_Overlay.pm:355 msgid "Select multiple values" -msgstr "" +msgstr "Выбрать несколько значений" #: lib/RT/CustomField_Overlay.pm:352 msgid "Select one value" -msgstr "" +msgstr "Выбрать одно значение" #: html/Admin/Elements/QueueTabs:67 msgid "Select queue" -msgstr "" +msgstr "Выбрать очередь" #: html/Admin/Global/Scrip.html:37 html/Admin/Global/Scrips.html:36 html/Admin/Queues/Scrip.html:40 html/Admin/Queues/Scrips.html:50 msgid "Select scrip" -msgstr "" +msgstr "Выбрать скриплет" #: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55 msgid "Select template" -msgstr "" +msgstr "Выбрать шаблон" #: html/Admin/Elements/UserTabs:49 msgid "Select user" -msgstr "" +msgstr "Выбрать пользователя" #: lib/RT/CustomField_Overlay.pm:36 msgid "SelectMultiple" -msgstr "" +msgstr "Выбрать несколько" #: lib/RT/CustomField_Overlay.pm:35 msgid "SelectSingle" -msgstr "" +msgstr "Выбрать одно" #: html/SelfService/index.html:25 msgid "Self Service" @@ -3642,15 +3445,15 @@ msgstr "Самообслуживание" #: etc/initialdata:114 msgid "Send mail to all watchers" -msgstr "" +msgstr "Отправить сообщение всем наблюдателям" #: etc/initialdata:110 msgid "Send mail to all watchers as a \"comment\"" -msgstr "" +msgstr "Отправить сообщение всем наблюдателям как \"комментарий\"" #: etc/initialdata:105 msgid "Send mail to requestors and Ccs" -msgstr "" +msgstr "Отправить сообщение всем инициаторам запроса и CCs" #: etc/initialdata:100 msgid "Send mail to requestors and Ccs as a comment" @@ -3680,14 +3483,6 @@ msgstr "" msgid "Sep." msgstr "Сен." -#: NOT FOUND IN SOURCE -msgid "September" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Show Results" -msgstr "Искать" - #: html/Approvals/Elements/PendingMyApproval:44 msgid "Show approved requests" msgstr "Показать завизированные запросы" @@ -3710,15 +3505,15 @@ msgstr "Показать ожидающие запросы" #: html/Approvals/Elements/PendingMyApproval:46 msgid "Show requests awaiting other approvals" -msgstr "" +msgstr "Показать запросы, ждущие других виз" #: lib/RT/Queue_Overlay.pm:81 msgid "Show ticket private commentary" -msgstr "" +msgstr "Показать приватные комментарии по тикету" #: lib/RT/Queue_Overlay.pm:79 msgid "Show ticket summaries" -msgstr "" +msgstr "Показать общую информацию по запросу" #: lib/RT/Queue_Overlay.pm:69 msgid "ShowACL" @@ -3822,10 +3617,6 @@ msgstr "" msgid "Status changed from %1 to %2" msgstr "Статус изменен с %1 на %2" -#: NOT FOUND IN SOURCE -msgid "StatusChange" -msgstr "" - #: html/Ticket/Elements/Tabs:147 msgid "Steal" msgstr "Отобрать" @@ -3842,16 +3633,12 @@ msgstr "Тема" #: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611 #. ($self->Data) msgid "Subject changed to %1" -msgstr "" +msgstr "Тема изменена на %1" #: html/Elements/Submit:59 msgid "Submit" msgstr "Готово" -#: NOT FOUND IN SOURCE -msgid "Submit Workflow" -msgstr "" - #: lib/RT/Group_Overlay.pm:749 msgid "Succeeded" msgstr "" @@ -3862,24 +3649,16 @@ msgstr "Вск." #: lib/RT/System.pm:54 msgid "SuperUser" -msgstr "" +msgstr "Администратор" #: html/User/Elements/DelegateRights:77 msgid "System" -msgstr "" +msgstr "Системные" #: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:567 lib/RT/Interface/Web.pm:757 lib/RT/Interface/Web.pm:790 msgid "System Error" msgstr "Ошибка системы" -#: NOT FOUND IN SOURCE -msgid "System Error. Right not granted." -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "System Error. right not granted" -msgstr "" - #: lib/RT/ACE_Overlay.pm:616 msgid "System error. Right not delegated." msgstr "Ошибка системы. Право не было делегировано." @@ -3888,17 +3667,13 @@ msgstr "Ошибка системы. Право не было делегиров msgid "System error. Right not granted." msgstr "Ошибка системы. Право не было выдано." -#: NOT FOUND IN SOURCE -msgid "System error. Unable to grant rights." -msgstr "" - #: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36 msgid "System groups" msgstr "Системные группы" #: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 msgid "SystemRolegroup for internal use" -msgstr "" +msgstr "Системная группа для внутреннего использования" #: lib/RT/CurrentUser.pm:320 msgid "TEST_STRING" @@ -3919,11 +3694,11 @@ msgstr "Шаблон" #: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90 #. ($TemplateObj->Id()) msgid "Template #%1" -msgstr "" +msgstr "Шаблон #%1" #: html/Admin/Elements/EditTemplates:89 msgid "Template deleted" -msgstr "" +msgstr "Шаблон удален" #: lib/RT/Scrip_Overlay.pm:153 msgid "Template not found" @@ -3947,7 +3722,7 @@ msgstr "Шаблоны для %1\\n" #: lib/RT/Interface/Web.pm:858 msgid "That is already the current value" -msgstr "" +msgstr "Это уже текущее значение" #: lib/RT/CustomField_Overlay.pm:178 msgid "That is not a value for this custom field" @@ -4013,10 +3788,6 @@ msgstr "Этот пользователь теперь имеет все пол msgid "That user is now unprivileged" msgstr "Этот пользователь теперь не имеет полномочий" -#: NOT FOUND IN SOURCE -msgid "That user is now unprivilegedileged" -msgstr "" - #: lib/RT/Ticket_Overlay.pm:2944 msgid "That user may not own tickets in that queue" msgstr "Этот пользователь не может владеть тикетами из этой очереди" @@ -4051,15 +3822,15 @@ msgstr "Эти команды не были исполнены:\\n\\n" #: lib/RT/Interface/Web.pm:861 msgid "The new value has been set." -msgstr "" +msgstr "Новое значение установлено" #: lib/RT/ACE_Overlay.pm:86 msgid "The owner of a ticket" -msgstr "" +msgstr "Владелец тикета" #: lib/RT/ACE_Overlay.pm:87 msgid "The requestor of a ticket" -msgstr "" +msgstr "Кто отправил тикет" #: html/Admin/Elements/EditUserComments:26 msgid "These comments aren't generally visible to the user" @@ -4080,7 +3851,7 @@ msgstr "Похоже, что эта транзакция не имеет инф #: html/Ticket/Elements/ShowRequestor:47 #. ($rows) msgid "This user's %1 highest priority tickets" -msgstr "" +msgstr "%1 тикетов максимального приоритета этого пользователя" #: NOT FOUND IN SOURCE msgid "This user's 25 highest priority tickets" @@ -4090,18 +3861,6 @@ msgstr "25 важнейших тикетов пользователя..." msgid "Thu." msgstr "Чтв." -#: NOT FOUND IN SOURCE -msgid "Ticket" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Ticket # %1 %2" -msgstr "Тикет # %1 %2" - -#: NOT FOUND IN SOURCE -msgid "Ticket # %1 Jumbo update: %2" -msgstr "" - #: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29 #. ($Ticket->Id, $Ticket->Subject) msgid "Ticket #%1 Jumbo update: %2" @@ -4154,7 +3913,7 @@ msgstr "Тип данных тикета" #: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597 msgid "Ticket could not be created due to an internal error" -msgstr "" +msgstr "Тикет не может быть создан из-за внутренней ошибки" #: lib/RT/Transaction_Overlay.pm:522 msgid "Ticket created" @@ -4172,17 +3931,13 @@ msgstr "Тикет удален" msgid "Ticket id not found" msgstr "Идентификатор тикета не найден" -#: NOT FOUND IN SOURCE -msgid "Ticket killed" -msgstr "" - #: html/REST/1.0/modify:36 html/REST/1.0/update:41 msgid "Ticket not found" msgstr "Тикет не найден" #: etc/initialdata:289 msgid "Ticket status changed" -msgstr "" +msgstr "Статус тикета изменен" #: html/Ticket/Update.html:39 msgid "Ticket watchers" @@ -4190,7 +3945,7 @@ msgstr "Наблюдатели для тикета" #: html/Elements/Tabs:49 msgid "Tickets" -msgstr "" +msgstr "Тикеты" #: lib/RT/Tickets_Overlay.pm:1383 #. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) @@ -4231,21 +3986,17 @@ msgstr "Время для показа" msgid "Time worked" msgstr "В работе" -#: NOT FOUND IN SOURCE -msgid "TimeLeft" -msgstr "" - #: lib/RT/Ticket_Overlay.pm:1165 msgid "TimeWorked" -msgstr "" +msgstr "В работе" #: bin/rt-commit-handler:402 msgid "To generate a diff of this commit:" -msgstr "Для генерации дифа этого коммита:" +msgstr "Для генерации изменений этого коммита:" #: bin/rt-commit-handler:391 msgid "To generate a diff of this commit:\\n" -msgstr "Для генерации дифа этого коммита:\\n" +msgstr "Для генерации изменений этого коммита:\\n" #: lib/RT/Ticket_Overlay.pm:1168 msgid "Told" @@ -4253,7 +4004,7 @@ msgstr "Контакт" #: etc/initialdata:237 msgid "Transaction" -msgstr "" +msgstr "Транзакция" #: lib/RT/Transaction_Overlay.pm:642 #. ($self->Data) @@ -4307,7 +4058,7 @@ msgstr "Не ограничено" #: etc/initialdata:32 msgid "Unprivileged" -msgstr "" +msgstr "Непривилегированный" #: lib/RT/Transaction_Overlay.pm:571 msgid "Untaken" @@ -4361,12 +4112,12 @@ msgstr "Обновить тикет # %1" #: html/SelfService/Update.html:50 #. ($Ticket->id) msgid "Update ticket #%1" -msgstr "Обновить тикет # %1" +msgstr "Обновить тикет #%1" #: html/Ticket/Update.html:135 #. ($Ticket->id, $Ticket->Subject) msgid "Update ticket #%1 (%2)" -msgstr "" +msgstr "Обновить тикет #%1 (%2)" #: lib/RT/Interface/Web.pm:373 msgid "Update type was neither correspondence nor comment." @@ -4461,10 +4212,6 @@ msgstr "" msgid "WatchAsAdminCc" msgstr "" -#: NOT FOUND IN SOURCE -msgid "Watcher loaded" -msgstr "" - #: html/Admin/Elements/QueueTabs:42 msgid "Watchers" msgstr "Наблюдатели" @@ -4585,19 +4332,15 @@ msgstr "Администратор RT неправильно настроил п #: etc/initialdata:429 etc/upgrade/2.1.71:146 msgid "Your request has been approved by %1. Other approvals may still be pending." -msgstr "" +msgstr "Ваш запрос подтвердил %1. Другие подтверждения могут продолжать находиться в ожидании." #: etc/initialdata:463 etc/upgrade/2.1.71:180 msgid "Your request has been approved." -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "Your request was rejected" -msgstr "" +msgstr "Ваш запрос подтвержден." #: etc/initialdata:384 etc/upgrade/2.1.71:101 msgid "Your request was rejected." -msgstr "" +msgstr "Ваш запрос был отвергнут." #: html/autohandler:136 html/autohandler:142 msgid "Your username or password is incorrect" @@ -4607,10 +4350,6 @@ msgstr "Вы ввели неверное имя или пароль" msgid "Zip" msgstr "Индекс" -#: NOT FOUND IN SOURCE -msgid "[no subject]" -msgstr "" - #: html/User/Elements/DelegateRights:59 #. ($right->PrincipalObj->Object->SelfDescription) msgid "as granted to %1" @@ -4640,10 +4379,6 @@ msgstr "отправлено сообщение" msgid "days" msgstr "дней" -#: NOT FOUND IN SOURCE -msgid "dead" -msgstr "" - #: html/Search/Listing.html:75 msgid "delete" msgstr "удалить" @@ -4664,10 +4399,6 @@ msgstr "не содержит" msgid "equal to" msgstr "равняется" -#: NOT FOUND IN SOURCE -msgid "false" -msgstr "" - #: html/Elements/SelectAttachmentField:28 msgid "filename" msgstr "имя файла" @@ -4737,10 +4468,6 @@ msgstr "нет" msgid "not equal to" msgstr "не равен" -#: NOT FOUND IN SOURCE -msgid "notlike" -msgstr "" - #: lib/RT/Queue_Overlay.pm:59 msgid "open" msgstr "открыт" @@ -4790,17 +4517,9 @@ msgstr "вызывающий компонент не указал причину msgid "ticket #%1 %2" msgstr "тикет #%1 %2" -#: NOT FOUND IN SOURCE -msgid "true" -msgstr "" - #: lib/RT/Group_Overlay.pm:216 #. ($self->Id) msgid "undescribed group %1" -msgstr "" - -#: NOT FOUND IN SOURCE -msgid "undescripbed group %1" msgstr "неописанная группа %1" #: lib/RT/Group_Overlay.pm:191 @@ -4819,8 +4538,3 @@ msgstr "с шаблоном %1" #: lib/RT/Date.pm:331 msgid "years" msgstr "лет" - -#: NOT FOUND IN SOURCE -msgid "ニックネーム" -msgstr "" - diff --git a/rt/lib/RT/I18N/zh_cn.po b/rt/lib/RT/I18N/zh_cn.po index ededc1ac3..0f0b8da60 100644 --- a/rt/lib/RT/I18N/zh_cn.po +++ b/rt/lib/RT/I18N/zh_cn.po @@ -1,4 +1,4 @@ -# Traditional Chinese localization catalog for Request Tracker (RT) +# Chinese localization catalog for Request Tracker (RT) msgid "" msgstr "" "Last-Translator: Autrijus Tang \n" @@ -7,7 +7,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: html/Elements/MyRequests:27 html/Elements/MyTickets:27 html/Work/Elements/MyApprovals:8 html/Work/Elements/MyRequests:9 html/Work/Elements/MyTickets:9 +#: html/Elements/MyRequests:27 html/Elements/MyTickets:27 html/Work/Elements/MyApprovals:8 html/Work/Elements/MyRequests:15 html/Work/Elements/MyTickets:15 msgid "#" msgstr "#" @@ -40,7 +40,7 @@ msgstr "%*(%1) 件尚未解决的申请单" msgid "%1 %2" msgstr "%1 %2" -#: lib/RT/Tickets_Overlay.pm:771 +#: lib/RT/Tickets_Overlay.pm:790 #. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}) msgid "%1 %2 %3" msgstr "%1 %2 %3" @@ -50,10 +50,11 @@ msgstr "%1 %2 %3" msgid "%1 %2 %3 %4:%5:%6 %7" msgstr "%7-%2-%3 %4:%5:%6 %1" -#: lib/RT/Ticket_Overlay.pm:3541 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Overlay.pm:599 +#: lib/RT/Ticket_Overlay.pm:3588 lib/RT/Transaction_Overlay.pm:514 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Vendor.pm:19 #. ($cf->Name, $new_value->Content) #. ($field, $self->NewValue) #. ($self->Field, $principal->Object->Name) +#. ($field, $new_value) msgid "%1 %2 added" msgstr "%2 已新增为 %1" @@ -62,16 +63,18 @@ msgstr "%2 已新增为 %1" msgid "%1 %2 ago" msgstr "%1 %2 之前" -#: lib/RT/Ticket_Overlay.pm:3547 lib/RT/Transaction_Overlay.pm:564 +#: lib/RT/Ticket_Overlay.pm:3594 lib/RT/Transaction_Overlay.pm:521 lib/RT/Transaction_Vendor.pm:25 #. ($cf->Name, $old_value, $new_value->Content) #. ($field, $self->OldValue, $self->NewValue) +#. ($field, $old_value, $new_value) msgid "%1 %2 changed to %3" msgstr "%1 已从 %2 改为 %3" -#: lib/RT/Ticket_Overlay.pm:3544 lib/RT/Transaction_Overlay.pm:560 lib/RT/Transaction_Overlay.pm:605 +#: lib/RT/Ticket_Overlay.pm:3591 lib/RT/Transaction_Overlay.pm:517 lib/RT/Transaction_Overlay.pm:563 lib/RT/Transaction_Vendor.pm:22 #. ($cf->Name, $old_value) #. ($field, $self->OldValue) #. ($self->Field, $principal->Object->Name) +#. ($field, $old_value) msgid "%1 %2 deleted" msgstr "%2 已自 %1 删除" @@ -121,17 +124,17 @@ msgstr "%1 - 指定欲使用的条件模块" msgid "%1 - Specify the search module you want to use" msgstr "%1 - 指定欲使用的查询模块" -#: lib/RT/ScripAction_Overlay.pm:121 +#: lib/RT/ScripAction_Overlay.pm:122 #. ($self->Id) msgid "%1 ScripAction loaded" msgstr "加载手续 %1" -#: html/Edit/Elements/Page:48 +#: html/Edit/Elements/Page:49 #. (scalar $count) msgid "%1 Total" msgstr "共 %1 笔" -#: lib/RT/Ticket_Overlay.pm:3574 +#: lib/RT/Ticket_Overlay.pm:3621 #. ($args{'Value'}, $cf->Name) msgid "%1 added as a value for %2" msgstr "新增 %1 作为 %2 的值" @@ -154,13 +157,13 @@ msgstr "别名 %1 需要可用的申请单编号以处理 %3(出自 %2)" msgid "%1 appears to be a local object, but can't be found in the database" msgstr "%1 看来是个本地对象,却不在数据库里" -#: html/Ticket/Elements/ShowDates:51 lib/RT/Transaction_Overlay.pm:481 +#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:430 #. ($self->BriefDescription , $self->CreatorObj->Name) #. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) msgid "%1 by %2" msgstr "%1 (%2)" -#: lib/RT/Transaction_Overlay.pm:535 lib/RT/Transaction_Overlay.pm:624 lib/RT/Transaction_Overlay.pm:633 lib/RT/Transaction_Overlay.pm:636 +#: lib/RT/Transaction_Overlay.pm:484 lib/RT/Transaction_Overlay.pm:649 lib/RT/Transaction_Overlay.pm:658 lib/RT/Transaction_Overlay.pm:661 #. ($self->Field , ( $self->OldValue || $no_value ) , $self->NewValue) #. ($self->Field , $q1->Name , $q2->Name) #. ($self->Field, $t2->AsString, $t1->AsString) @@ -168,7 +171,7 @@ msgstr "%1 (%2)" msgid "%1 changed from %2 to %3" msgstr "%1 的值从 %2 改为 %3" -#: lib/RT/Interface/Web.pm:893 +#: lib/RT/Interface/Web.pm:953 msgid "%1 could not be set to %2." msgstr "无法将 %1 设定为 %2。" @@ -176,17 +179,17 @@ msgstr "无法将 %1 设定为 %2。" msgid "%1 couldn't init a transaction (%2)\\n" msgstr "%1 无法初始更新 (%2)\\n" -#: lib/RT/Ticket_Overlay.pm:2839 +#: lib/RT/Ticket_Overlay.pm:2880 #. ($self) msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent." msgstr "%1 无法将现况设成已解决。RT 数据库内容可能不一致。" -#: html/Elements/MyTickets:24 html/Work/Elements/MyTickets:6 +#: html/Elements/MyTickets:24 html/Work/Elements/MyTickets:9 #. ($rows) msgid "%1 highest priority tickets I own..." msgstr "前 %1 份待处理申请单..." -#: html/Elements/MyRequests:24 html/Work/Elements/MyRequests:6 +#: html/Elements/MyRequests:24 html/Work/Elements/MyRequests:9 #. ($rows) msgid "%1 highest priority tickets I requested..." msgstr "前 %1 份送出的申请单..." @@ -206,12 +209,12 @@ msgstr "%1 是从外部排程程序(如 cron)来对申请单进行操作的工 msgid "%1 is no longer a %2 for this queue." msgstr "%1 已不再是此表单的 %2。" -#: lib/RT/Ticket_Overlay.pm:1578 +#: lib/RT/Ticket_Overlay.pm:1596 #. ($principal->Object->Name, $args{'Type'}) msgid "%1 is no longer a %2 for this ticket." msgstr "%1 已不再是此申请单的 %2。" -#: lib/RT/Ticket_Overlay.pm:3630 +#: lib/RT/Ticket_Overlay.pm:3677 #. ($args{'Value'}, $cf->Name) msgid "%1 is no longer a value for custom field %2" msgstr "%1 已不再是自订字段 %2 的值。" @@ -264,17 +267,17 @@ msgstr "%1 会解决在已解决群组里成员的申请单。" msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request." msgstr "如果 %1 起始申请单依赖于某个链接,或是某个链接的成员,它将会被延宕。" -#: lib/RT/Transaction_Overlay.pm:433 +#: lib/RT/Transaction_Overlay.pm:382 lib/RT/Transaction_Vendor.pm:37 #. ($self) msgid "%1: no attachment specified" msgstr "%1:未指定附件" -#: html/Ticket/Elements/ShowTransaction:89 html/Work/Tickets/Elements/ShowTransaction:152 +#: html/Ticket/Elements/ShowTransaction:100 html/Work/Tickets/Elements/ShowTransaction:158 #. ($size) msgid "%1b" msgstr "%1 字节" -#: html/Ticket/Elements/ShowTransaction:86 html/Work/Tickets/Elements/ShowTransaction:149 +#: html/Ticket/Elements/ShowTransaction:97 html/Work/Tickets/Elements/ShowTransaction:155 #. (int($size/102.4)/10) msgid "%1k" msgstr "%1k 字节" @@ -283,7 +286,7 @@ msgstr "%1k 字节" msgid "%quant(%1,result) found" msgstr "找到 %1 项结果" -#: lib/RT/Ticket_Overlay.pm:1148 +#: lib/RT/Ticket_Overlay.pm:1185 #. ($args{'Status'}) msgid "'%1' is an invalid value for status" msgstr "'%1' 不是一个合法的状态值" @@ -300,7 +303,7 @@ msgstr "(点选欲删除的成员)" msgid "(Check box to delete scrip)" msgstr "(点选欲删除的手续)" -#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Elements/EditWorkflows:36 html/Admin/Groups/Members.html:51 html/Ticket/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 +#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Elements/EditWorkflows:36 html/Admin/Groups/Members.html:51 html/Ticket/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 html/Work/Tickets/Elements/EditLinks:20 html/Work/Tickets/Elements/EditPeople:36 msgid "(Check box to delete)" msgstr "(点选欲删除的项目)" @@ -308,7 +311,7 @@ msgstr "(点选欲删除的项目)" msgid "(Check boxes to delete)" msgstr "(点选欲删除的项目)" -#: html/Ticket/Create.html:177 +#: html/Ticket/Create.html:178 msgid "(Enter ticket ids or URLs, seperated with spaces)" msgstr "(键入申请单编号或网址,以空白分隔)" @@ -342,7 +345,7 @@ msgstr "没有模板" msgid "(No workflows)" msgstr "没有流程" -#: html/Ticket/Update.html:83 html/Work/Tickets/Update.html:52 +#: html/Ticket/Update.html:83 html/Work/Tickets/Update.html:56 msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will receive future updates.)" msgstr "(送出本份更新的密件副本给名单上以逗号隔开的电子邮件地址。这不会更改后续的收件者名单。)" @@ -366,7 +369,7 @@ msgstr "(送出本份更新的副本给名单上以逗号隔开的电子邮件 msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people will receive future updates.)" msgstr "(送出本份更新的副本给名单上以逗号隔开的电子邮件地址。这将会更改后续的收件者名单。)" -#: html/Ticket/Elements/EditCustomFieldEntries:35 html/Work/Tickets/Elements/EditCustomFieldEntries:33 html/Work/Tickets/Elements/ShowCustomFieldEntries:13 +#: html/Ticket/Elements/EditCustomFieldEntries:35 html/Work/Tickets/Elements/EditCustomFieldEntries:43 html/Work/Tickets/Elements/ShowCustomFieldEntries:14 msgid "(delete)" msgstr "(删除)" @@ -374,7 +377,7 @@ msgstr "(删除)" msgid "(empty)" msgstr "(空白)" -#: html/Edit/Global/CustomField/index.html:113 html/Edit/Global/Scrip/index.html:111 html/Edit/Global/Template/index.html:106 +#: html/Edit/Elements/Index:87 html/Edit/Global/CustomField/index.html:116 html/Edit/Global/Scrip/index.html:111 html/Edit/Global/Template/index.html:106 msgid "(new)" msgstr "(新增)" @@ -382,23 +385,23 @@ msgstr "(新增)" msgid "(no name listed)" msgstr "(没有列出姓名)" -#: html/Elements/MyRequests:42 html/Elements/MyTickets:44 html/Work/Elements/MyApprovals:37 html/Work/Elements/MyRequests:36 html/Work/Elements/MyTickets:41 +#: html/Elements/MyRequests:42 html/Elements/MyTickets:44 html/Work/Elements/MyApprovals:37 html/Work/Elements/MyRequests:43 html/Work/Elements/MyTickets:52 msgid "(no subject)" msgstr "(没有主题)" -#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:60 html/Ticket/Elements/EditCustomFieldValues:52 html/Ticket/Elements/ShowCustomFields:35 html/Work/Elements/EditCustomFieldValues:50 html/Work/Elements/EditCustomFields:32 html/Work/Tickets/Elements/EditCustomFieldValues:33 lib/RT/Transaction_Overlay.pm:534 +#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:64 html/Ticket/Elements/EditCustomFieldValues:52 html/Ticket/Elements/ShowCustomFields:35 html/Work/Elements/EditCustomFieldValues:50 html/Work/Elements/EditCustomFields:32 html/Work/Tickets/Elements/EditCustomFieldValues:33 lib/RT/Transaction_Overlay.pm:483 msgid "(no value)" msgstr "(无)" -#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:115 html/Work/Search/BulkLinks:3 +#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:98 html/Work/Search/BulkLinks:3 html/Work/Tickets/Elements/EditLinks:102 msgid "(only one ticket)" msgstr "(仅能指定一份申请单)" -#: html/Elements/MyRequests:51 html/Elements/MyTickets:54 html/Work/Elements/List:17 html/Work/Elements/MyRequests:46 html/Work/Elements/MyTickets:56 html/Work/Tickets/Elements/ShowBasics:44 +#: html/Elements/MyRequests:51 html/Elements/MyTickets:54 html/Work/Elements/List:17 html/Work/Elements/MyRequests:53 html/Work/Elements/MyTickets:67 html/Work/Tickets/Elements/ShowBasics:52 msgid "(pending approval)" msgstr "(等待签核)" -#: html/Elements/MyRequests:53 html/Elements/MyTickets:56 html/Work/Elements/MyRequests:48 html/Work/Elements/MyTickets:58 +#: html/Elements/MyRequests:53 html/Elements/MyTickets:56 html/Work/Elements/MyRequests:55 html/Work/Elements/MyTickets:69 msgid "(pending other tickets)" msgstr "(等待其它申请单)" @@ -406,23 +409,15 @@ msgstr "(等待其它申请单)" msgid "(requestor's group)" msgstr "(申请人所属)" -#: html/Admin/Users/Modify.html:49 +#: html/Admin/Users/Modify.html:49 html/Edit/Users/Info:26 msgid "(required)" msgstr "(必填)" -#: html/Ticket/Elements/ShowTransaction:92 html/Work/Tickets/Elements/ShowTransaction:37 +#: html/Ticket/Elements/ShowTransaction:103 html/Work/Tickets/Elements/ShowTransaction:44 msgid "(untitled)" msgstr "(未命名)" #: NOT FOUND IN SOURCE -msgid "25 highest priority tickets I own..." -msgstr "前 25 份待处理申请单..." - -#: NOT FOUND IN SOURCE -msgid "25 highest priority tickets I requested..." -msgstr "前 25 份送出的申请单..." - -#: NOT FOUND IN SOURCE msgid ":" msgstr ":" @@ -434,12 +429,12 @@ msgstr "<% $Ticket->Status%>" msgid "<% $_ %>" msgstr "<% $_ %>" -#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 html/Work/Elements/104Header:43 +#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 html/Work/Elements/104Header:43 lib/RT/StyleGuide.pod:767 #. ($m->scomp('/Elements/SelectNewTicketQueue')) msgid " %1" msgstr " %1" -#: etc/initialdata:221 +#: etc/initialdata:203 msgid "A blank template" msgstr "空白模板" @@ -459,7 +454,7 @@ msgstr "无法删除 ACE" msgid "ACE could not be found" msgstr "找不到 ACE" -#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:179 +#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:180 msgid "ACE not found" msgstr "找不到 ACE 设定" @@ -487,11 +482,11 @@ msgstr "系统使用登录权限" msgid "Access control" msgstr "存取权限" -#: html/Admin/Elements/EditScrip:56 html/Work/Tickets/Elements/ShowTransaction:18 +#: html/Admin/Elements/EditScrip:56 html/Work/Tickets/Elements/ShowTransaction:21 msgid "Action" msgstr "动作" -#: lib/RT/Scrip_Overlay.pm:146 +#: lib/RT/Scrip_Overlay.pm:148 #. ($args{'ScripAction'}) msgid "Action %1 not found" msgstr "动作 %1 找不到" @@ -504,11 +499,11 @@ msgstr "动作执行完毕" msgid "Action prepared..." msgstr "动作准备完毕..." -#: html/Work/Elements/List:13 html/Work/Elements/SelectSearch:24 html/Work/Tickets/Create.html:26 html/Work/Tickets/Elements/ShowBasics:12 +#: html/Work/Elements/List:13 html/Work/Elements/SelectSearch:25 html/Work/Tickets/Create.html:27 html/Work/Tickets/Elements/ShowBasics:12 msgid "Activated Date" msgstr "申请激活时间" -#: html/Edit/Elements/104Buttons:71 html/Edit/Elements/ListButtons:7 +#: html/Edit/Elements/104Buttons:82 html/Edit/Elements/ListButtons:7 msgid "Add" msgstr "新增" @@ -520,11 +515,11 @@ msgstr "新增管理员副本收件人" msgid "Add Cc" msgstr "新增副本收件人" -#: html/Ticket/Elements/EditCustomFieldEntries:71 html/Work/Tickets/Elements/ShowCustomFieldEntries:49 +#: html/Ticket/Elements/EditCustomFieldEntries:71 html/Work/Tickets/Elements/ShowCustomFieldEntries:50 msgid "Add Entry" msgstr "新增列" -#: html/Ticket/Create.html:113 html/Ticket/Update.html:98 html/Work/Tickets/Elements/AddAttachments:18 +#: html/Ticket/Create.html:113 html/Ticket/Update.html:98 html/Work/Tickets/Elements/AddAttachments:23 msgid "Add More Files" msgstr "新增更多附件" @@ -585,16 +580,20 @@ msgstr "新增下一项关卡" msgid "Added principal as a %1 for this queue" msgstr "单位已新增为此表单的 %1" -#: lib/RT/Ticket_Overlay.pm:1462 +#: lib/RT/Ticket_Overlay.pm:1480 #. ($self->loc($args{'Type'})) msgid "Added principal as a %1 for this ticket" msgstr "单位已新增为此申请单的 %1" -#: html/Admin/Elements/ModifyUser:75 html/Admin/Users/Modify.html:121 html/User/Prefs.html:87 html/Work/Preferences/Info:76 +#: html/Edit/Global/CustomField/Top:52 +msgid "Additional Hints" +msgstr "额外提示" + +#: html/Admin/Elements/ModifyUser:75 html/Admin/Users/Modify.html:121 html/User/Prefs.html:114 html/Work/Preferences/Info:79 msgid "Address1" msgstr "住址" -#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:89 html/Work/Preferences/Info:78 +#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:118 html/Work/Preferences/Info:81 msgid "Address2" msgstr "住址(ç»­)" @@ -602,7 +601,7 @@ msgstr "住址(ç»­)" msgid "Adjust Blinking Rate" msgstr "调整闪烁速度快慢" -#: html/Edit/Groups/Admin:9 +#: html/Edit/Queues/List:12 msgid "Admin" msgstr "管理员" @@ -610,11 +609,11 @@ msgstr "管理员" msgid "Admin Cc" msgstr "管理员副本" -#: etc/initialdata:303 +#: etc/initialdata:280 msgid "Admin Comment" msgstr "管理员评论" -#: etc/initialdata:261 +#: etc/initialdata:259 msgid "Admin Correspondence" msgstr "管理员回复" @@ -642,7 +641,7 @@ msgstr "管理/群组" msgid "Admin/Queue/Basics" msgstr "管理/表单/基本信息" -#: html/Edit/Global/Basic/Top:60 +#: html/Edit/Global/Basic/Top:65 msgid "AdminAddress" msgstr "管理员 Email" @@ -650,7 +649,7 @@ msgstr "管理员 Email" msgid "AdminAllPersonalGroups" msgstr "管理所有代理人群组" -#: etc/initialdata:74 html/Admin/Elements/ModifyTemplateAsWorkflow:155 html/Ticket/Elements/ShowPeople:38 html/Ticket/Update.html:49 lib/RT/ACE_Overlay.pm:88 +#: etc/initialdata:56 html/Admin/Elements/ModifyTemplateAsWorkflow:155 html/Ticket/Elements/ShowPeople:38 html/Ticket/Update.html:49 html/Work/Tickets/Elements/ShowLinks:11 lib/RT/ACE_Overlay.pm:88 msgid "AdminCc" msgstr "管理员副本" @@ -666,7 +665,7 @@ msgstr "管理员回复" msgid "AdminCustomFields" msgstr "管理自订字段" -#: html/Edit/Groups/Admin:12 lib/RT/Group_Overlay.pm:145 +#: lib/RT/Group_Overlay.pm:145 msgid "AdminGroup" msgstr "管理群组" @@ -706,7 +705,7 @@ msgstr "管理使用者" msgid "Administrative" msgstr "行政类" -#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 +#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 html/Work/Tickets/Elements/EditPeople:44 msgid "Administrative Cc" msgstr "管理员副本" @@ -726,7 +725,7 @@ msgstr "晚于" msgid "Age" msgstr "经历时间" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:172 html/Edit/Global/Workflow/Action:39 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:172 html/Edit/Global/Workflow/Action:35 msgid "Alias" msgstr "执行其它流程" @@ -734,11 +733,11 @@ msgstr "执行其它流程" msgid "Alias for" msgstr "相当于" -#: html/Edit/Queues/index.html:33 html/Work/Delegates/index.html:13 html/Work/Elements/SelectSearch:11 html/Work/Queues/Select.html:14 html/Work/Queues/index.html:13 +#: html/Work/Delegates/index.html:13 html/Work/Elements/SelectSearch:11 html/Work/Queues/Select.html:14 html/Work/Queues/index.html:13 msgid "All" msgstr "全部" -#: etc/initialdata:372 +#: etc/initialdata:348 msgid "All Approvals Passed" msgstr "完成全部签核" @@ -746,7 +745,7 @@ msgstr "完成全部签核" msgid "All Condition" msgstr "所有条件" -#: html/Admin/Elements/EditCustomFields:95 +#: html/Admin/Elements/EditCustomFields:94 msgid "All Custom Fields" msgstr "所有自订字段" @@ -759,6 +758,10 @@ msgid "All Users" msgstr "全体员工" #: NOT FOUND IN SOURCE +msgid "All done! Now you can proceed to %1." +msgstr "处理完毕!您现在可以继续进行 %1。" + +#: NOT FOUND IN SOURCE msgid "Allowance Request" msgstr "福利补助申请" @@ -774,7 +777,7 @@ msgstr "数额" msgid "Any Condition" msgstr "任意条件" -#: html/Edit/Global/Scrip/List:10 html/Edit/Global/Scrip/Top:74 +#: html/Edit/Global/Scrip/List:10 html/Edit/Global/Scrip/Top:86 msgid "Apply Template" msgstr "引用模板" @@ -811,11 +814,11 @@ msgstr "签核时限" msgid "Approval Notes" msgstr "签核意见" -#: etc/initialdata:357 +#: etc/initialdata:336 msgid "Approval Passed" msgstr "完成某项签核" -#: etc/initialdata:383 +#: etc/initialdata:359 msgid "Approval Rejected" msgstr "驳回某项签核" @@ -843,11 +846,11 @@ msgstr "核准" msgid "Approver" msgstr "签核人" -#: html/Edit/Global/Workflow/Action:29 html/Edit/Global/Workflow/Owner.html:10 +#: html/Edit/Global/Workflow/Action:25 html/Edit/Global/Workflow/Owner.html:10 msgid "Approver Setting" msgstr "执行签核人设定" -#: etc/initialdata:516 etc/upgrade/2.1.71:148 html/Edit/Elements/CreateApprovalsQueue:122 +#: etc/initialdata:486 etc/upgrade/2.1.71:148 html/Edit/Elements/CreateApprovalsQueue:122 msgid "Approver's notes: %1" msgstr "签核备注:%1" @@ -871,15 +874,15 @@ msgstr "您确定要删除?" msgid "Ascending" msgstr "递增" -#: html/Search/Bulk.html:136 html/SelfService/Update.html:32 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:98 html/Work/Search/Bulk.html:88 +#: html/Search/Bulk.html:136 html/SelfService/Update.html:47 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:98 html/Work/Search/Bulk.html:88 msgid "Attach" msgstr "附件" -#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 html/Work/Tickets/Elements/AddAttachments:15 +#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 html/Work/Tickets/Elements/AddAttachments:19 msgid "Attach file" msgstr "附加档案" -#: html/Ticket/Create.html:97 html/Ticket/Update.html:87 html/Work/Tickets/Elements/AddAttachments:6 +#: html/SelfService/Update.html:36 html/Ticket/Create.html:97 html/Ticket/Update.html:87 html/Work/Tickets/Elements/AddAttachments:7 html/Work/Tickets/Elements/ShowAttachments:9 msgid "Attached file" msgstr "现有附件" @@ -887,15 +890,15 @@ msgstr "现有附件" msgid "Attachment '%1' could not be loaded" msgstr "无法加载附件 '%1'" -#: lib/RT/Transaction_Overlay.pm:441 +#: lib/RT/Transaction_Overlay.pm:390 lib/RT/Transaction_Vendor.pm:50 msgid "Attachment created" msgstr "附件新增完毕" -#: lib/RT/Tickets_Overlay.pm:1189 +#: lib/RT/Tickets_Overlay.pm:1208 msgid "Attachment filename" msgstr "附件档名" -#: html/Ticket/Elements/ShowAttachments:25 html/Work/Tickets/Elements/ShowTransaction:32 +#: html/Ticket/Elements/ShowAttachments:25 html/Work/Tickets/Elements/ShowTransaction:37 msgid "Attachments" msgstr "附件" @@ -923,11 +926,11 @@ msgstr "自动驳回表单" msgid "AutoResolve" msgstr "自动完成表单处理" -#: etc/initialdata:224 +#: etc/initialdata:206 msgid "Autoreply" msgstr "自动回复" -#: etc/initialdata:90 +#: etc/initialdata:72 msgid "Autoreply To Requestors" msgstr "自动对申请人回复" @@ -935,7 +938,7 @@ msgstr "自动对申请人回复" msgid "AutoreplyToRequestors" msgstr "自动对申请人回复" -#: html/Edit/Rights/index.html:16 +#: html/Edit/Rights/index.html:17 msgid "Available Rights:" msgstr "权限项目列表:" @@ -964,19 +967,19 @@ msgstr "%1 的数据错误" msgid "Bad transaction number for attachment. %1 should be %2\\n" msgstr "附件的处理号码错误。%1 应为 %2\\n" -#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Edit/Global/autohandler:6 html/Edit/Queues/autohandler:17 html/Edit/Users/index.html:121 html/Ticket/Elements/Tabs:89 html/User/Elements/GroupTabs:37 +#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Edit/Global/autohandler:6 html/Edit/Queues/autohandler:21 html/Edit/Users/index.html:94 html/Ticket/Elements/Tabs:89 html/User/Elements/GroupTabs:37 msgid "Basics" msgstr "基本信息" -#: html/Ticket/Update.html:81 html/Work/Tickets/Update.html:49 +#: html/Ticket/Update.html:81 html/Work/Tickets/Update.html:53 msgid "Bcc" msgstr "密件副本" -#: html/Admin/Elements/EditScrip:87 html/Admin/Global/GroupRights.html:84 html/Admin/Global/Template.html:45 html/Admin/Global/UserRights.html:53 html/Admin/Global/Workflow.html:46 html/Admin/Groups/GroupRights.html:72 html/Admin/Groups/Members.html:80 html/Admin/Groups/Modify.html:55 html/Admin/Groups/UserRights.html:54 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:44 html/Admin/Queues/UserRights.html:53 html/Admin/Queues/Workflow.html:44 html/User/Groups/Modify.html:55 +#: html/Admin/Elements/EditScrip:95 html/Admin/Global/GroupRights.html:84 html/Admin/Global/Template.html:45 html/Admin/Global/UserRights.html:53 html/Admin/Global/Workflow.html:46 html/Admin/Groups/GroupRights.html:72 html/Admin/Groups/Members.html:80 html/Admin/Groups/Modify.html:55 html/Admin/Groups/UserRights.html:54 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:44 html/Admin/Queues/UserRights.html:53 html/Admin/Queues/Workflow.html:44 html/User/Groups/Modify.html:55 msgid "Be sure to save your changes" msgstr "请别忘了储存修改。" -#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:321 +#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:320 msgid "Before" msgstr "早于" @@ -988,11 +991,11 @@ msgstr "开始签核" msgid "Begin From " msgstr "起始日" -#: html/Edit/Users/Info:25 +#: NOT FOUND IN SOURCE msgid "Birthday" msgstr "生日" -#: etc/initialdata:220 +#: etc/initialdata:202 msgid "Blank" msgstr "空白模板" @@ -1016,7 +1019,7 @@ msgstr "事业部" msgid "Business Unit:" msgstr "事业部:" -#: lib/RT/User_Overlay.pm:1411 +#: lib/RT/User_Overlay.pm:1529 msgid "Can not modify system users" msgstr "无法更改系统使用者" @@ -1032,11 +1035,11 @@ msgstr "不能新增没有名称的自订字段值" msgid "Can't link a ticket to itself" msgstr "申请单不能链接自己。" -#: lib/RT/Ticket_Overlay.pm:2816 +#: lib/RT/Ticket_Overlay.pm:2857 msgid "Can't merge into a merged ticket. You should never get this error" msgstr "不能整合进已整合过的申请单。这个错误不该发生。" -#: lib/RT/Ticket_Overlay.pm:2634 lib/RT/Ticket_Overlay.pm:2703 +#: lib/RT/Ticket_Overlay.pm:2659 lib/RT/Ticket_Overlay.pm:2738 msgid "Can't specifiy both base and target" msgstr "不能同时指定起始申请单与目的申请单" @@ -1044,7 +1047,7 @@ msgstr "不能同时指定起始申请单与目的申请单" msgid "Cancel" msgstr "取消" -#: html/autohandler:113 +#: html/autohandler:126 #. ($msg) msgid "Cannot create user: %1" msgstr "无法新增使用者:%1" @@ -1061,7 +1064,7 @@ msgstr "分类管理" msgid "Category" msgstr "分类" -#: etc/initialdata:68 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:44 html/Ticket/Update.html:76 html/Work/Tickets/Update.html:43 lib/RT/ACE_Overlay.pm:87 +#: etc/initialdata:50 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:44 html/Ticket/Update.html:76 html/Work/Tickets/Elements/EditPeople:41 html/Work/Tickets/Elements/ShowLinks:6 html/Work/Tickets/Update.html:43 lib/RT/ACE_Overlay.pm:87 msgid "Cc" msgstr "副本" @@ -1081,11 +1084,11 @@ msgstr "修改申请单" msgid "Change password" msgstr "更改口令" -#: html/Edit/Global/Basic/Top:70 +#: html/Edit/Global/Basic/Top:79 msgid "ChangeOwnerUI" msgstr "可否选择表单承办人" -#: html/Ticket/Create.html:100 html/Ticket/Elements/EditCustomFieldEntries:35 html/Ticket/Update.html:90 html/Work/Tickets/Elements/ShowCustomFieldEntries:13 +#: html/SelfService/Update.html:39 html/Ticket/Create.html:100 html/Ticket/Elements/EditCustomFieldEntries:35 html/Ticket/Update.html:90 html/Work/Tickets/Elements/ShowCustomFieldEntries:14 msgid "Check box to delete" msgstr "选择欲删除的项目" @@ -1093,11 +1096,11 @@ msgstr "选择欲删除的项目" msgid "Check box to revoke right" msgstr "选择欲撤消的权利" -#: html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:42 html/Ticket/Elements/EditLinks:130 html/Ticket/Elements/EditLinks:68 html/Ticket/Elements/ShowLinks:56 html/Work/Search/BulkLinks:18 +#: html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:42 html/Ticket/Elements/EditLinks:113 html/Ticket/Elements/EditLinks:63 html/Ticket/Elements/ShowLinks:56 html/Work/Search/BulkLinks:18 html/Work/Tickets/Elements/EditLinks:117 html/Work/Tickets/Elements/EditLinks:56 html/Work/Tickets/Elements/ShowMembers:4 msgid "Children" msgstr "子申请单" -#: html/Edit/Elements/PickUsers:21 html/Edit/Global/UserRight/List:8 html/Edit/Global/UserRight/Top:19 html/Edit/Users/List:6 html/Edit/Users/Top:18 +#: html/Edit/Elements/PickUsers:21 html/Edit/Global/UserRight/List:8 html/Edit/Global/UserRight/Top:19 msgid "Chinese Name" msgstr "中文姓名" @@ -1105,11 +1108,15 @@ msgstr "中文姓名" msgid "Chinese/English" msgstr "中英文" -#: html/Admin/Elements/ModifyUser:79 html/Admin/Users/Modify.html:131 html/User/Prefs.html:91 html/Work/Preferences/Info:80 +#: html/Admin/Elements/ModifyUser:79 html/Admin/Users/Modify.html:131 html/User/Prefs.html:122 html/Work/Preferences/Info:83 msgid "City" msgstr "所在城市" -#: html/Ticket/Elements/ShowDates:46 +#: html/Edit/Elements/104Top:30 +msgid "ClassicUI" +msgstr "传统接口" + +#: html/Ticket/Elements/ShowDates:47 msgid "Closed" msgstr "已解决" @@ -1121,7 +1128,7 @@ msgstr "已解决的申请单" msgid "Closed tickets" msgstr "已解决的申请单" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:181 html/Edit/Global/Workflow/Action:58 html/Edit/Global/Workflow/Condition:51 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:181 html/Edit/Global/Workflow/Action:54 html/Edit/Global/Workflow/Condition:52 msgid "Code" msgstr "执行程序码" @@ -1129,7 +1136,7 @@ msgstr "执行程序码" msgid "Command not understood!\\n" msgstr "指令无法辨识!\\n" -#: html/Ticket/Elements/ShowTransaction:166 html/Ticket/Elements/Tabs:152 html/Work/Search/Bulk.html:89 html/Work/Tickets/Display.html:37 html/Work/Tickets/Elements/ShowTransaction:112 html/Work/Tickets/Elements/ShowTransaction:27 +#: html/Ticket/Elements/ShowTransaction:178 html/Ticket/Elements/Tabs:152 html/Work/Search/Bulk.html:89 html/Work/Tickets/Display.html:60 html/Work/Tickets/Elements/ShowTransaction:118 html/Work/Tickets/Elements/ShowTransaction:32 msgid "Comment" msgstr "评论" @@ -1149,7 +1156,7 @@ msgstr "对申请单提出评论" msgid "CommentOnTicket" msgstr "评论申请单" -#: html/Admin/Elements/ModifyUser:34 html/Work/Tickets/Update.html:59 +#: html/Admin/Elements/ModifyUser:34 html/Work/Tickets/Elements/AddContent:7 msgid "Comments" msgstr "评论" @@ -1166,11 +1173,11 @@ msgstr "评论(不送给申请人)" msgid "Comments about %1" msgstr "对 %1 的评论" -#: html/Admin/Users/Modify.html:184 html/Ticket/Elements/ShowRequestor:43 +#: html/Admin/Users/Modify.html:184 html/Edit/Users/Info:46 html/Ticket/Elements/ShowRequestor:43 msgid "Comments about this user" msgstr "使用者描述" -#: lib/RT/Transaction_Overlay.pm:543 +#: lib/RT/Transaction_Overlay.pm:501 msgid "Comments added" msgstr "新增评论完毕" @@ -1182,10 +1189,14 @@ msgstr "确认" msgid "Commit Stubbed" msgstr "消除更动完毕" -#: html/Edit/Users/Info:42 +#: NOT FOUND IN SOURCE msgid "Company Name" msgstr "公司名称" +#: html/Edit/Global/Basic/Top:85 +msgid "CompanySpecific" +msgstr "各公司独立显示" + #: NOT FOUND IN SOURCE msgid "Compile Restrictions" msgstr "设定查询条件" @@ -1198,11 +1209,11 @@ msgstr "条件" msgid "Condition matches..." msgstr "符合条件..." -#: lib/RT/Scrip_Overlay.pm:159 +#: lib/RT/Scrip_Overlay.pm:164 msgid "Condition not found" msgstr "未找到符合的现况" -#: html/Edit/Global/GroupRight/Top:26 html/Edit/Global/UserRight/Top:45 html/Edit/Groups/Member:57 html/Elements/Tabs:49 +#: html/Edit/Global/GroupRight/Top:26 html/Edit/Global/UserRight/Top:45 html/Edit/Groups/Member:56 html/Elements/Tabs:49 msgid "Configuration" msgstr "设定" @@ -1214,7 +1225,7 @@ msgstr "确认口令" msgid "Confirm Password" msgstr "口令确认" -#: html/Work/Approvals/Display.html:25 html/Work/Tickets/Create.html:153 html/Work/Tickets/Create.html:165 html/Work/Tickets/Update.html:81 +#: html/Work/Approvals/Display.html:25 html/Work/Tickets/Create.html:154 html/Work/Tickets/Create.html:168 html/Work/Tickets/Update.html:77 msgid "Confirm Submit" msgstr "确定送出" @@ -1238,7 +1249,7 @@ msgstr "内容" msgid "Coould not create group" msgstr "无法新增群组" -#: html/Edit/Elements/104Buttons:74 +#: html/Edit/Elements/104Buttons:85 msgid "Copy" msgstr "复制" @@ -1246,7 +1257,7 @@ msgstr "复制" msgid "Copy Field From:" msgstr "欲复制字段:" -#: etc/initialdata:282 +#: etc/initialdata:271 msgid "Correspondence" msgstr "回复" @@ -1254,7 +1265,7 @@ msgstr "回复" msgid "Correspondence Address" msgstr "申请单回复地址" -#: lib/RT/Transaction_Overlay.pm:539 +#: lib/RT/Transaction_Overlay.pm:497 msgid "Correspondence added" msgstr "新增申请单回复" @@ -1262,7 +1273,7 @@ msgstr "新增申请单回复" msgid "Correspondence not recorded" msgstr "未纪录申请单回复" -#: lib/RT/Ticket_Overlay.pm:3561 +#: lib/RT/Ticket_Overlay.pm:3608 msgid "Could not add new custom field value for ticket. " msgstr "不能新增自订字段的值 " @@ -1270,11 +1281,11 @@ msgstr "不能新增自订字段的值 " msgid "Could not add new custom field value for ticket. %1 " msgstr "不能新增自订字段的值。%1 " -#: lib/RT/Ticket_Overlay.pm:3067 lib/RT/Ticket_Overlay.pm:3075 lib/RT/Ticket_Overlay.pm:3092 +#: lib/RT/Ticket_Overlay.pm:3108 lib/RT/Ticket_Overlay.pm:3116 lib/RT/Ticket_Overlay.pm:3133 msgid "Could not change owner. " msgstr "不能更改承办人。 " -#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:165 html/Edit/Global/CustomField/index.html:117 +#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:164 html/Edit/Global/CustomField/index.html:120 #. ($msg) msgid "Could not create CustomField" msgstr "无法新增自订字段" @@ -1289,20 +1300,25 @@ msgstr "无法建立讯息通知" msgid "Could not create Template" msgstr "无法建立通知模板" -#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:473 lib/RT/Group_Overlay.pm:480 +#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:471 lib/RT/Group_Overlay.pm:478 msgid "Could not create group" msgstr "无法新增群组" +#: html/Edit/Elements/Index:89 +#. ($msg) +msgid "Could not create item" +msgstr "无法新增项目" + #: html/Admin/Global/Template.html:74 html/Admin/Queues/Template.html:71 #. ($msg) msgid "Could not create template: %1" msgstr "无法新增模板:%1" -#: lib/RT/Ticket_Overlay.pm:1081 lib/RT/Ticket_Overlay.pm:334 +#: lib/RT/Ticket_Overlay.pm:1118 lib/RT/Ticket_Overlay.pm:353 msgid "Could not create ticket. Queue not set" msgstr "无法新增申请单。尚未指定表单。" -#: lib/RT/User_Overlay.pm:267 lib/RT/User_Overlay.pm:279 lib/RT/User_Overlay.pm:297 lib/RT/User_Overlay.pm:481 +#: lib/RT/User_Overlay.pm:271 lib/RT/User_Overlay.pm:284 lib/RT/User_Overlay.pm:302 lib/RT/User_Overlay.pm:488 msgid "Could not create user" msgstr "无法新增使用者" @@ -1323,11 +1339,11 @@ msgstr "找不到编号 %1 的申请单" msgid "Could not find group %1." msgstr "找不到群组 %1。" -#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1430 +#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1448 msgid "Could not find or create that user" msgstr "找不到或无法新增该名使用者" -#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1509 +#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1527 msgid "Could not find that principal" msgstr "找不到该单位" @@ -1335,8 +1351,7 @@ msgstr "找不到该单位" msgid "Could not find user %1." msgstr "找不到使用者 %1。" -#: html/Admin/Groups/Members.html:87 html/Edit/Users/index.html:83 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 -#. ( . $GroupId) +#: html/Admin/Groups/Members.html:87 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 msgid "Could not load group" msgstr "无法加载群组" @@ -1345,7 +1360,7 @@ msgstr "无法加载群组" msgid "Could not make that principal a %1 for this queue" msgstr "无法将该单位设为此表单的 %1。" -#: lib/RT/Ticket_Overlay.pm:1451 +#: lib/RT/Ticket_Overlay.pm:1469 #. ($self->loc($args{'Type'})) msgid "Could not make that principal a %1 for this ticket" msgstr "无法将该单位设为此申请单的 %1。" @@ -1355,16 +1370,16 @@ msgstr "无法将该单位设为此申请单的 %1。" msgid "Could not remove that principal as a %1 for this queue" msgstr "无法将单位 %1 从表单移除。" -#: lib/RT/Ticket_Overlay.pm:1567 +#: lib/RT/Ticket_Overlay.pm:1585 #. ($args{'Type'}) msgid "Could not remove that principal as a %1 for this ticket" msgstr "无法将单位 %1 从申请单移除。" -#: lib/RT/Group_Overlay.pm:984 +#: lib/RT/Group_Overlay.pm:982 msgid "Couldn't add member to group" msgstr "无法新增成员至群组" -#: lib/RT/Ticket_Overlay.pm:3571 lib/RT/Ticket_Overlay.pm:3627 +#: lib/RT/Ticket_Overlay.pm:3618 lib/RT/Ticket_Overlay.pm:3674 #. ($Msg) msgid "Couldn't create a transaction: %1" msgstr "无法新增更动报告" @@ -1377,11 +1392,11 @@ msgstr "无法从 gpg 回函辨识出该采取的行动\\n" msgid "Couldn't find group\\n" msgstr "找不到群组\\n" -#: lib/RT/Interface/Web.pm:902 +#: lib/RT/Interface/Web.pm:962 msgid "Couldn't find row" msgstr "找不到此列数据" -#: lib/RT/Group_Overlay.pm:958 +#: lib/RT/Group_Overlay.pm:956 msgid "Couldn't find that principal" msgstr "找不到该单位" @@ -1414,9 +1429,10 @@ msgstr "无法加载 RT 设定档 '%1' %2" msgid "Couldn't load Scrips." msgstr "无法加载手续。" -#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 html/Edit/Global/GroupRight/Add.html:54 html/Edit/Global/UserRight/Add.html:23 html/Edit/Groups/Member:121 html/Edit/Groups/Members/Add.html:44 html/Edit/Rights/index.html:57 -#. ($Group) +#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 html/Edit/Global/GroupRight/Add.html:55 html/Edit/Global/GroupRight/Add.html:60 html/Edit/Global/UserRight/Add.html:25 html/Edit/Global/UserRight/Add.html:30 html/Edit/Groups/Member:120 html/Edit/Groups/Members/Add.html:43 html/Edit/Rights/index.html:58 html/Edit/Rights/index.html:63 #. ($ObjectGroup) +#. ($Report) +#. ($Group) #. ($id) msgid "Couldn't load group %1" msgstr "无法加载手续 %1" @@ -1425,12 +1441,12 @@ msgstr "无法加载手续 %1" msgid "Couldn't load link" msgstr "无法加载链接。" -#: html/Admin/Elements/EditCustomFields:146 html/Admin/Queues/People.html:120 +#: html/Admin/Elements/EditCustomFields:145 html/Admin/Queues/CustomFields.html:35 html/Admin/Queues/People.html:120 #. ($id) msgid "Couldn't load queue" msgstr "无法加载表单" -#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 html/Edit/Global/GroupRight/Add.html:50 html/Edit/Global/GroupRight/index.html:81 html/Edit/Global/UserRight/Add.html:19 html/Edit/Global/UserRight/index.html:83 html/Edit/Rights/index.html:53 +#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 html/Edit/Global/GroupRight/Add.html:51 html/Edit/Global/GroupRight/index.html:82 html/Edit/Global/GroupRight/index.html:87 html/Edit/Global/UserRight/Add.html:21 html/Edit/Global/UserRight/index.html:83 html/Edit/Global/UserRight/index.html:88 html/Edit/Rights/index.html:54 #. ($Queue) #. ($id) msgid "Couldn't load queue %1" @@ -1449,16 +1465,16 @@ msgstr "无法加载模板" msgid "Couldn't load that user (%1)" msgstr "无法加载该名使用者(%1)" -#: html/SelfService/Display.html:108 +#: html/SelfService/Display.html:114 #. ($id) msgid "Couldn't load ticket '%1'" msgstr "无法加载申请单 '%1'" -#: html/Admin/Elements/ModifyUser:85 html/Admin/Users/Modify.html:148 html/User/Prefs.html:97 html/Work/Preferences/Info:86 +#: html/Admin/Elements/ModifyUser:85 html/Admin/Users/Modify.html:148 html/User/Prefs.html:134 html/Work/Preferences/Info:89 msgid "Country" msgstr "国家" -#: html/Admin/Elements/CreateUserCalled:25 html/Edit/Elements/PopHeader:29 html/Edit/Global/GroupRight/Add.html:18 html/Ticket/Create.html:134 html/Ticket/Create.html:194 +#: html/Admin/Elements/CreateUserCalled:25 html/Edit/Elements/PopHeader:33 html/Edit/Global/GroupRight/Add.html:19 html/Ticket/Create.html:134 html/Ticket/Create.html:195 msgid "Create" msgstr "新增" @@ -1466,7 +1482,7 @@ msgstr "新增" msgid "Create Subgroup:" msgstr "新增子群组:" -#: etc/initialdata:145 +#: etc/initialdata:127 msgid "Create Tickets" msgstr "新增申请单" @@ -1523,7 +1539,7 @@ msgstr "新增模板" msgid "Create a new ticket" msgstr "新增申请单" -#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:240 +#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:242 msgid "Create a new user" msgstr "新增使用者" @@ -1572,7 +1588,7 @@ msgstr "新增失败:%1/%2/%3" msgid "Create new item" msgstr "建立新项目" -#: etc/initialdata:147 +#: etc/initialdata:129 msgid "Create new tickets based on this scrip's template" msgstr "依据此项手续内的模版,新增申请单" @@ -1608,7 +1624,7 @@ msgstr "新增、删除及更改使用者" msgid "CreateTicket" msgstr "新增申请单" -#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:26 lib/RT/Ticket_Overlay.pm:1175 +#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1212 msgid "Created" msgstr "新增日" @@ -1642,11 +1658,11 @@ msgstr "现有自订字段" msgid "Current Groups:" msgstr "现有群组列表:" -#: html/Ticket/Elements/EditLinks:27 +#: html/Ticket/Elements/EditLinks:27 html/Work/Tickets/Elements/EditLinks:10 msgid "Current Relationships" msgstr "现有关系" -#: html/Edit/Rights/index.html:19 +#: html/Edit/Rights/index.html:20 msgid "Current Rights:" msgstr "现有权限:" @@ -1654,7 +1670,7 @@ msgstr "现有权限:" msgid "Current Scrips" msgstr "现有手续" -#: html/Work/Tickets/Create.html:48 html/Work/Tickets/Elements/ShowBasics:39 +#: html/Work/Tickets/Create.html:49 html/Work/Tickets/Elements/ShowBasics:47 msgid "Current Status" msgstr "目前状态" @@ -1662,6 +1678,10 @@ msgstr "目前状态" msgid "Current Templates" msgstr "现有模板" +#: html/Work/Tickets/Elements/EditPeople:9 +msgid "Current Watchers" +msgstr "现有视察员" + #: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41 msgid "Current members" msgstr "现有成员" @@ -1674,7 +1694,7 @@ msgstr "现有权限" msgid "Current search criteria" msgstr "现有查询条件" -#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 +#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 html/Work/Tickets/Elements/EditPeople:32 msgid "Current watchers" msgstr "现有视察员" @@ -1683,7 +1703,7 @@ msgstr "现有视察员" msgid "Custom Field #%1" msgstr "自订字段 #%1" -#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Edit/Global/autohandler:7 html/Edit/Queues/autohandler:18 html/Ticket/Elements/ShowSummary:35 +#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Edit/Global/autohandler:7 html/Edit/Queues/autohandler:22 html/Ticket/Elements/ShowSummary:35 msgid "Custom Fields" msgstr "自订字段" @@ -1703,31 +1723,31 @@ msgstr "动作前执行程序" msgid "Custom condition" msgstr "自订条件" -#: lib/RT/Tickets_Overlay.pm:1618 +#: lib/RT/Tickets_Overlay.pm:1637 #. ($CF->Name , $args{OPERATOR} , $args{VALUE}) msgid "Custom field %1 %2 %3" msgstr "自订字段 %1 %2 %3" -#: lib/RT/Tickets_Overlay.pm:1613 +#: lib/RT/Tickets_Overlay.pm:1632 #. ($CF->Name) msgid "Custom field %1 has a value." msgstr "自订字段 %1 已有值" -#: lib/RT/Tickets_Overlay.pm:1610 +#: lib/RT/Tickets_Overlay.pm:1629 #. ($CF->Name) msgid "Custom field %1 has no value." msgstr "自订字段 %1 没有值" -#: lib/RT/Ticket_Overlay.pm:3463 +#: lib/RT/Ticket_Overlay.pm:3510 #. ($args{'Field'}) msgid "Custom field %1 not found" msgstr "找不到自订字段 %1" -#: html/Admin/Elements/EditCustomFields:196 +#: html/Admin/Elements/EditCustomFields:195 msgid "Custom field deleted" msgstr "自订字段已删除" -#: lib/RT/Ticket_Overlay.pm:3613 +#: lib/RT/Ticket_Overlay.pm:3660 msgid "Custom field not found" msgstr "找不到自订字段" @@ -1752,7 +1772,7 @@ msgstr "找不到自订字段值" msgid "Custom field value deleted" msgstr "自订字段值删除成功" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:145 html/Edit/Global/Workflow/Owner.html:90 lib/RT/Transaction_Overlay.pm:548 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:145 html/Edit/Global/Workflow/Owner.html:90 lib/RT/Transaction_Overlay.pm:505 lib/RT/Transaction_Vendor.pm:5 msgid "CustomField" msgstr "自订字段" @@ -1760,11 +1780,19 @@ msgstr "自订字段" msgid "Data error" msgstr "数据错误" +#: html/Edit/Global/Basic/Top:77 +msgid "DatabaseBindRemote" +msgstr "容许外部联机" + +#: html/Edit/Global/Basic/Top:75 +msgid "DatabaseName" +msgstr "MySQL数据库" + #: NOT FOUND IN SOURCE msgid "Date of Departure" msgstr "出发日期" -#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:92 html/Ticket/ModifyAll.html:43 html/Work/Tickets/Elements/ShowTransaction:14 +#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:92 html/Ticket/ModifyAll.html:43 html/Work/Tickets/Elements/ShowTransaction:17 msgid "Dates" msgstr "日期" @@ -1781,34 +1809,46 @@ msgid "December" msgstr "十二月" #: NOT FOUND IN SOURCE +msgid "Default Approval" +msgstr "预设签核" + +#: NOT FOUND IN SOURCE msgid "Default Autoresponse Template" msgstr "预设自动响应模板" -#: etc/initialdata:225 +#: etc/initialdata:207 msgid "Default Autoresponse template" msgstr "预设自动响应模板" -#: etc/initialdata:304 +#: html/Edit/Global/CustomField/Top:46 +msgid "Default Value" +msgstr "预设值" + +#: etc/initialdata:281 msgid "Default admin comment template" msgstr "预设管理员评论模板" -#: etc/initialdata:262 +#: etc/initialdata:260 msgid "Default admin correspondence template" msgstr "预设管理员回复模板" -#: etc/initialdata:283 +#: etc/initialdata:272 msgid "Default correspondence template" msgstr "预设回复模板" -#: etc/initialdata:240 +#: etc/initialdata:238 msgid "Default transaction template" msgstr "预设更动模板" -#: lib/RT/Transaction_Overlay.pm:643 +#: lib/RT/Transaction_Overlay.pm:491 #. ($type, $self->Field, $self->OldValue, $self->NewValue) msgid "Default: %1/%2 changed from %3 to %4" msgstr "预设:%1/%2 已自 %3 改为 %4" +#: NOT FOUND IN SOURCE +msgid "DefaultApproval" +msgstr "预设签核" + #: html/User/Delegation.html:24 html/User/Delegation.html:27 msgid "Delegate rights" msgstr "代表团权限" @@ -1837,7 +1877,7 @@ msgstr "代理表单:" msgid "Delegated Type" msgstr "代理表单种类" -#: html/Edit/Users/index.html:125 html/Work/Delegates/Info:31 html/Work/Delegates/List:8 html/Work/Elements/Tab:39 html/Work/Overview/Info:28 +#: html/Edit/Users/index.html:98 html/Work/Delegates/Info:31 html/Work/Delegates/List:8 html/Work/Elements/Tab:41 html/Work/Overview/Info:28 msgid "Delegates" msgstr "代理人" @@ -1881,10 +1921,14 @@ msgstr "代理人群组" msgid "Delegation Rights" msgstr "代理人权限" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:113 html/Edit/Elements/104Buttons:73 html/Work/Search/index.html:48 html/Work/Search/index.html:48 +#: html/Admin/Elements/EditScrips:53 html/Admin/Elements/ModifyTemplateAsWorkflow:113 html/Edit/Elements/104Buttons:84 html/Work/Search/index.html:48 html/Work/Search/index.html:48 msgid "Delete" msgstr "删除" +#: html/Admin/Elements/EditScrips:52 +msgid "Delete selected scrips" +msgstr "删除指定的手续" + #: lib/RT/Queue_Overlay.pm:88 msgid "Delete tickets" msgstr "删除申请单" @@ -1893,7 +1937,7 @@ msgstr "删除申请单" msgid "DeleteTicket" msgstr "删除申请单" -#: lib/RT/Transaction_Overlay.pm:187 +#: lib/RT/Transaction_Overlay.pm:136 msgid "Deleting this object could break referential integrity" msgstr "删除此对象可能破坏参考完整性" @@ -1901,7 +1945,7 @@ msgstr "删除此对象可能破坏参考完整性" msgid "Deleting this object would break referential integrity" msgstr "删除此对象可能破坏参考完整性" -#: lib/RT/User_Overlay.pm:497 +#: lib/RT/User_Overlay.pm:504 msgid "Deleting this object would violate referential integrity" msgstr "删除此对象会违反参考完整性" @@ -1921,11 +1965,11 @@ msgstr "驳回" msgid "Department" msgstr "部门" -#: html/Edit/Global/UserRight/List:12 html/Edit/Global/UserRight/Top:13 html/Edit/Users/List:10 html/Edit/Users/Top:12 +#: html/Edit/Global/UserRight/List:12 html/Edit/Global/UserRight/Top:13 msgid "Department ID" msgstr "部门代码" -#: html/Edit/Global/UserRight/List:11 html/Edit/Global/UserRight/Top:49 html/Edit/Users/List:9 html/Edit/Users/Top:48 html/Work/Delegates/Info:78 html/Work/Overview/Info:60 +#: html/Edit/Global/UserRight/List:11 html/Edit/Global/UserRight/Top:49 html/Work/Delegates/Info:78 html/Work/Overview/Info:60 msgid "Department Name" msgstr "部门名称" @@ -1949,7 +1993,7 @@ msgstr "请假单" msgid "Departure Until" msgstr "差旅截止日" -#: html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/EditLinks:122 html/Ticket/Elements/EditLinks:46 html/Ticket/Elements/ShowDependencies:31 html/Ticket/Elements/ShowLinks:36 html/Work/Search/BulkLinks:10 +#: html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/EditLinks:105 html/Ticket/Elements/EditLinks:44 html/Ticket/Elements/ShowDependencies:31 html/Ticket/Elements/ShowLinks:36 html/Work/Search/BulkLinks:10 html/Work/Tickets/Elements/EditLinks:109 html/Work/Tickets/Elements/EditLinks:34 html/Work/Tickets/Elements/ShowLinks:21 msgid "Depended on by" msgstr "可接续处理的申请单" @@ -1957,7 +2001,27 @@ msgstr "可接续处理的申请单" msgid "Dependencies: \\n" msgstr "附属性:\\n" -#: html/Elements/SelectLinkType:26 html/Ticket/Create.html:179 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/EditLinks:118 html/Ticket/Elements/EditLinks:35 html/Ticket/Elements/ShowDependencies:24 html/Ticket/Elements/ShowLinks:26 html/Work/Search/BulkLinks:6 +#: lib/RT/Transaction_Overlay.pm:585 +#. ($value) +msgid "Dependency by %1 added" +msgstr "已加入可接续处理的申请单 %1" + +#: lib/RT/Transaction_Overlay.pm:622 +#. ($value) +msgid "Dependency by %1 deleted" +msgstr "已移除可接续处理的申请单 %1" + +#: lib/RT/Transaction_Overlay.pm:582 +#. ($value) +msgid "Dependency on %1 added" +msgstr "已加入需先处理的申请单 %1" + +#: lib/RT/Transaction_Overlay.pm:619 +#. ($value) +msgid "Dependency on %1 deleted" +msgstr "已移除需先处理的申请单 %1" + +#: html/Elements/SelectLinkType:26 html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/EditLinks:101 html/Ticket/Elements/EditLinks:35 html/Ticket/Elements/ShowDependencies:24 html/Ticket/Elements/ShowLinks:26 html/Work/Search/BulkLinks:6 html/Work/Tickets/Elements/EditLinks:105 html/Work/Tickets/Elements/EditLinks:23 html/Work/Tickets/Elements/ShowLinks:16 msgid "Depends on" msgstr "需先处理" @@ -1973,7 +2037,7 @@ msgstr "递减" msgid "Describe the issue below" msgstr "在以下字段描述主题" -#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:33 html/Admin/Elements/ModifyQueue:35 html/Admin/Elements/ModifyTemplate:35 html/Admin/Elements/ModifyTemplateAsWorkflow:192 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Edit/Global/Workflow/Action:14 html/Elements/SelectGroups:26 html/User/Groups/Modify.html:48 html/Work/Preferences/Info:98 +#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:33 html/Admin/Elements/ModifyQueue:35 html/Admin/Elements/ModifyTemplate:35 html/Admin/Elements/ModifyTemplateAsWorkflow:192 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Edit/Elements/SelectQueues:4 html/Edit/Global/Workflow/Action:13 html/Elements/SelectGroups:26 html/User/Groups/Modify.html:48 msgid "Description" msgstr "描述" @@ -1985,7 +2049,7 @@ msgstr "经办业务说明" msgid "Description:" msgstr "描述:" -#: html/Work/Tickets/Create.html:108 html/Work/Tickets/Elements/EditCustomFields:39 html/Work/Tickets/Elements/ShowCustomFields:41 +#: html/Work/Tickets/Create.html:132 html/Work/Tickets/Create.html:84 html/Work/Tickets/Elements/EditCustomFields:13 html/Work/Tickets/Elements/EditCustomFields:61 html/Work/Tickets/Elements/ShowCustomFields:14 html/Work/Tickets/Elements/ShowCustomFields:53 msgid "Details" msgstr "细节" @@ -1993,15 +2057,15 @@ msgstr "细节" msgid "Direct" msgstr "直接" -#: html/Edit/Users/Info:31 +#: NOT FOUND IN SOURCE msgid "Disability" msgstr "残障身分" -#: html/Edit/Users/Info:29 +#: NOT FOUND IN SOURCE msgid "Disability Type" msgstr "残障类别" -#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:19 html/Edit/Queues/Basic/Top:70 html/Edit/Queues/List:13 html/Work/Delegates/Info:48 html/Work/Delegates/Info:53 html/Work/Delegates/List:12 html/Work/Overview/Info:42 +#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:19 html/Edit/Queues/Basic/Top:69 html/Edit/Queues/List:15 html/Edit/Queues/List:27 html/Work/Delegates/Info:48 html/Work/Delegates/Info:53 html/Work/Delegates/List:12 html/Work/Overview/Info:42 msgid "Disabled" msgstr "停用" @@ -2037,7 +2101,7 @@ msgstr "允许一切操作" msgid "Don't refresh this page." msgstr "不更新此页面。" -#: html/Search/Elements/PickRestriction:113 html/Work/Search/PickRestriction:95 +#: html/Search/Elements/PickRestriction:113 html/Work/Search/PickRestriction:101 msgid "Don't show search results" msgstr "不显示查询结果" @@ -2045,7 +2109,7 @@ msgstr "不显示查询结果" msgid "Down" msgstr "下一页" -#: html/Ticket/Elements/ShowTransaction:92 +#: html/Ticket/Elements/ShowTransaction:103 msgid "Download" msgstr "下载" @@ -2053,7 +2117,7 @@ msgstr "下载" msgid "Dr." msgstr "博士" -#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:42 lib/RT/Ticket_Overlay.pm:1179 +#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:43 html/Work/Tickets/Elements/EditBasics:54 lib/RT/Ticket_Overlay.pm:1216 msgid "Due" msgstr "到期日" @@ -2070,7 +2134,7 @@ msgstr "无法解读日期 '%1'" msgid "ERROR: Couldn't load ticket '%1': %2.\\n" msgstr "无法加载申请单 '%1':%2.\\n" -#: html/Work/Tickets/Update.html:46 +#: html/Work/Tickets/Update.html:47 msgid "Edit" msgstr "编辑" @@ -2078,7 +2142,7 @@ msgstr "编辑" msgid "Edit Conditions" msgstr "编辑前置条件" -#: html/Admin/Queues/CustomFields.html:44 +#: html/Admin/Queues/CustomFields.html:45 #. ($Queue->Name) msgid "Edit Custom Fields for %1" msgstr "编辑 %1 的自订字段" @@ -2172,15 +2236,19 @@ msgstr "最高学历" msgid "EffectiveId" msgstr "有效编号" -#: lib/RT/Ticket_Overlay.pm:2644 lib/RT/Ticket_Overlay.pm:2712 +#: lib/RT/Ticket_Overlay.pm:2673 lib/RT/Ticket_Overlay.pm:2751 msgid "Either base or target must be specified" msgstr "需要指定起始申请单或目的申请单" -#: html/Admin/Users/Modify.html:52 html/Admin/Users/Prefs.html:45 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:41 html/Work/Delegates/Info:96 html/Work/Overview/Info:78 html/Work/Preferences/Info:16 +#: html/Admin/Users/Modify.html:52 html/Admin/Users/Prefs.html:45 html/Edit/Elements/SelectUsers:4 html/Edit/Users/List:7 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:43 html/Work/Delegates/Info:96 html/Work/Overview/Info:78 msgid "Email" msgstr "电子邮件信箱" -#: lib/RT/User_Overlay.pm:247 +#: html/Work/Preferences/Info:16 +msgid "Email Address" +msgstr "电子邮件信箱" + +#: lib/RT/User_Overlay.pm:251 msgid "Email address in use" msgstr "此电子邮件信箱已被使用" @@ -2220,11 +2288,11 @@ msgstr "启用(取消勾选将停用此群组)" msgid "Enabled (Unchecking this box disables this queue)" msgstr "启用(取消勾选将停用此表单)" -#: html/Admin/Elements/EditCustomFields:98 +#: html/Admin/Elements/EditCustomFields:97 msgid "Enabled Custom Fields" msgstr "已启用的自订字段" -#: html/Edit/Queues/Basic/Top:75 html/Edit/Queues/List:15 +#: html/Edit/Queues/Basic/Top:74 html/Edit/Queues/List:17 html/Edit/Queues/List:29 msgid "Enabled Date" msgstr "启用日期" @@ -2236,16 +2304,16 @@ msgstr "激活日期:" msgid "Enabled Queues" msgstr "已启用的表单" -#: html/Edit/Queues/Basic/Top:66 html/Edit/Queues/List:11 +#: html/Edit/Queues/Basic/Top:65 html/Edit/Queues/List:13 html/Edit/Queues/List:25 msgid "Enabled Status" msgstr "启用状态" -#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:282 html/User/Groups/Modify.html:116 +#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:284 html/User/Groups/Modify.html:116 #. (loc_fuzzy($msg)) msgid "Enabled status %1" msgstr "启用状态 %1" -#: html/Edit/Users/Info:35 +#: NOT FOUND IN SOURCE msgid "End of Trial" msgstr "试用期满日" @@ -2265,7 +2333,7 @@ msgstr "输入下列单一或复式条件,查询用户数据" msgid "Enter one value" msgstr "键入单一项目" -#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:111 html/Work/Search/Bulk.html:95 +#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:94 html/Work/Search/Bulk.html:95 html/Work/Tickets/Elements/EditLinks:98 msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." msgstr "输入申请单可链接到的申请单编号或网址。以空白隔开。" @@ -2317,15 +2385,15 @@ msgstr "表单->新增视察员的参数有误" msgid "Error in parameters to Queue->DelWatcher" msgstr "表单->删除视察员的参数有误" -#: lib/RT/Ticket_Overlay.pm:1364 +#: lib/RT/Ticket_Overlay.pm:1401 msgid "Error in parameters to Ticket->AddWatcher" msgstr "申请单->新增视察员的参数有误" -#: lib/RT/Ticket_Overlay.pm:1540 +#: lib/RT/Ticket_Overlay.pm:1558 msgid "Error in parameters to Ticket->DelWatcher" msgstr "申请单->删除视察员的参数有误" -#: etc/initialdata:38 +#: etc/initialdata:20 msgid "Everyone" msgstr "所有人" @@ -2333,7 +2401,11 @@ msgstr "所有人" msgid "Example:" msgstr "范例:" -#: html/Edit/Elements/104Buttons:77 +#: NOT FOUND IN SOURCE +msgid "Existing user renamed from %1 to %2" +msgstr "现有使用者 %1 已改名为 %2" + +#: html/Edit/Elements/104Buttons:88 msgid "Export" msgstr "汇出" @@ -2345,31 +2417,31 @@ msgstr "外部认证帐号" msgid "ExternalContactInfoId" msgstr "外部联络方式帐号" -#: html/Edit/Global/Basic/Top:64 +#: html/Edit/Global/Basic/Top:69 msgid "ExternalDatabaseDSN" msgstr "外部数据库连结字符串" -#: html/Edit/Global/Basic/Top:68 +#: html/Edit/Global/Basic/Top:73 msgid "ExternalDatabasePass" msgstr "外部数据库口令" -#: html/Edit/Global/Basic/Top:66 +#: html/Edit/Global/Basic/Top:71 msgid "ExternalDatabaseUser" msgstr "外部数据库用户" -#: html/Edit/Global/Basic/Top:62 +#: html/Edit/Global/Basic/Top:67 msgid "ExternalURL" msgstr "外部接口网址" -#: html/Admin/Users/Modify.html:72 +#: html/Admin/Users/Modify.html:72 html/Edit/Users/Info:41 msgid "Extra info" msgstr "备注" -#: lib/RT/User_Overlay.pm:361 +#: lib/RT/User_Overlay.pm:368 msgid "Failed to find 'Privileged' users pseudogroup." msgstr "找不到「内部成员」虚拟群组的使用者。" -#: lib/RT/User_Overlay.pm:368 +#: lib/RT/User_Overlay.pm:375 msgid "Failed to find 'Unprivileged' users pseudogroup" msgstr "找不到「非内部成员」虚拟群组的使用者。" @@ -2394,22 +2466,22 @@ msgstr "二月" msgid "Female" msgstr "女" -#: html/Edit/Global/CustomField/List:5 html/Edit/Global/CustomField/Top:9 -msgid "Field Attribute" -msgstr "字段属性" - #: html/Edit/Global/CustomField/Info:14 msgid "Field Content:" msgstr "字段内容:" -#: html/Edit/Global/CustomField/List:7 html/Edit/Global/CustomField/Top:21 +#: html/Edit/Global/CustomField/List:7 html/Edit/Global/CustomField/Top:20 msgid "Field Description" msgstr "字段描述" -#: html/Edit/Global/CustomField/List:6 html/Edit/Global/CustomField/Top:15 +#: html/Edit/Global/CustomField/List:6 html/Edit/Global/CustomField/Top:14 msgid "Field Name" msgstr "字段名称" +#: html/Edit/Global/CustomField/List:5 html/Edit/Global/CustomField/Top:9 +msgid "Field Type" +msgstr "字段属性" + #: html/Edit/Elements/PickUsers:52 html/Edit/Users/Add.html:47 msgid "Filter" msgstr "筛选" @@ -2426,19 +2498,19 @@ msgstr "筛选列表:" msgid "Fin" msgstr "最终" -#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 lib/RT/Tickets_Overlay.pm:1091 +#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 html/Work/Tickets/Elements/EditBasics:52 lib/RT/Tickets_Overlay.pm:1110 msgid "Final Priority" -msgstr "最低顺位" +msgstr "最终顺位" -#: lib/RT/Ticket_Overlay.pm:1170 +#: lib/RT/Ticket_Overlay.pm:1207 msgid "FinalPriority" -msgstr "最低顺位" +msgstr "最终顺位" #: NOT FOUND IN SOURCE msgid "Financial Department:" msgstr "财务部:" -#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 +#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 html/Work/Tickets/Elements/EditPeople:18 msgid "Find group whose" msgstr "寻找群组的" @@ -2446,10 +2518,14 @@ msgstr "寻找群组的" msgid "Find new/open tickets" msgstr "寻找/开启申请单" -#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29 +#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Edit/Users/Top:6 html/Ticket/Elements/EditPeople:29 html/Work/Tickets/Elements/EditPeople:14 msgid "Find people whose" msgstr "寻找人员的" +#: html/Edit/Queues/Top:6 +msgid "Find queues whose" +msgstr "寻找表单的" + #: html/Search/Listing.html:107 html/Work/Search/index.html:88 msgid "Find tickets" msgstr "寻找申请单" @@ -2474,7 +2550,7 @@ msgstr "一" msgid "First-level Admins" msgstr "一阶主管" -#: html/Edit/Users/Info:40 +#: NOT FOUND IN SOURCE msgid "First-level Users" msgstr "一阶主管员工" @@ -2482,17 +2558,17 @@ msgstr "一阶主管员工" msgid "Fixed shift" msgstr "固定班" -#: docs/design_docs/string-extraction-guide.txt:33 +#: docs/design_docs/string-extraction-guide.txt:33 lib/RT/StyleGuide.pod:746 msgid "Foo Bar Baz" msgstr "甲 乙 丙" -#: docs/design_docs/string-extraction-guide.txt:24 +#: docs/design_docs/string-extraction-guide.txt:24 lib/RT/StyleGuide.pod:737 msgid "Foo!" msgstr "甲!" #: html/Search/Bulk.html:86 html/Work/Search/Bulk.html:55 msgid "Force change" -msgstr "强制更新" +msgstr "强制更换" #: html/Work/Elements/104Header:89 msgid "Form Processing" @@ -2503,7 +2579,7 @@ msgstr "电子表单作业区" msgid "Found %quant(%1,ticket)" msgstr "找到 %1 张申请单" -#: lib/RT/Interface/Web.pm:904 +#: lib/RT/Interface/Web.pm:964 msgid "Found Object" msgstr "已找到对象" @@ -2559,7 +2635,7 @@ msgstr "完整标头档" msgid "Gecos" msgstr "登入帐号" -#: html/Edit/Users/Info:26 +#: NOT FOUND IN SOURCE msgid "Gender" msgstr "性别" @@ -2567,7 +2643,7 @@ msgstr "性别" msgid "Getting the current user from a pgp sig\\n" msgstr "取得目前使用者的 pgp 签章\\n" -#: lib/RT/Transaction_Overlay.pm:593 +#: lib/RT/Transaction_Overlay.pm:551 #. ($New->Name) msgid "Given to %1" msgstr "交予 %1" @@ -2577,6 +2653,10 @@ msgid "Global" msgstr "全域设定" #: NOT FOUND IN SOURCE +msgid "Global Approval" +msgstr "全域签核" + +#: NOT FOUND IN SOURCE msgid "Global Keyword Selections" msgstr "全域关键词选取" @@ -2588,7 +2668,7 @@ msgstr "拥有全域权限列表:" msgid "Global Scrips" msgstr "全域手续" -#: html/Edit/Elements/Tab:38 +#: html/Edit/Elements/Tab:40 msgid "Global Setup" msgstr "全域设定" @@ -2597,7 +2677,11 @@ msgstr "全域设定" msgid "Global template: %1" msgstr "全域模板:%1" -#: html/Admin/Elements/EditCustomFields:74 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/index.html:40 +#: NOT FOUND IN SOURCE +msgid "GlobalApproval" +msgstr "全域签核" + +#: html/Admin/Elements/EditCustomFields:73 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/Work/Tickets/Elements/EditPeople:16 html/Work/Tickets/Elements/EditPeople:20 html/index.html:40 msgid "Go!" msgstr "执行" @@ -2625,6 +2709,10 @@ msgstr "群组" msgid "Group %1 %2: %3" msgstr "群组 %1 %2:%3" +#: NOT FOUND IN SOURCE +msgid "Group Admin" +msgstr "群组管理员" + #: html/Edit/Global/GroupRight/List:5 html/Edit/Global/GroupRight/Top:20 html/Edit/Groups/List:7 msgid "Group Description" msgstr "群组描述" @@ -2637,7 +2725,7 @@ msgstr "群组管理" msgid "Group Members" msgstr "群组成员" -#: html/Edit/Elements/PickUsers:28 html/Edit/Global/GroupRight/List:4 html/Edit/Global/GroupRight/Top:10 html/Edit/Groups/List:6 html/Edit/Groups/Top:7 html/Edit/Users/Add.html:29 html/Edit/Users/Group:10 html/Edit/Users/Search.html:43 html/Work/Delegates/Add.html:15 html/Work/Tickets/Cc:24 +#: html/Edit/Elements/PickUsers:28 html/Edit/Global/GroupRight/List:4 html/Edit/Global/GroupRight/Top:10 html/Edit/Groups/List:6 html/Edit/Groups/Top:7 html/Edit/Queues/Basic/Add.html:15 html/Edit/Users/Add.html:29 html/Edit/Users/Group:10 html/Edit/Users/Search.html:43 html/Work/Delegates/Add.html:15 html/Work/Tickets/Cc:24 msgid "Group Name" msgstr "群组名称" @@ -2645,7 +2733,7 @@ msgstr "群组名称" msgid "Group Name:" msgstr "群组名称:" -#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 html/Edit/Global/autohandler:12 html/Edit/Queues/autohandler:23 html/Edit/Users/Group:11 html/Edit/Users/index.html:123 +#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 html/Edit/Global/autohandler:12 html/Edit/Queues/autohandler:27 html/Edit/Users/Group:11 html/Edit/Users/index.html:96 msgid "Group Rights" msgstr "群组权限" @@ -2653,7 +2741,7 @@ msgstr "群组权限" msgid "Group Rights:" msgstr "拥有群组权限列表:" -#: html/Edit/Elements/Tab:34 +#: html/Edit/Elements/Tab:36 msgid "Group Setup" msgstr "群组设定" @@ -2661,7 +2749,7 @@ msgstr "群组设定" msgid "Group Status" msgstr "群组状态" -#: lib/RT/Group_Overlay.pm:964 +#: lib/RT/Group_Overlay.pm:962 msgid "Group already has member" msgstr "群组内已有此成员" @@ -2674,15 +2762,19 @@ msgstr "无法新增群组" msgid "Group could not be created: %1" msgstr "无法新增群组:%1" -#: lib/RT/Group_Overlay.pm:496 +#: lib/RT/Group_Overlay.pm:494 msgid "Group created" msgstr "群组新增完毕" -#: lib/RT/Group_Overlay.pm:1132 +#: NOT FOUND IN SOURCE +msgid "Group created: %1" +msgstr "群组 %1 新增完毕" + +#: lib/RT/Group_Overlay.pm:1134 msgid "Group has no such member" msgstr "群组没有这个成员" -#: lib/RT/Group_Overlay.pm:944 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1437 lib/RT/Ticket_Overlay.pm:1515 +#: lib/RT/Group_Overlay.pm:942 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1455 lib/RT/Ticket_Overlay.pm:1533 msgid "Group not found" msgstr "找不到群组" @@ -2695,6 +2787,14 @@ msgid "Group not specified.\\n" msgstr "未指定群组。\\n" #: NOT FOUND IN SOURCE +msgid "Group redescribed from %1 to %2" +msgstr "群组描述 %1 已改为 %2" + +#: NOT FOUND IN SOURCE +msgid "Group renamed from %1 to %2" +msgstr "群组 %1 已改名为 %2" + +#: NOT FOUND IN SOURCE msgid "Group with Queue Rights" msgstr "拥有表单权限群组" @@ -2706,11 +2806,11 @@ msgstr "群组之" msgid "Group:" msgstr "群组:" -#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/Edit/Global/GroupRight/Add.html:15 html/User/Groups/Members.html:66 +#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/Edit/Global/GroupRight/Add.html:16 html/Edit/Groups/Admin:12 html/User/Groups/Members.html:66 msgid "Groups" msgstr "群组" -#: lib/RT/Group_Overlay.pm:970 +#: lib/RT/Group_Overlay.pm:968 msgid "Groups can't be members of their members" msgstr "不能将群组设为群组内成员" @@ -2722,7 +2822,7 @@ msgstr "拥有全域权限群组" msgid "HRMSDefined" msgstr "组织架构" -#: html/Edit/Users/Info:32 +#: NOT FOUND IN SOURCE msgid "Health Insurance" msgstr "健保补助身份" @@ -2730,19 +2830,23 @@ msgstr "健保补助身份" msgid "Hello!" msgstr "嗨!" -#: docs/design_docs/string-extraction-guide.txt:40 +#: docs/design_docs/string-extraction-guide.txt:40 lib/RT/StyleGuide.pod:753 #. ($name) msgid "Hello, %1" msgstr "嗨,%1" -#: html/Edit/Elements/104Top:27 +#: html/Edit/Elements/104Top:28 msgid "Help" -msgstr "辅助说明" +msgstr "说明" #: NOT FOUND IN SOURCE msgid "Help Desks" msgstr "各项业务窗口" +#: html/Edit/Global/CustomField/SelectWritable:9 html/Edit/Queues/Basic/Top:80 +msgid "Hidden" +msgstr "隐藏" + #: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:87 html/Work/Tickets/Elements/ShowHistory:8 msgid "History" msgstr "纪录" @@ -2751,7 +2855,7 @@ msgstr "纪录" msgid "HomePhone" msgstr "住处电话" -#: html/Edit/Elements/104Top:15 html/Edit/Elements/104Top:23 html/Edit/Elements/EDOMHeader:9 html/Elements/Tabs:43 +#: html/Edit/Elements/104Top:15 html/Edit/Elements/104Top:24 html/Edit/Elements/EDOMHeader:9 html/Elements/Tabs:43 msgid "Homepage" msgstr "主页" @@ -2759,7 +2863,7 @@ msgstr "主页" msgid "Hotel Expense" msgstr "住宿费" -#: lib/RT/Base.pm:73 +#: lib/RT/Base.pm:75 #. (6) msgid "I have %quant(%1,concrete mixer)." msgstr "我有 %quant(%1,份固体搅拌器)。" @@ -2772,7 +2876,7 @@ msgstr "身分证号" msgid "ID Type" msgstr "身分类别" -#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1018 +#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1037 msgid "Id" msgstr "编号" @@ -2780,7 +2884,7 @@ msgstr "编号" msgid "Identity" msgstr "身份" -#: etc/initialdata:439 etc/upgrade/2.1.71:86 html/Edit/Elements/CreateApprovalsQueue:58 +#: etc/initialdata:411 etc/upgrade/2.1.71:86 html/Edit/Elements/CreateApprovalsQueue:58 msgid "If an approval is rejected, reject the original and delete pending approvals" msgstr "若签核单遭到驳回,则连带驳回原申请单,并删除其它相关的待签核事项" @@ -2792,43 +2896,43 @@ msgstr "如果此工具程序为 setgid,恶意的本地端用户即能由此 msgid "If you've updated anything above, be sure to" msgstr "若您已更新以上数据,请记得按一下" -#: lib/RT/Interface/Web.pm:896 +#: lib/RT/Interface/Web.pm:956 msgid "Illegal value for %1" msgstr "%1 的值错误" -#: lib/RT/Interface/Web.pm:899 +#: lib/RT/Interface/Web.pm:959 msgid "Immutable field" msgstr "此字段值不可更动" -#: html/Edit/Elements/104Buttons:76 html/Edit/Global/Workflow/Import.html:2 +#: html/Edit/Elements/104Buttons:87 html/Edit/Global/Workflow/Import.html:2 msgid "Import" msgstr "汇入" -#: html/Admin/Elements/EditCustomFields:73 +#: html/Admin/Elements/EditCustomFields:72 msgid "Include disabled custom fields in listing." msgstr "列出停用的自订字段" -#: html/Admin/Queues/index.html:42 html/Edit/Queues/index.html:38 +#: html/Admin/Queues/index.html:42 html/Edit/Queues/Top:9 msgid "Include disabled queues in listing." msgstr "列出停用的表单" -#: html/Admin/Users/index.html:46 html/Edit/Users/Search.html:62 +#: html/Admin/Users/index.html:46 html/Edit/Users/Search.html:62 html/Edit/Users/Top:9 msgid "Include disabled users in search." msgstr "列出停用的使用者" -#: html/Edit/Users/Info:37 +#: NOT FOUND IN SOURCE msgid "Indirect Employee" msgstr "直接/间接员工" -#: lib/RT/Tickets_Overlay.pm:1067 +#: lib/RT/Tickets_Overlay.pm:1086 msgid "Initial Priority" -msgstr "初始优先权" +msgstr "初始优先顺位" -#: lib/RT/Ticket_Overlay.pm:1169 lib/RT/Ticket_Overlay.pm:1171 +#: lib/RT/Ticket_Overlay.pm:1206 lib/RT/Ticket_Overlay.pm:1208 msgid "InitialPriority" -msgstr "初始优先权" +msgstr "初始优先顺位" -#: lib/RT/ScripAction_Overlay.pm:104 +#: lib/RT/ScripAction_Overlay.pm:105 msgid "Input error" msgstr "输入错误" @@ -2836,7 +2940,7 @@ msgstr "输入错误" msgid "Interest noted" msgstr "登记成功" -#: lib/RT/Ticket_Overlay.pm:3835 +#: lib/RT/Ticket_Overlay.pm:3913 msgid "Internal Error" msgstr "内部错误" @@ -2845,11 +2949,11 @@ msgstr "内部错误" msgid "Internal Error: %1" msgstr "内部错误:%1" -#: lib/RT/Group_Overlay.pm:643 +#: lib/RT/Group_Overlay.pm:641 msgid "Invalid Group Type" msgstr "错误的群组类别" -#: lib/RT/Principal_Overlay.pm:126 +#: lib/RT/Principal_Overlay.pm:127 msgid "Invalid Right" msgstr "错误的权限" @@ -2857,15 +2961,15 @@ msgstr "错误的权限" msgid "Invalid Type" msgstr "错误的类型" -#: lib/RT/Interface/Web.pm:901 +#: lib/RT/Interface/Web.pm:961 msgid "Invalid data" msgstr "错误的数据" -#: lib/RT/Ticket_Overlay.pm:439 +#: lib/RT/Ticket_Overlay.pm:463 msgid "Invalid owner. Defaulting to 'nobody'." msgstr "错误的承办人。改为预设承办人「nobody」。" -#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:250 +#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:251 msgid "Invalid queue" msgstr "错误的表单" @@ -2878,11 +2982,11 @@ msgstr "错误的权限" msgid "Invalid value for %1" msgstr "%1 的值错误" -#: lib/RT/Ticket_Overlay.pm:3470 +#: lib/RT/Ticket_Overlay.pm:3517 msgid "Invalid value for custom field" msgstr "错误的自订字段值" -#: lib/RT/Ticket_Overlay.pm:346 +#: lib/RT/Ticket_Overlay.pm:365 msgid "Invalid value for status" msgstr "错误的状态值" @@ -2940,7 +3044,7 @@ msgstr "七月" #: lib/RT/Date.pm:417 msgid "Jul." -msgstr "01" +msgstr "07" #: NOT FOUND IN SOURCE msgid "July" @@ -2956,7 +3060,7 @@ msgstr "六月" #: lib/RT/Date.pm:416 msgid "Jun." -msgstr "06." +msgstr "06" #: NOT FOUND IN SOURCE msgid "June" @@ -2966,6 +3070,18 @@ msgstr "六月" msgid "Keyword" msgstr "关键词" +#: lib/RT/CustomField_Vendor.pm:23 +msgid "LabelAttachments" +msgstr "附件卷标" + +#: lib/RT/CustomField_Vendor.pm:24 +msgid "LabelContent" +msgstr "内容卷标" + +#: lib/RT/CustomField_Vendor.pm:22 +msgid "LabelSubject" +msgstr "主题卷标" + #: lib/RT/CustomField_Vendor.pm:21 msgid "LabelURL" msgstr "链接卷标" @@ -2974,11 +3090,15 @@ msgstr "链接卷标" msgid "Lang" msgstr "使用语言" +#: html/User/Prefs.html:54 html/Work/Preferences/Info:29 +msgid "Language" +msgstr "语言" + #: html/Ticket/Elements/Tabs:72 msgid "Last" msgstr "上次更新" -#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:38 +#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:39 html/Work/Tickets/Elements/EditBasics:44 msgid "Last Contact" msgstr "上次联络" @@ -3002,11 +3122,11 @@ msgstr "上次更新" msgid "Left" msgstr "剩馀时间" -#: html/Admin/Users/Modify.html:82 +#: html/Admin/Users/Modify.html:82 html/Edit/Users/Info:62 msgid "Let this user access RT" msgstr "允许这名使用者登入" -#: html/Admin/Users/Modify.html:86 +#: html/Admin/Users/Modify.html:86 html/Edit/Users/Info:68 msgid "Let this user be granted rights" msgstr "内部成员(具有个人权限)" @@ -3022,25 +3142,25 @@ msgstr "限制表单为 %1 到 %2" msgid "Link a Queue" msgstr "申请表单连结" -#: lib/RT/Ticket_Overlay.pm:2726 +#: lib/RT/Ticket_Overlay.pm:2765 msgid "Link already exists" msgstr "此链接已存在" -#: lib/RT/Ticket_Overlay.pm:2738 +#: lib/RT/Ticket_Overlay.pm:2777 msgid "Link could not be created" msgstr "无法新增链接" -#: lib/RT/Ticket_Overlay.pm:2746 lib/RT/Ticket_Overlay.pm:2756 +#: lib/RT/Ticket_Overlay.pm:2785 lib/RT/Ticket_Overlay.pm:2797 #. ($TransString) msgid "Link created (%1)" msgstr "链接(%1)新增完毕" -#: lib/RT/Ticket_Overlay.pm:2667 +#: lib/RT/Ticket_Overlay.pm:2698 #. ($TransString) msgid "Link deleted (%1)" msgstr "链接(%1)删除完毕" -#: lib/RT/Ticket_Overlay.pm:2673 +#: lib/RT/Ticket_Overlay.pm:2704 msgid "Link not found" msgstr "找不到链接" @@ -3061,33 +3181,33 @@ msgstr "链接" msgid "List All Users" msgstr "列出所有用户数据" -#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:84 html/Work/Preferences/Info:72 +#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:107 html/Work/Preferences/Info:75 msgid "Location" msgstr "位置" -#: lib/RT.pm:162 +#: lib/RT.pm:174 #. ($RT::LogDir) msgid "Log directory %1 not found or couldn't be written.\\n RT can't run." msgstr "登入目录 %1 找不到或无法写入\\n。无法执行 RT。" -#: html/Edit/Global/Basic/Top:52 +#: html/Edit/Global/Basic/Top:57 msgid "LogToFile" msgstr "纪录等级" -#: html/Edit/Global/Basic/Top:54 +#: html/Edit/Global/Basic/Top:59 msgid "LogToFileNamed" msgstr "纪录档名" -#: html/Elements/Header:56 +#: html/Elements/Header:57 #. ("".$session{'CurrentUser'}->Name."") msgid "Logged in as %1" msgstr "使用者:%1" -#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 +#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 lib/RT/StyleGuide.pod:777 msgid "Login" msgstr "登入" -#: html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:29 html/Elements/Header:53 +#: html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:32 html/Elements/Header:54 msgid "Logout" msgstr "注销" @@ -3175,6 +3295,10 @@ msgstr "三月" msgid "Marketing Department" msgstr "行销部" +#: html/Edit/Global/CustomField/Top:63 +msgid "Match Pattern" +msgstr "符合样式" + #: NOT FOUND IN SOURCE msgid "May" msgstr "五月" @@ -3183,23 +3307,33 @@ msgstr "五月" msgid "May." msgstr "05" -#: lib/RT/Group_Overlay.pm:981 +#: lib/RT/Transaction_Overlay.pm:598 +#. ($value) +msgid "Member %1 added" +msgstr "成员 %1 新增完毕" + +#: lib/RT/Transaction_Overlay.pm:635 +#. ($value) +msgid "Member %1 deleted" +msgstr "成员 %1 删除完毕" + +#: lib/RT/Group_Overlay.pm:979 msgid "Member added" msgstr "新增成员完毕" -#: lib/RT/Group_Overlay.pm:1139 +#: lib/RT/Group_Overlay.pm:1141 msgid "Member deleted" msgstr "成员已删除" -#: lib/RT/Group_Overlay.pm:1143 +#: lib/RT/Group_Overlay.pm:1145 msgid "Member not deleted" -msgstr "成员未被删除" +msgstr "成员未删除" #: html/Elements/SelectLinkType:25 msgid "Member of" msgstr "隶属于" -#: html/Work/Preferences/index.html:20 +#: html/Work/Preferences/index.html:19 msgid "Member since" msgstr "注册日期" @@ -3211,15 +3345,25 @@ msgstr "隶属于" msgid "Members" msgstr "成员" -#: lib/RT/Ticket_Overlay.pm:2913 +#: lib/RT/Transaction_Overlay.pm:595 +#. ($value) +msgid "Membership in %1 added" +msgstr "所属群组 %1 加入完毕" + +#: lib/RT/Transaction_Overlay.pm:632 +#. ($value) +msgid "Membership in %1 deleted" +msgstr "所属群组 %1 移除完毕" + +#: lib/RT/Ticket_Overlay.pm:2954 msgid "Merge Successful" msgstr "整合完毕" -#: lib/RT/Ticket_Overlay.pm:2833 +#: lib/RT/Ticket_Overlay.pm:2874 msgid "Merge failed. Couldn't set EffectiveId" msgstr "整合失败。无法设定 EffectiveId" -#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:114 html/Work/Search/BulkLinks:2 +#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:97 html/Work/Search/BulkLinks:2 html/Work/Tickets/Elements/EditLinks:101 msgid "Merge into" msgstr "整合进" @@ -3227,15 +3371,19 @@ msgstr "整合进" msgid "Message" msgstr "讯息" +#: html/Ticket/Elements/ShowTransaction:80 +msgid "Message body not shown because it is too large or is not plain text." +msgstr "信件内文不是纯文字,因此无法显示。" + #: NOT FOUND IN SOURCE msgid "Misc. Expense" msgstr "杂费" -#: lib/RT/Interface/Web.pm:903 +#: lib/RT/Interface/Web.pm:963 msgid "Missing a primary key?: %1" msgstr "缺少主键值?(%1)" -#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:53 html/Work/Preferences/Info:33 +#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:71 html/Work/Preferences/Info:38 msgid "Mobile" msgstr "行动电话" @@ -3392,7 +3540,7 @@ msgstr "更改群组 %1" msgid "Modify the queue watchers" msgstr "更改表单视察员" -#: html/Admin/Users/Modify.html:235 +#: html/Admin/Users/Modify.html:237 #. ($UserObj->Name) msgid "Modify the user %1" msgstr "更改使用者 %1" @@ -3471,6 +3619,10 @@ msgstr "星期一" msgid "Mon." msgstr "星期一" +#: html/Work/Elements/MyRequests:11 html/Work/Elements/MyTickets:11 +msgid "More" +msgstr "更多" + #: html/Ticket/Elements/ShowRequestor:41 #. ($name) msgid "More about %1" @@ -3496,7 +3648,7 @@ msgstr "上移" msgid "Multiple" msgstr "多重" -#: lib/RT/User_Overlay.pm:238 +#: lib/RT/User_Overlay.pm:242 msgid "Must specify 'Name' attribute" msgstr "必须指定 'Name' 的属性" @@ -3505,15 +3657,15 @@ msgstr "必须指定 'Name' 的属性" msgid "My %1 tickets" msgstr "我的 %1 申请单" -#: html/Work/Elements/Tab:35 +#: html/Work/Elements/Tab:37 msgid "My Approvals" msgstr "表单签核" -#: html/Work/Elements/Tab:33 +#: html/Work/Elements/Tab:35 msgid "My Requests" msgstr "表单申请追踪" -#: html/Work/Elements/Tab:37 +#: html/Work/Elements/Tab:39 msgid "My Tickets" msgstr "表单处理" @@ -3521,15 +3673,15 @@ msgstr "表单处理" msgid "My approvals" msgstr "表单签核" -#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Elements/ModifyTemplateAsWorkflow:185 html/Admin/Elements/ModifyUser:29 html/Admin/Groups/Modify.html:43 html/Edit/Users/Add.html:22 html/Edit/Users/Search.html:31 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 html/Work/Tickets/Cc:18 +#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Elements/ModifyTemplateAsWorkflow:185 html/Admin/Elements/ModifyUser:29 html/Admin/Groups/Modify.html:43 html/Edit/Elements/SelectQueues:3 html/Edit/Queues/List:8 html/Edit/Users/Add.html:22 html/Edit/Users/List:5 html/Edit/Users/Search.html:31 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 html/Work/Tickets/Cc:18 msgid "Name" msgstr "名称" -#: lib/RT/User_Overlay.pm:245 +#: lib/RT/User_Overlay.pm:249 msgid "Name in use" msgstr "帐号已有人使用" -#: html/Edit/Users/Info:27 +#: NOT FOUND IN SOURCE msgid "Nationality" msgstr "国籍" @@ -3537,27 +3689,27 @@ msgstr "国籍" msgid "Need approval from system administrator" msgstr "需先由系统管理员进行批准" -#: html/Ticket/Elements/ShowDates:51 +#: html/Ticket/Elements/ShowDates:52 msgid "Never" msgstr "从未更动" -#: html/Elements/Quicksearch:29 html/Work/Elements/Quicksearch:15 html/Work/Tickets/Create.html:52 +#: html/Elements/Quicksearch:29 html/Work/Elements/Quicksearch:15 html/Work/Tickets/Create.html:53 msgid "New" msgstr "新建立" -#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/User/Prefs.html:64 html/Work/Preferences/Info:44 +#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/Edit/Users/Info:33 html/User/Prefs.html:87 html/Work/Preferences/Info:49 msgid "New Password" msgstr "新的口令" -#: etc/initialdata:341 etc/upgrade/2.1.71:16 html/Edit/Elements/CreateApprovalsQueue:21 +#: etc/initialdata:317 etc/upgrade/2.1.71:16 html/Edit/Elements/CreateApprovalsQueue:21 msgid "New Pending Approval" msgstr "新的待签核事项" -#: html/Ticket/Elements/EditLinks:110 +#: html/Ticket/Elements/EditLinks:93 html/Work/Tickets/Elements/EditLinks:12 msgid "New Relationships" msgstr "新增关系" -#: html/Work/Elements/Tab:31 +#: html/Work/Elements/Tab:33 msgid "New Request" msgstr "表单申请" @@ -3565,7 +3717,11 @@ msgstr "表单申请" msgid "New Search" msgstr "新增查询" -#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:39 +#: html/Work/Tickets/Elements/EditPeople:7 +msgid "New Watchers" +msgstr "新增视察员" + +#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:40 msgid "New custom field" msgstr "新增自订字段" @@ -3577,7 +3733,7 @@ msgstr "新增群组" msgid "New password" msgstr "新的口令" -#: lib/RT/User_Overlay.pm:706 +#: lib/RT/User_Overlay.pm:769 msgid "New password notification sent" msgstr "送出新口令通知" @@ -3609,7 +3765,7 @@ msgstr "新增模板" msgid "New ticket" msgstr "提出申请单" -#: lib/RT/Ticket_Overlay.pm:2800 +#: lib/RT/Ticket_Overlay.pm:2841 msgid "New ticket doesn't exist" msgstr "没有新申请单" @@ -3645,7 +3801,7 @@ msgstr "下一页" msgid "NickName" msgstr "昵称" -#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:45 html/Work/Preferences/Info:23 +#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:50 html/Work/Preferences/Info:26 msgid "Nickname" msgstr "昵称" @@ -3653,11 +3809,11 @@ msgstr "昵称" msgid "Night Shift" msgstr "小夜班" -#: html/Edit/Global/Basic/Top:27 +#: html/Edit/Global/Basic/Top:27 html/Edit/Queues/Basic/Top:83 msgid "No" msgstr "否" -#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:104 +#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:103 msgid "No CustomField" msgstr "无自订字段" @@ -3693,7 +3849,7 @@ msgstr "没有流程" msgid "No action" msgstr "暂不处理" -#: lib/RT/Interface/Web.pm:898 +#: lib/RT/Interface/Web.pm:958 msgid "No column specified" msgstr "未指定字段" @@ -3705,7 +3861,7 @@ msgstr "找不到命令" msgid "No comment entered about this user" msgstr "没有对这名使用者的评论" -#: lib/RT/Ticket_Overlay.pm:2211 lib/RT/Ticket_Overlay.pm:2279 +#: lib/RT/Ticket_Overlay.pm:2229 lib/RT/Ticket_Overlay.pm:2299 msgid "No correspondence attached" msgstr "没有附上申请单回复" @@ -3714,11 +3870,11 @@ msgstr "没有附上申请单回复" msgid "No description for %1" msgstr "没有对 %1 的描述" -#: lib/RT/Users_Overlay.pm:150 +#: lib/RT/Users_Overlay.pm:149 msgid "No group specified" msgstr "未指定群组" -#: lib/RT/User_Overlay.pm:924 +#: lib/RT/User_Overlay.pm:987 msgid "No password set" msgstr "没有设定口令" @@ -3726,24 +3882,24 @@ msgstr "没有设定口令" msgid "No permission to create queues" msgstr "没有新增表单的权限" -#: lib/RT/Ticket_Overlay.pm:342 +#: lib/RT/Ticket_Overlay.pm:361 #. ($QueueObj->Name) msgid "No permission to create tickets in the queue '%1'" msgstr "没有在表单 '%1' 新增申请单的权限" -#: lib/RT/User_Overlay.pm:211 +#: lib/RT/User_Overlay.pm:208 msgid "No permission to create users" msgstr "没有新增使用者的权限" -#: html/SelfService/Display.html:117 +#: html/SelfService/Display.html:123 msgid "No permission to display that ticket" msgstr "没有显示该申请单的权限" -#: html/SelfService/Update.html:51 +#: html/SelfService/Update.html:68 msgid "No permission to view update ticket" msgstr "没有检视申请单更新的权限" -#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1496 +#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1514 msgid "No principal specified" msgstr "未指定单位" @@ -3759,7 +3915,7 @@ msgstr "%1 内未指定协议" msgid "No queues matching search criteria found." msgstr "找不到符合查询条件的表单。" -#: html/Admin/Elements/SelectRights:80 +#: html/Admin/Elements/SelectRights:81 msgid "No rights found" msgstr "找不到权限" @@ -3775,7 +3931,7 @@ msgstr "没有要进行的查询" msgid "No ticket id specified" msgstr "未指定申请单编号" -#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516 +#: lib/RT/Transaction_Overlay.pm:427 lib/RT/Transaction_Overlay.pm:465 msgid "No transaction type specified" msgstr "未指定更动报告类别" @@ -3791,7 +3947,7 @@ msgstr "找不到符合查询条件的使用者。" msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" msgstr "找不到合格的 RT 使用者。RT cvs 处理器已停用。请向 RT 管理者询问。\\n" -#: lib/RT/Interface/Web.pm:895 +#: lib/RT/Interface/Web.pm:955 msgid "No value sent to _Set!\\n" msgstr "_Set 没有收到任何值!\\n" @@ -3799,7 +3955,7 @@ msgstr "_Set 没有收到任何值!\\n" msgid "Nobody" msgstr "没有人" -#: lib/RT/Interface/Web.pm:900 +#: lib/RT/Interface/Web.pm:960 msgid "Nonexistant field?" msgstr "字段不存在?" @@ -3815,7 +3971,7 @@ msgstr "未设定成从 %2 内撷取 %1" msgid "Not logged in" msgstr "尚未登入" -#: html/Elements/Header:58 +#: html/Elements/Header:59 msgid "Not logged in." msgstr "尚未登入" @@ -3831,7 +3987,7 @@ msgstr "尚未完工。" msgid "Not yet implemented...." msgstr "尚未完工..." -#: html/Approvals/Elements/Approve:48 html/Work/Tickets/Create.html:134 +#: html/Approvals/Elements/Approve:48 html/Work/Tickets/Elements/AddContent:9 msgid "Notes" msgstr "备注" @@ -3839,67 +3995,67 @@ msgstr "备注" msgid "Notes:" msgstr "备注:" -#: lib/RT/User_Overlay.pm:709 +#: lib/RT/User_Overlay.pm:772 msgid "Notification could not be sent" msgstr "无法送出通知" -#: etc/initialdata:111 +#: etc/initialdata:93 msgid "Notify AdminCcs" msgstr "通知管理员副本收件人" -#: etc/initialdata:107 +#: etc/initialdata:89 msgid "Notify AdminCcs as Comment" msgstr "以评论方式通知管理员副本收件人" -#: etc/initialdata:138 +#: etc/initialdata:120 msgid "Notify Other Recipients" msgstr "通知其它收件人" -#: etc/initialdata:134 +#: etc/initialdata:116 msgid "Notify Other Recipients as Comment" msgstr "以评论方式通知其它收件人" -#: etc/initialdata:103 +#: etc/initialdata:85 msgid "Notify Owner" msgstr "通知承办人" -#: etc/initialdata:99 +#: etc/initialdata:81 msgid "Notify Owner as Comment" msgstr "以评论方式通知承办人" -#: etc/initialdata:385 +#: etc/initialdata:361 msgid "Notify Owner of their rejected ticket" msgstr "通知承办人申请单已驳回" -#: etc/initialdata:374 +#: etc/initialdata:350 msgid "Notify Owner of their ticket has been approved by all approvers" msgstr "通知承办人申请单已完成全部签核" -#: etc/initialdata:359 +#: etc/initialdata:338 msgid "Notify Owner of their ticket has been approved by some approver" msgstr "通知承办人申请单已完成某项签核" -#: etc/initialdata:343 etc/upgrade/2.1.71:17 html/Edit/Elements/CreateApprovalsQueue:22 +#: etc/initialdata:319 etc/upgrade/2.1.71:17 html/Edit/Elements/CreateApprovalsQueue:22 msgid "Notify Owners and AdminCcs of new items pending their approval" msgstr "整理待签核事项,通知承办人及管理员副本收件人" -#: etc/initialdata:95 +#: etc/initialdata:77 msgid "Notify Requestors" msgstr "通知申请人" -#: etc/initialdata:121 +#: etc/initialdata:103 msgid "Notify Requestors and Ccs" msgstr "通知申请人及副本收件人" -#: etc/initialdata:116 +#: etc/initialdata:98 msgid "Notify Requestors and Ccs as Comment" msgstr "以评论方式通知申请人及副本收件人" -#: etc/initialdata:130 +#: etc/initialdata:112 msgid "Notify Requestors, Ccs and AdminCcs" msgstr "通知申请人、副本及管理员副本收件人" -#: etc/initialdata:126 +#: etc/initialdata:108 msgid "Notify Requestors, Ccs and AdminCcs as Comment" msgstr "以评论方式通知申请人、副本及管理员副本收件人" @@ -3919,9 +4075,9 @@ msgstr "11" msgid "November" msgstr "十一月" -#: html/Edit/Global/Basic/Top:74 +#: html/Edit/Global/Basic/Top:83 msgid "OIN104" -msgstr "配合 104eHRMS 接口" +msgstr "104eHRMS 接口" #: html/Edit/Global/Workflow/Export.html:30 html/Work/Copyright.html:23 msgid "OK" @@ -3935,7 +4091,7 @@ msgstr "无法新增对象" msgid "Object created" msgstr "对象新增完毕" -#: html/Edit/Users/Info:36 +#: NOT FOUND IN SOURCE msgid "Occupation Status" msgstr "在职状态" @@ -3951,7 +4107,7 @@ msgstr "10" msgid "October" msgstr "十月" -#: html/Edit/Users/Info:33 +#: NOT FOUND IN SOURCE msgid "Office Phone" msgstr "办公室电话" @@ -3959,35 +4115,39 @@ msgstr "办公室电话" msgid "On" msgstr "等于" -#: etc/initialdata:173 +#: html/Edit/Global/CustomField/Top:68 +msgid "On Change" +msgstr "更改申请单时" + +#: etc/initialdata:155 msgid "On Comment" msgstr "评论时" -#: etc/initialdata:166 +#: etc/initialdata:148 msgid "On Correspond" msgstr "回复申请单时" -#: etc/initialdata:155 +#: etc/initialdata:137 html/Edit/Global/CustomField/Top:57 msgid "On Create" msgstr "新增申请单时" -#: etc/initialdata:187 +#: etc/initialdata:169 msgid "On Owner Change" msgstr "承办人改变时" -#: etc/initialdata:195 +#: etc/initialdata:177 msgid "On Queue Change" msgstr "表单改变时" -#: etc/initialdata:201 +#: etc/initialdata:183 msgid "On Resolve" msgstr "解决申请单时" -#: etc/initialdata:179 +#: etc/initialdata:161 msgid "On Status Change" msgstr "现况改变时" -#: etc/initialdata:160 +#: etc/initialdata:142 msgid "On Transaction" msgstr "发生更动时" @@ -4001,7 +4161,7 @@ msgstr "仅显示 %1 之后新增的申请单" msgid "Only show approvals for requests created before %1" msgstr "仅显示 %1 之前新增的申请单" -#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:18 html/Edit/Queues/Basic/Top:69 html/Edit/Queues/List:13 html/Elements/Quicksearch:30 html/Work/Delegates/Info:48 html/Work/Delegates/Info:51 html/Work/Delegates/List:12 html/Work/Elements/Quicksearch:16 html/Work/Overview/Info:41 html/Work/Tickets/Display.html:28 +#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:18 html/Edit/Queues/Basic/Top:68 html/Edit/Queues/List:15 html/Edit/Queues/List:27 html/Elements/Quicksearch:30 html/Work/Delegates/Info:48 html/Work/Delegates/Info:51 html/Work/Delegates/List:12 html/Work/Elements/Quicksearch:16 html/Work/Overview/Info:41 html/Work/Tickets/Display.html:51 msgid "Open" msgstr "开启" @@ -4021,7 +4181,7 @@ msgstr "在新窗口开启(列表的)申请单" msgid "Open tickets (from listing) in another window" msgstr "在另一个窗口开启(列表的)申请单" -#: etc/initialdata:150 +#: etc/initialdata:132 msgid "Open tickets on correspondence" msgstr "收到回复时即开启申请单" @@ -4041,11 +4201,11 @@ msgstr "选项描述" msgid "Option Name" msgstr "选项名称" -#: html/Search/Elements/PickRestriction:100 html/Work/Search/PickRestriction:81 +#: html/Search/Elements/PickRestriction:100 html/Work/Search/PickRestriction:87 msgid "Ordering and sorting" msgstr "顺序与排序方式" -#: html/Admin/Elements/ModifyUser:45 html/Admin/Users/Modify.html:116 html/Edit/Global/Basic/Top:50 html/Elements/SelectUsers:28 html/User/Prefs.html:85 html/Work/Preferences/Info:74 +#: html/Admin/Elements/ModifyUser:45 html/Admin/Users/Modify.html:116 html/Edit/Elements/SelectUsers:7 html/Edit/Global/Basic/Top:55 html/Elements/SelectUsers:28 html/User/Prefs.html:110 html/Work/Preferences/Info:77 msgid "Organization" msgstr "组织名称" @@ -4058,11 +4218,11 @@ msgstr "组织:" msgid "Originating ticket: #%1" msgstr "原申请单:#%1" -#: html/Edit/Elements/PickUsers:109 html/Edit/Users/Add.html:106 html/Work/Tickets/Cc:80 +#: html/Edit/Elements/PickUsers:111 html/Edit/Users/Add.html:106 html/Work/Tickets/Cc:80 msgid "Other comma-delimited email addresses" msgstr "其它e-mail帐号 (仅e-mail通知;多笔帐号请用逗号','区隔)" -#: html/Admin/Elements/ModifyQueue:54 html/Admin/Queues/Modify.html:68 html/Edit/Queues/Basic/Top:41 +#: html/Admin/Elements/ModifyQueue:54 html/Admin/Queues/Modify.html:68 html/Edit/Queues/Basic/Top:44 msgid "Over time, priority moves toward" msgstr "优先顺位随时间增加调整为" @@ -4074,12 +4234,12 @@ msgstr "以 %1 表单的自订字段取代现有字段" msgid "Override global rights" msgstr "取代全域权限" -#: html/Admin/Elements/CheckOverrideGlobalACL:34 +#: html/Admin/Elements/CheckOverrideGlobalACL:36 #. (loc_fuzzy($msg)) msgid "OverrideGlobalACL status %1" msgstr "取代全域权限 %1" -#: html/Work/Elements/Tab:29 +#: html/Work/Elements/Tab:31 msgid "Overview" msgstr "总览" @@ -4091,7 +4251,7 @@ msgstr "承办申请单" msgid "OwnTicket" msgstr "承办申请单" -#: etc/initialdata:56 html/Admin/Elements/ModifyTemplateAsWorkflow:141 html/Edit/Global/Workflow/Owner.html:19 html/Edit/Queues/Basic/Top:47 html/Edit/Queues/Basic/Top:58 html/Elements/MyRequests:31 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:62 html/Work/Elements/MyRequests:13 html/Work/Elements/Quicksearch:18 html/Work/Tickets/Elements/ShowBasics:21 html/Work/Tickets/Update.html:27 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1244 +#: etc/initialdata:38 html/Admin/Elements/ModifyTemplateAsWorkflow:141 html/Edit/Global/Workflow/Owner.html:19 html/Edit/Queues/Basic/Top:51 html/Edit/Queues/Basic/Top:59 html/Elements/MyRequests:31 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:62 html/Work/Elements/MyRequests:19 html/Work/Elements/Quicksearch:18 html/Work/Tickets/Elements/EditPeople:28 html/Work/Tickets/Elements/ShowBasics:21 html/Work/Tickets/Update.html:27 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1263 msgid "Owner" msgstr "承办人" @@ -4099,7 +4259,7 @@ msgstr "承办人" msgid "Owner changed from %1 to %2" msgstr "承办人已从 %1 改为 %2" -#: lib/RT/Transaction_Overlay.pm:582 +#: lib/RT/Transaction_Overlay.pm:539 #. ($Old->Name , $New->Name) msgid "Owner forcibly changed from %1 to %2" msgstr "强制将承办人从 %1 改为 %2" @@ -4108,15 +4268,15 @@ msgstr "强制将承办人从 %1 改为 %2" msgid "Owner is" msgstr "承办人" -#: html/Work/Elements/List:27 html/Work/Queues/List:8 html/Work/Tickets/Create.html:54 html/Work/Tickets/Elements/ShowBasics:52 +#: html/Work/Elements/List:27 html/Work/Queues/List:8 html/Work/Tickets/Create.html:55 html/Work/Tickets/Elements/ShowBasics:60 msgid "Owner's Phone" msgstr "承办人电话" -#: html/Edit/Elements/Page:39 -msgid "Page" +#: html/Edit/Elements/Page:40 +msgid "Page #" msgstr " " -#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:55 html/Work/Preferences/Info:35 +#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:75 html/Work/Preferences/Info:40 msgid "Pager" msgstr "呼叫器" @@ -4124,7 +4284,7 @@ msgstr "呼叫器" msgid "PagerPhone" msgstr "呼叫器号码" -#: html/Edit/Global/Workflow/Action:81 html/Edit/Global/Workflow/Condition:66 +#: html/Edit/Global/Workflow/Action:75 html/Edit/Global/Workflow/Condition:65 msgid "Parameter" msgstr "呼叫参数" @@ -4132,7 +4292,7 @@ msgstr "呼叫参数" msgid "Parent" msgstr "上级" -#: html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:38 html/Ticket/Elements/EditLinks:126 html/Ticket/Elements/EditLinks:57 html/Ticket/Elements/ShowLinks:46 html/Work/Search/BulkLinks:14 +#: html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:38 html/Ticket/Elements/EditLinks:109 html/Ticket/Elements/EditLinks:54 html/Ticket/Elements/ShowLinks:46 html/Work/Search/BulkLinks:14 html/Work/Tickets/Elements/EditLinks:113 html/Work/Tickets/Elements/EditLinks:45 html/Work/Tickets/Elements/ShowLinks:26 msgid "Parents" msgstr "母申请单" @@ -4140,7 +4300,7 @@ msgstr "母申请单" msgid "Park Space" msgstr "停车位申请" -#: html/Elements/Login:52 html/User/Prefs.html:60 html/Work/Preferences/Info:41 +#: html/Elements/Login:52 html/User/Prefs.html:83 html/Work/Preferences/Info:46 msgid "Password" msgstr "口令" @@ -4148,20 +4308,20 @@ msgstr "口令" msgid "Password Reminder" msgstr "口令提示" -#: lib/RT/User_Overlay.pm:228 lib/RT/User_Overlay.pm:927 +#: lib/RT/User_Overlay.pm:230 lib/RT/User_Overlay.pm:990 msgid "Password too short" msgstr "口令太短" -#: html/Admin/Users/Modify.html:290 html/User/Prefs.html:171 html/Work/Preferences/Info:162 +#: html/Admin/Users/Modify.html:292 html/User/Prefs.html:209 html/Work/Preferences/Info:173 #. (loc_fuzzy($msg)) msgid "Password: %1" msgstr "口令:%1" -#: html/Admin/Users/Modify.html:292 +#: html/Admin/Users/Modify.html:294 msgid "Passwords do not match." msgstr "口令确认失败。" -#: html/User/Prefs.html:173 html/Work/Preferences/Info:164 +#: html/User/Prefs.html:211 html/Work/Preferences/Info:175 msgid "Passwords do not match. Your password has not been changed" msgstr "口令确认失败。您的口令并未改变。" @@ -4181,11 +4341,11 @@ msgstr "人员" msgid "People with Queue Rights" msgstr "拥有表单权限人员" -#: etc/initialdata:143 +#: etc/initialdata:125 msgid "Perform a user-defined action" msgstr "执行使用者自订的动作" -#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/CurrentUser.pm:82 lib/RT/CurrentUser.pm:91 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:201 lib/RT/CustomField_Overlay.pm:233 lib/RT/CustomField_Overlay.pm:510 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1094 lib/RT/Group_Overlay.pm:1098 lib/RT/Group_Overlay.pm:1107 lib/RT/Group_Overlay.pm:1158 lib/RT/Group_Overlay.pm:1162 lib/RT/Group_Overlay.pm:1168 lib/RT/Group_Overlay.pm:425 lib/RT/Group_Overlay.pm:517 lib/RT/Group_Overlay.pm:595 lib/RT/Group_Overlay.pm:603 lib/RT/Group_Overlay.pm:700 lib/RT/Group_Overlay.pm:704 lib/RT/Group_Overlay.pm:710 lib/RT/Group_Overlay.pm:903 lib/RT/Group_Overlay.pm:907 lib/RT/Group_Overlay.pm:920 lib/RT/Queue_Overlay.pm:540 lib/RT/Queue_Overlay.pm:550 lib/RT/Queue_Overlay.pm:564 lib/RT/Queue_Overlay.pm:699 lib/RT/Queue_Overlay.pm:708 lib/RT/Queue_Overlay.pm:721 lib/RT/Queue_Overlay.pm:931 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:196 lib/RT/Scrip_Overlay.pm:429 lib/RT/Template_Overlay.pm:283 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1349 lib/RT/Ticket_Overlay.pm:1359 lib/RT/Ticket_Overlay.pm:1373 lib/RT/Ticket_Overlay.pm:1526 lib/RT/Ticket_Overlay.pm:1535 lib/RT/Ticket_Overlay.pm:1548 lib/RT/Ticket_Overlay.pm:1897 lib/RT/Ticket_Overlay.pm:2035 lib/RT/Ticket_Overlay.pm:2199 lib/RT/Ticket_Overlay.pm:2266 lib/RT/Ticket_Overlay.pm:2625 lib/RT/Ticket_Overlay.pm:2697 lib/RT/Ticket_Overlay.pm:2791 lib/RT/Ticket_Overlay.pm:2806 lib/RT/Ticket_Overlay.pm:3005 lib/RT/Ticket_Overlay.pm:3015 lib/RT/Ticket_Overlay.pm:3020 lib/RT/Ticket_Overlay.pm:3242 lib/RT/Ticket_Overlay.pm:3440 lib/RT/Ticket_Overlay.pm:3602 lib/RT/Ticket_Overlay.pm:3654 lib/RT/Ticket_Overlay.pm:3829 lib/RT/Transaction_Overlay.pm:466 lib/RT/Transaction_Overlay.pm:473 lib/RT/Transaction_Overlay.pm:502 lib/RT/Transaction_Overlay.pm:509 lib/RT/User_Overlay.pm:1021 lib/RT/User_Overlay.pm:1414 lib/RT/User_Overlay.pm:629 lib/RT/User_Overlay.pm:664 lib/RT/User_Overlay.pm:920 +#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/CurrentUser.pm:82 lib/RT/CurrentUser.pm:91 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:201 lib/RT/CustomField_Overlay.pm:233 lib/RT/CustomField_Overlay.pm:511 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1096 lib/RT/Group_Overlay.pm:1100 lib/RT/Group_Overlay.pm:1109 lib/RT/Group_Overlay.pm:1160 lib/RT/Group_Overlay.pm:1164 lib/RT/Group_Overlay.pm:1170 lib/RT/Group_Overlay.pm:423 lib/RT/Group_Overlay.pm:515 lib/RT/Group_Overlay.pm:593 lib/RT/Group_Overlay.pm:601 lib/RT/Group_Overlay.pm:698 lib/RT/Group_Overlay.pm:702 lib/RT/Group_Overlay.pm:708 lib/RT/Group_Overlay.pm:901 lib/RT/Group_Overlay.pm:905 lib/RT/Group_Overlay.pm:918 lib/RT/Queue_Overlay.pm:540 lib/RT/Queue_Overlay.pm:550 lib/RT/Queue_Overlay.pm:564 lib/RT/Queue_Overlay.pm:699 lib/RT/Queue_Overlay.pm:708 lib/RT/Queue_Overlay.pm:721 lib/RT/Queue_Overlay.pm:934 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:201 lib/RT/Scrip_Overlay.pm:441 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1386 lib/RT/Ticket_Overlay.pm:1396 lib/RT/Ticket_Overlay.pm:1410 lib/RT/Ticket_Overlay.pm:1544 lib/RT/Ticket_Overlay.pm:1553 lib/RT/Ticket_Overlay.pm:1566 lib/RT/Ticket_Overlay.pm:1915 lib/RT/Ticket_Overlay.pm:2053 lib/RT/Ticket_Overlay.pm:2217 lib/RT/Ticket_Overlay.pm:2286 lib/RT/Ticket_Overlay.pm:2647 lib/RT/Ticket_Overlay.pm:2728 lib/RT/Ticket_Overlay.pm:2832 lib/RT/Ticket_Overlay.pm:2847 lib/RT/Ticket_Overlay.pm:3046 lib/RT/Ticket_Overlay.pm:3056 lib/RT/Ticket_Overlay.pm:3061 lib/RT/Ticket_Overlay.pm:3284 lib/RT/Ticket_Overlay.pm:3288 lib/RT/Ticket_Overlay.pm:3487 lib/RT/Ticket_Overlay.pm:3649 lib/RT/Ticket_Overlay.pm:3701 lib/RT/Ticket_Overlay.pm:3907 lib/RT/Transaction_Overlay.pm:415 lib/RT/Transaction_Overlay.pm:422 lib/RT/Transaction_Overlay.pm:451 lib/RT/Transaction_Overlay.pm:458 lib/RT/User_Overlay.pm:1084 lib/RT/User_Overlay.pm:1532 lib/RT/User_Overlay.pm:692 lib/RT/User_Overlay.pm:727 lib/RT/User_Overlay.pm:983 msgid "Permission Denied" msgstr "权限不足" @@ -4217,11 +4377,27 @@ msgstr "代理人群组" msgid "Personal groups:" msgstr "代理人群组:" -#: html/Work/Preferences/Info:21 +#: html/Work/Preferences/Info:24 msgid "PersonalHomepage" msgstr "个人首页" #: NOT FOUND IN SOURCE +msgid "Phase 1: Create/Rename Groups (%1)" +msgstr "第一阶段:群组建立及改名 (%1)" + +#: NOT FOUND IN SOURCE +msgid "Phase 2: Disable/Enable Groups (%1)" +msgstr "第二阶段:群组停用及启用 (%1)" + +#: NOT FOUND IN SOURCE +msgid "Phase 3: Create/Rename Users (%1)" +msgstr "第三阶段:使用者建立及改名 (%1)" + +#: NOT FOUND IN SOURCE +msgid "Phase 4: Disable/Enable Users (%1)" +msgstr "第四阶段:使用者停用及启用 (%1)" + +#: NOT FOUND IN SOURCE msgid "Phone" msgstr "电话" @@ -4229,11 +4405,11 @@ msgstr "电话" msgid "Phone number" msgstr "电话号码" -#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:48 html/Work/Preferences/Info:27 +#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:60 html/Work/Preferences/Info:32 msgid "Phone numbers" msgstr "电话号码" -#: html/Edit/Users/Add.html:3 html/Work/Delegates/Add.html:3 html/Work/Delegates/Info:34 html/Work/Tickets/ModifyPeople.html:2 +#: html/Edit/Queues/Basic/Add.html:3 html/Edit/Queues/Basic/Top:55 html/Edit/Users/Add.html:3 html/Work/Delegates/Add.html:3 html/Work/Delegates/Info:34 html/Work/Tickets/ModifyPeople.html:2 msgid "Pick" msgstr "挑选" @@ -4245,7 +4421,7 @@ msgstr "出发地点" msgid "Placeholder" msgstr "尚未完工" -#: html/Edit/Elements/PickUsers:31 html/Edit/Elements/PickUsers:44 html/Edit/Elements/SelectCustomFieldType:3 html/Work/Elements/SelectOwner:3 html/Work/Tickets/Elements/EditCustomField:104 html/Work/Tickets/Elements/EditCustomField:185 html/Work/Tickets/Elements/EditCustomField:75 html/Work/Tickets/Elements/EditCustomFieldEntries:66 html/Work/Tickets/Elements/EditCustomFieldEntries:73 +#: html/Edit/Elements/PickUsers:31 html/Edit/Elements/PickUsers:44 html/Edit/Elements/SelectCustomFieldType:3 html/Work/Elements/SelectOwner:3 html/Work/Tickets/Elements/EditCustomField:187 html/Work/Tickets/Elements/EditCustomFieldEntry:24 html/Work/Tickets/Elements/EditCustomFieldEntry:35 msgid "Please Select" msgstr "请选择" @@ -4262,6 +4438,10 @@ msgid "Please select a queue's workflow" msgstr "请选择表单流程" #: NOT FOUND IN SOURCE +msgid "Please select one of the category types above." +msgstr "请从上面选择一项分类。" + +#: NOT FOUND IN SOURCE msgid "Please select role" msgstr "请选择角色" @@ -4273,19 +4453,19 @@ msgstr "经营规章" msgid "Position" msgstr "职务" -#: html/Edit/Users/Info:43 +#: NOT FOUND IN SOURCE msgid "Position Level" msgstr "职等" -#: html/Edit/Elements/PickUsers:41 html/Edit/Global/UserRight/List:13 html/Edit/Global/UserRight/Top:23 html/Edit/Users/Add.html:41 html/Edit/Users/List:11 html/Edit/Users/Top:22 html/Work/Delegates/Add.html:26 html/Work/Delegates/Info:84 html/Work/Overview/Info:66 +#: html/Edit/Elements/PickUsers:41 html/Edit/Global/UserRight/List:13 html/Edit/Global/UserRight/Top:23 html/Edit/Queues/Basic/Add.html:26 html/Edit/Users/Add.html:41 html/Work/Delegates/Add.html:26 html/Work/Delegates/Info:84 html/Work/Overview/Info:66 msgid "Position Name" msgstr "职务名称" -#: html/Edit/Global/UserRight/List:14 html/Edit/Global/UserRight/Top:33 html/Edit/Users/List:12 html/Edit/Users/Top:32 +#: html/Edit/Global/UserRight/List:14 html/Edit/Global/UserRight/Top:33 msgid "Position Number" msgstr "职务代码" -#: html/Edit/Users/Info:44 +#: NOT FOUND IN SOURCE msgid "Position Rank" msgstr "职级" @@ -4293,7 +4473,7 @@ msgstr "职级" msgid "Pref" msgstr "偏好" -#: html/Edit/Elements/104Top:25 html/Elements/Header:51 html/Elements/Tabs:52 html/SelfService/Elements/Tabs:50 html/SelfService/Prefs.html:24 html/User/Prefs.html:24 html/User/Prefs.html:27 html/Work/Elements/Tab:41 +#: html/Edit/Elements/104Top:26 html/Elements/Header:51 html/Elements/Tabs:52 html/SelfService/Elements/Tabs:50 html/SelfService/Prefs.html:24 html/User/Prefs.html:24 html/User/Prefs.html:27 html/Work/Elements/Tab:43 msgid "Preferences" msgstr "偏好" @@ -4322,7 +4502,7 @@ msgstr "优先顺位" msgid "Principal %1 not found." msgstr "找不到单位 %1。" -#: html/Search/Elements/PickRestriction:53 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:53 html/Ticket/Elements/ShowBasics:38 html/Work/Search/PickRestriction:34 lib/RT/Tickets_Overlay.pm:1042 +#: html/Search/Elements/PickRestriction:53 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:53 html/Ticket/Elements/ShowBasics:38 html/Work/Search/PickRestriction:34 html/Work/Tickets/Elements/EditBasics:41 lib/RT/Tickets_Overlay.pm:1061 msgid "Priority" msgstr "优先顺位" @@ -4330,11 +4510,11 @@ msgstr "优先顺位" msgid "Priority starts at" msgstr "优先顺位起始值" -#: etc/initialdata:43 +#: etc/initialdata:25 msgid "Privileged" msgstr "内部成员" -#: html/Admin/Users/Modify.html:270 html/User/Prefs.html:162 html/Work/Preferences/Info:153 +#: html/Admin/Users/Modify.html:272 html/User/Prefs.html:200 html/Work/Preferences/Info:164 #. (loc_fuzzy($msg)) msgid "Privileged status: %1" msgstr "内部成员状态:%1" @@ -4347,11 +4527,19 @@ msgstr "内部成员" msgid "Process Status" msgstr "处理状态" -#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 etc/initialdata:77 +#: html/Edit/Queues/List:10 +msgid "Project Name" +msgstr "项目名称" + +#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59 msgid "Pseudogroup for internal use" msgstr "内部用的虚拟群组" -#: html/Work/Preferences/Info:64 +#: html/Edit/Queues/List:11 +msgid "Public Description" +msgstr "公开说明" + +#: html/Work/Preferences/Info:70 msgid "Public Info" msgstr "公开信息" @@ -4359,11 +4547,15 @@ msgstr "公开信息" msgid "Public Service" msgstr "公共事务区" +#: NOT FOUND IN SOURCE +msgid "Purging stale data: %1" +msgstr "移除过期数据: %1" + #: html/Edit/Users/Search.html:4 msgid "Query" msgstr "查询" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:166 html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Elements/Quicksearch:28 html/Search/Elements/PickRestriction:45 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:63 html/Ticket/Elements/ShowBasics:42 html/User/Elements/DelegateRights:79 html/Work/Elements/MyApprovals:10 html/Work/Elements/MyRequests:11 html/Work/Elements/MyTickets:11 html/Work/Elements/Quicksearch:14 html/Work/Search/PickRestriction:26 lib/RT/Tickets_Overlay.pm:883 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:166 html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Elements/Quicksearch:28 html/Search/Elements/PickRestriction:45 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:63 html/Ticket/Elements/ShowBasics:42 html/User/Elements/DelegateRights:79 html/Work/Elements/MyApprovals:10 html/Work/Elements/MyRequests:17 html/Work/Elements/MyTickets:17 html/Work/Elements/Quicksearch:14 html/Work/Search/PickRestriction:26 html/Work/Tickets/Elements/EditBasics:16 lib/RT/Tickets_Overlay.pm:902 msgid "Queue" msgstr "表单" @@ -4381,19 +4573,19 @@ msgstr "找不到表单 '%1'\\n" msgid "Queue Keyword Selections" msgstr "表单关键词选取" -#: html/Admin/Elements/ModifyQueue:30 html/Admin/Queues/Modify.html:42 html/Edit/Queues/Basic/Top:12 html/Edit/Queues/Basic/index.html:36 html/Edit/Queues/Global:21 html/Edit/Queues/List:6 html/Edit/Users/Queue:10 html/Work/Delegates/List:6 html/Work/Elements/List:11 html/Work/Queues/List:5 html/Work/Tickets/Create.html:20 html/Work/Tickets/Elements/ShowBasics:6 +#: html/Admin/Elements/ModifyQueue:30 html/Admin/Queues/Modify.html:42 html/Edit/Queues/Basic/Top:13 html/Edit/Queues/Basic/index.html:36 html/Edit/Queues/Global:21 html/Edit/Queues/List:20 html/Edit/Users/Queue:10 html/Work/Delegates/List:6 html/Work/Elements/List:11 html/Work/Queues/List:5 html/Work/Tickets/Create.html:21 html/Work/Tickets/Elements/ShowBasics:6 msgid "Queue Name" msgstr "表单名称" -#: html/Edit/Queues/List:8 html/Work/Elements/List:25 html/Work/Queues/List:7 html/Work/Tickets/Create.html:33 html/Work/Tickets/Elements/ShowBasics:19 +#: html/Edit/Queues/List:22 html/Work/Elements/List:25 html/Work/Queues/List:7 html/Work/Tickets/Create.html:34 html/Work/Tickets/Elements/ShowBasics:19 msgid "Queue Owner" msgstr "业务承办人" -#: html/Edit/Queues/Basic/Top:35 +#: html/Edit/Queues/Basic/Top:38 msgid "Queue Priority" msgstr "优先等级" -#: html/Edit/Global/GroupRight/Top:24 html/Edit/Global/UserRight/Top:43 html/Edit/Users/Queue:11 html/Edit/Users/index.html:124 +#: html/Edit/Global/GroupRight/Top:24 html/Edit/Global/UserRight/Top:43 html/Edit/Users/Queue:11 html/Edit/Users/index.html:97 msgid "Queue Rights" msgstr "表单权限" @@ -4401,7 +4593,7 @@ msgstr "表单权限" msgid "Queue Scrips" msgstr "表单手续" -#: html/Edit/Elements/Tab:36 +#: html/Edit/Elements/Tab:38 msgid "Queue Setup" msgstr "表单设定" @@ -4413,11 +4605,11 @@ msgstr "表单已存在" msgid "Queue could not be created" msgstr "无法新增表单" -#: html/Edit/Queues/autohandler:8 html/Ticket/Create.html:204 html/Work/Tickets/Create.html:176 +#: html/Edit/Queues/autohandler:8 html/Ticket/Create.html:208 html/Work/Tickets/Create.html:180 msgid "Queue could not be loaded." msgstr "无法加载表单" -#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283 +#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283 lib/RT/StyleGuide.pod:789 msgid "Queue created" msgstr "表单新增完毕" @@ -4446,7 +4638,7 @@ msgstr "表单一览" msgid "RT %1" msgstr "RT %1" -#: docs/design_docs/string-extraction-guide.txt:70 +#: docs/design_docs/string-extraction-guide.txt:70 lib/RT/StyleGuide.pod:776 #. ($RT::VERSION, $RT::rtname) msgid "RT %1 for %2" msgstr "%2:RT %1 版" @@ -4562,11 +4754,15 @@ msgstr "系统运行角色" msgid "RT::Ticket-Role" msgstr "申请单运行角色" -#: html/Work/Tickets/Elements/ShowTransaction:11 +#: html/Work/Tickets/Elements/ShowTransaction:14 msgid "RT_System" msgstr "系统讯息" -#: html/Admin/Users/Modify.html:57 html/Admin/Users/Prefs.html:51 html/User/Prefs.html:43 html/Work/Preferences/Info:18 +#: html/Edit/Global/CustomField/SelectWritable:7 +msgid "Read Only" +msgstr "只读" + +#: html/Admin/Users/Modify.html:57 html/Admin/Users/Prefs.html:51 html/Edit/Elements/SelectUsers:5 html/Edit/Users/List:6 html/User/Prefs.html:47 html/Work/Preferences/Info:18 msgid "Real Name" msgstr "真实姓名" @@ -4574,15 +4770,35 @@ msgstr "真实姓名" msgid "RealName" msgstr "真实姓名" -#: html/Work/Approvals/Display.html:27 html/Work/Tickets/Update.html:85 +#: html/Work/Approvals/Display.html:30 html/Work/Tickets/Update.html:81 msgid "Really reject this ticket?" msgstr "您确定要驳回这张申请单吗?" -#: html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:50 html/Ticket/Elements/EditLinks:138 html/Ticket/Elements/EditLinks:93 html/Ticket/Elements/ShowLinks:70 html/Work/Search/BulkLinks:26 +#: lib/RT/Transaction_Overlay.pm:592 +#. ($value) +msgid "Reference by %1 added" +msgstr "已加入 %1 为参考本申请单" + +#: lib/RT/Transaction_Overlay.pm:629 +#. ($value) +msgid "Reference by %1 deleted" +msgstr "已移除 %1 为参考本申请单" + +#: lib/RT/Transaction_Overlay.pm:589 +#. ($value) +msgid "Reference to %1 added" +msgstr "已加入参考申请单 %1" + +#: lib/RT/Transaction_Overlay.pm:626 +#. ($value) +msgid "Reference to %1 deleted" +msgstr "已移除参考申请单 %1" + +#: html/Ticket/Create.html:185 html/Ticket/Elements/BulkLinks:50 html/Ticket/Elements/EditLinks:121 html/Ticket/Elements/EditLinks:81 html/Ticket/Elements/ShowLinks:70 html/Work/Search/BulkLinks:26 html/Work/Tickets/Elements/EditLinks:125 html/Work/Tickets/Elements/EditLinks:81 html/Work/Tickets/Elements/ShowLinks:38 msgid "Referred to by" msgstr "被参考" -#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:46 html/Ticket/Elements/EditLinks:134 html/Ticket/Elements/EditLinks:79 html/Ticket/Elements/ShowLinks:60 html/Work/Search/BulkLinks:22 +#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:46 html/Ticket/Elements/EditLinks:117 html/Ticket/Elements/EditLinks:72 html/Ticket/Elements/ShowLinks:60 html/Work/Search/BulkLinks:22 html/Work/Tickets/Elements/EditLinks:121 html/Work/Tickets/Elements/EditLinks:67 html/Work/Tickets/Elements/ShowLinks:33 msgid "Refers to" msgstr "参考" @@ -4607,7 +4823,7 @@ msgstr "更新" msgid "Refresh this page every %1 minutes." msgstr "每 %1 分钟更新页面" -#: html/Ticket/Create.html:173 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56 +#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56 msgid "Relationships" msgstr "关系" @@ -4627,7 +4843,7 @@ msgstr "移除副本" msgid "Remove Requestor" msgstr "移除申请人" -#: html/Ticket/Elements/ShowTransaction:160 html/Ticket/Elements/Tabs:121 html/Work/Tickets/Display.html:31 html/Work/Tickets/Elements/ShowTransaction:106 +#: html/Ticket/Elements/ShowTransaction:172 html/Ticket/Elements/Tabs:121 html/Work/Tickets/Display.html:54 html/Work/Tickets/Elements/ShowTransaction:115 msgid "Reply" msgstr "回复" @@ -4639,15 +4855,15 @@ msgstr "对申请单进行回复" msgid "ReplyToTicket" msgstr "回复申请单" -#: html/Edit/Users/Info:46 +#: NOT FOUND IN SOURCE msgid "Report to Duty" msgstr "上下班刷卡" -#: html/Edit/Users/Info:34 +#: NOT FOUND IN SOURCE msgid "Reported on" msgstr "到职日期" -#: etc/initialdata:62 html/Ticket/Update.html:39 html/Work/Elements/List:21 html/Work/Elements/MyApprovals:12 html/Work/Elements/SelectSearch:30 html/Work/Tickets/Elements/ShowBasics:54 lib/RT/ACE_Overlay.pm:86 +#: etc/initialdata:44 html/Ticket/Update.html:39 html/Work/Elements/List:21 html/Work/Elements/MyApprovals:12 html/Work/Elements/MyTickets:20 html/Work/Elements/SelectSearch:31 html/Work/Tickets/Elements/ShowBasics:62 lib/RT/ACE_Overlay.pm:86 msgid "Requestor" msgstr "申请人" @@ -4675,7 +4891,7 @@ msgstr "申请人" msgid "RequestorAddresses" msgstr "申请人地址" -#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 +#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 html/Work/Tickets/Elements/EditPeople:38 msgid "Requestors" msgstr "申请人" @@ -4687,7 +4903,7 @@ msgstr "申请单处理期限" msgid "Reset" msgstr "重设" -#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:49 html/Work/Preferences/Info:29 +#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:63 html/Work/Preferences/Info:34 msgid "Residence" msgstr "住处" @@ -4695,16 +4911,16 @@ msgstr "住处" msgid "Resolution" msgstr "解决状态" -#: html/Ticket/Elements/Tabs:131 html/Work/Tickets/Display.html:34 +#: html/Ticket/Elements/Tabs:131 html/Work/Tickets/Display.html:57 msgid "Resolve" msgstr "解决" -#: html/Ticket/Update.html:136 html/Work/Tickets/Update.html:120 +#: html/Ticket/Update.html:137 #. ($Ticket->id, $Ticket->Subject) msgid "Resolve ticket #%1 (%2)" msgstr "解决申请单 #%1 (%2)" -#: etc/initialdata:331 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1178 +#: etc/initialdata:308 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1215 msgid "Resolved" msgstr "已解决" @@ -4712,7 +4928,7 @@ msgstr "已解决" msgid "Response to requestors" msgstr "回复申请人" -#: html/Edit/Users/Info:45 +#: NOT FOUND IN SOURCE msgid "Responsibility Type" msgstr "责任区分" @@ -4720,11 +4936,11 @@ msgstr "责任区分" msgid "Results" msgstr "结果" -#: html/Search/Elements/PickRestriction:104 html/Work/Search/PickRestriction:84 +#: html/Search/Elements/PickRestriction:104 html/Work/Search/PickRestriction:90 msgid "Results per page" msgstr "每页列出几笔结果" -#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:99 html/User/Prefs.html:71 html/Work/Preferences/Info:51 +#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:99 html/User/Prefs.html:94 html/Work/Preferences/Info:56 msgid "Retype Password" msgstr "再次输入口令" @@ -4764,17 +4980,17 @@ msgstr "权限撤消完毕" msgid "Rights" msgstr "权限及代理人" -#: lib/RT/Interface/Web.pm:794 +#: lib/RT/Interface/Web.pm:857 #. ($object_type) msgid "Rights could not be granted for %1" msgstr "无法将权限赋予 %1" -#: lib/RT/Interface/Web.pm:827 +#: lib/RT/Interface/Web.pm:887 #. ($object_type) msgid "Rights could not be revoked for %1" msgstr "无法撤消 %1 的权限" -#: html/Edit/Groups/Member:55 html/Edit/Groups/Members/List:10 +#: html/Edit/Groups/Member:54 html/Edit/Groups/Members/List:10 msgid "Role Members" msgstr "角色成员" @@ -4790,19 +5006,19 @@ msgstr "角色" msgid "RootApproval" msgstr "交由系统管理员签核" -#: html/Edit/Global/Workflow/Action:27 +#: html/Edit/Global/Workflow/Action:23 msgid "Run Approval" msgstr "签核执行" -#: html/Edit/Global/Basic/Top:72 +#: html/Edit/Global/Basic/Top:81 msgid "SMTPDebug" msgstr "SMTP 侦错纪录" -#: html/Edit/Global/Basic/Top:58 +#: html/Edit/Global/Basic/Top:63 msgid "SMTPFrom" msgstr "SMTP 寄件地址" -#: html/Edit/Global/Basic/Top:56 +#: html/Edit/Global/Basic/Top:61 msgid "SMTPServer" msgstr "SMTP 服务器" @@ -4814,7 +5030,7 @@ msgstr "星期六" msgid "Sat." msgstr "星期六" -#: html/Edit/Elements/104Buttons:72 html/Work/Preferences/index.html:35 +#: html/Edit/Elements/104Buttons:83 html/Work/Preferences/index.html:33 html/Work/Tickets/Elements/EditBasics:63 html/Work/Tickets/Elements/EditLinks:133 html/Work/Tickets/Elements/EditPeople:51 msgid "Save" msgstr "储存" @@ -4840,7 +5056,7 @@ msgstr "讯息通知动作" msgid "Scrip Condition" msgstr "讯息通知条件" -#: lib/RT/Scrip_Overlay.pm:175 +#: lib/RT/Scrip_Overlay.pm:180 msgid "Scrip Created" msgstr "手续新增完毕" @@ -4848,7 +5064,7 @@ msgstr "手续新增完毕" msgid "Scrip Name" msgstr "讯息名称" -#: html/Admin/Elements/EditScrips:83 +#: html/Admin/Elements/EditScrips:85 msgid "Scrip deleted" msgstr "手续删除完毕" @@ -4856,7 +5072,7 @@ msgstr "手续删除完毕" msgid "Scrips" msgstr "手续" -#: html/Edit/Global/autohandler:9 html/Edit/Queues/autohandler:20 +#: html/Edit/Global/autohandler:9 html/Edit/Queues/autohandler:24 msgid "Scrips " msgstr "讯息通知" @@ -4868,7 +5084,7 @@ msgstr "%1 的手续\\n" msgid "Scrips which apply to all queues" msgstr "适用于所有表单的手续" -#: html/Edit/Elements/104Buttons:75 html/Elements/SimpleSearch:26 html/Search/Elements/PickRestriction:125 html/Ticket/Elements/Tabs:158 html/Work/Elements/Tab:43 html/Work/Search/PickRestriction:102 +#: html/Edit/Elements/104Buttons:86 html/Elements/SimpleSearch:26 html/Search/Elements/PickRestriction:125 html/Ticket/Elements/Tabs:158 html/Work/Elements/Tab:45 html/Work/Search/PickRestriction:108 msgid "Search" msgstr "查询" @@ -4884,7 +5100,7 @@ msgstr "签核单查询" msgid "Second-" msgstr "二" -#: html/Edit/Users/Info:41 +#: NOT FOUND IN SOURCE msgid "Second-level Users" msgstr "二阶主管员工" @@ -4964,7 +5180,7 @@ msgstr "多重选项" msgid "SelectSingle" msgstr "单一选项" -#: html/Edit/Elements/PickUsers:85 html/Edit/Users/Add.html:78 +#: html/Edit/Elements/PickUsers:87 html/Edit/Users/Add.html:78 msgid "Selected users:" msgstr "新增对象:" @@ -4972,39 +5188,39 @@ msgstr "新增对象:" msgid "Self Service" msgstr "自助服务" -#: etc/initialdata:131 +#: etc/initialdata:113 msgid "Send mail to all watchers" msgstr "寄信给所有视察员" -#: etc/initialdata:127 +#: etc/initialdata:109 msgid "Send mail to all watchers as a \"comment\"" msgstr "以评论方式寄信给所有视察员" -#: etc/initialdata:122 +#: etc/initialdata:104 msgid "Send mail to requestors and Ccs" msgstr "寄信给申请人及副本收件人" -#: etc/initialdata:117 +#: etc/initialdata:99 msgid "Send mail to requestors and Ccs as a comment" msgstr "以评论方式寄信给申请人及副本收件人" -#: etc/initialdata:96 +#: etc/initialdata:78 msgid "Sends a message to the requestors" msgstr "寄信给申请人" -#: etc/initialdata:135 etc/initialdata:139 +#: etc/initialdata:117 etc/initialdata:121 msgid "Sends mail to explicitly listed Ccs and Bccs" msgstr "寄信给特定的副本及密件副本收件人" -#: etc/initialdata:112 +#: etc/initialdata:94 msgid "Sends mail to the administrative Ccs" msgstr "寄信给管理员副本收件人" -#: etc/initialdata:108 +#: etc/initialdata:90 msgid "Sends mail to the administrative Ccs as a comment" msgstr "以评论寄信给管理员副本收件人" -#: etc/initialdata:100 etc/initialdata:104 +#: etc/initialdata:82 etc/initialdata:86 msgid "Sends mail to the owner" msgstr "寄信给申请人" @@ -5020,7 +5236,11 @@ msgstr "09" msgid "September" msgstr "九月" -#: html/Edit/Users/Info:39 +#: NOT FOUND IN SOURCE +msgid "Setting %1's 'Disabled' property to %2" +msgstr "%1 的「停用」属性已设为 %2" + +#: NOT FOUND IN SOURCE msgid "Shift Type" msgstr "班别属性" @@ -5088,7 +5308,7 @@ msgstr "登记成为申请人或副本收件人" msgid "Sign up as a ticket or queue AdminCc" msgstr "登记成为管理员副本收件人" -#: html/Admin/Elements/ModifyUser:38 html/Admin/Users/Modify.html:190 html/Admin/Users/Prefs.html:31 html/User/Prefs.html:111 html/Work/Preferences/Info:106 +#: html/Admin/Elements/ModifyUser:38 html/Admin/Users/Modify.html:190 html/Admin/Users/Prefs.html:31 html/Edit/Users/Info:52 html/User/Prefs.html:148 html/Work/Preferences/Info:113 msgid "Signature" msgstr "签名档" @@ -5100,7 +5320,7 @@ msgstr "使用者:%1" msgid "Single" msgstr "单一" -#: html/Elements/Header:50 +#: html/Edit/Elements/104Top:21 html/Elements/Header:50 msgid "Skip Menu" msgstr "略过选单" @@ -5112,7 +5332,7 @@ msgstr "顺序" msgid "Sort key" msgstr "排序方式" -#: html/Search/Elements/PickRestriction:108 html/Work/Search/PickRestriction:89 +#: html/Search/Elements/PickRestriction:108 html/Work/Search/PickRestriction:95 msgid "Sort results by" msgstr "结果排序方式" @@ -5120,7 +5340,7 @@ msgstr "结果排序方式" msgid "SortOrder" msgstr "排序顺序" -#: html/Work/Elements/List:8 html/Work/Elements/MyApprovals:11 +#: html/Admin/Elements/EditScrip:80 html/Edit/Global/Scrip/Top:75 html/Work/Elements/List:8 html/Work/Elements/MyApprovals:11 msgid "Stage" msgstr "关卡" @@ -5140,7 +5360,7 @@ msgstr "延宕" msgid "Start page" msgstr "首页" -#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:34 +#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:35 html/Work/Tickets/Elements/EditBasics:35 msgid "Started" msgstr "实际起始日" @@ -5148,7 +5368,7 @@ msgstr "实际起始日" msgid "Started date '%1' could not be parsed" msgstr "无法解读起始日期 '%1" -#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:30 +#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:31 html/Work/Tickets/Elements/EditBasics:26 msgid "Starts" msgstr "应起始日" @@ -5160,19 +5380,19 @@ msgstr "应起始日" msgid "Starts date '%1' could not be parsed" msgstr "无法解读起始日期 '%1" -#: html/Admin/Elements/ModifyUser:81 html/Admin/Users/Modify.html:137 html/User/Prefs.html:93 html/Work/Preferences/Info:82 +#: html/Admin/Elements/ModifyUser:81 html/Admin/Users/Modify.html:137 html/User/Prefs.html:126 html/Work/Preferences/Info:85 msgid "State" msgstr "州" -#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Search/Elements/PickRestriction:73 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:37 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:59 html/Work/Elements/List:15 html/Work/Elements/MyRequests:12 html/Work/Elements/MyTickets:12 html/Work/Search/PickRestriction:54 html/Work/Tickets/Update.html:22 lib/RT/Ticket_Overlay.pm:1172 lib/RT/Tickets_Overlay.pm:908 +#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Search/Elements/PickRestriction:73 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:37 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:59 html/Work/Elements/List:15 html/Work/Elements/MyRequests:18 html/Work/Elements/MyTickets:18 html/Work/Search/PickRestriction:54 html/Work/Tickets/Elements/EditBasics:19 html/Work/Tickets/Update.html:22 lib/RT/Ticket_Overlay.pm:1209 lib/RT/Tickets_Overlay.pm:927 msgid "Status" msgstr "现况" -#: etc/initialdata:317 +#: etc/initialdata:294 msgid "Status Change" msgstr "现况改变时" -#: lib/RT/Transaction_Overlay.pm:528 +#: lib/RT/Transaction_Overlay.pm:477 #. ($self->loc($self->OldValue), $self->loc($self->NewValue)) msgid "Status changed from %1 to %2" msgstr "现况从 %1 改为 %2" @@ -5193,25 +5413,25 @@ msgstr "强制承办申请单" msgid "StealTicket" msgstr "强制承办申请单" -#: lib/RT/Transaction_Overlay.pm:587 +#: lib/RT/Transaction_Overlay.pm:545 #. ($Old->Name) msgid "Stolen from %1 " -msgstr "被 %1 强制更换 " +msgstr "承办人从 %1 强制更换" -#: html/Edit/Groups/Member:69 +#: html/Edit/Groups/Member:68 msgid "Subgroup" msgstr "子群组" -#: html/Elements/MyRequests:28 html/Elements/MyTickets:28 html/Search/Bulk.html:135 html/Search/Elements/PickRestriction:42 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:27 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:75 html/Work/Elements/MyApprovals:9 html/Work/Elements/MyRequests:10 html/Work/Elements/MyTickets:10 html/Work/Search/Bulk.html:87 html/Work/Search/PickRestriction:22 html/Work/Tickets/Create.html:122 lib/RT/Ticket_Overlay.pm:1168 lib/RT/Tickets_Overlay.pm:987 +#: html/Elements/MyRequests:28 html/Elements/MyTickets:28 html/Search/Bulk.html:135 html/Search/Elements/PickRestriction:42 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:27 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:75 html/Work/Elements/MyApprovals:9 html/Work/Elements/MyRequests:16 html/Work/Elements/MyTickets:16 html/Work/Search/Bulk.html:87 html/Work/Search/PickRestriction:22 html/Work/Tickets/Elements/AddSubject:8 html/Work/Tickets/Elements/EditBasics:8 html/Work/Tickets/Elements/ShowBasics:36 html/Work/Tickets/Elements/ShowSubject:8 lib/RT/Ticket_Overlay.pm:1205 lib/RT/Tickets_Overlay.pm:1006 msgid "Subject" msgstr "主题" -#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609 +#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:795 lib/RT/Transaction_Overlay.pm:567 #. ($self->Data) msgid "Subject changed to %1" msgstr "标题已改为 %1" -#: html/Elements/Submit:58 html/Work/Search/Bulk.html:103 +#: html/Edit/Users/Info:71 html/Elements/Submit:58 html/Work/Search/Bulk.html:103 msgid "Submit" msgstr "送出" @@ -5219,7 +5439,7 @@ msgstr "送出" msgid "Submit Workflow" msgstr "送出流程" -#: lib/RT/Group_Overlay.pm:748 +#: lib/RT/Group_Overlay.pm:746 msgid "Succeeded" msgstr "设定成功" @@ -5235,6 +5455,18 @@ msgstr "星期日" msgid "SuperUser" msgstr "系统管理员" +#: html/Edit/Global/Basic/Top:29 +msgid "Sync now" +msgstr "执行同步" + +#: html/Edit/Global/Basic/Top:87 +msgid "Sync104HRMS" +msgstr "自动同步104HRMS" + +#: NOT FOUND IN SOURCE +msgid "Synchronizing HRMS data. This may take a while..." +msgstr "正在同步化 HRMS 人事系统数据。请稍待..." + #: html/User/Elements/DelegateRights:76 msgid "System" msgstr "系统" @@ -5243,7 +5475,7 @@ msgstr "系统" msgid "System Defined" msgstr "系统定义" -#: html/Admin/Elements/SelectRights:80 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:793 lib/RT/Interface/Web.pm:826 +#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:856 lib/RT/Interface/Web.pm:886 msgid "System Error" msgstr "系统错误" @@ -5255,7 +5487,7 @@ msgstr "系统错误。设定权限失败。" msgid "System Error. right not granted" msgstr "系统错误。设定权限失败。" -#: html/Edit/Users/index.html:122 +#: html/Edit/Users/index.html:95 msgid "System Rights" msgstr "系统权限" @@ -5279,14 +5511,18 @@ msgstr "系统群组" msgid "SystemInternal" msgstr "系统内部用" -#: etc/initialdata:59 etc/initialdata:65 etc/initialdata:71 +#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 msgid "SystemRolegroup for internal use" msgstr "内部使用的系统角色群组" -#: lib/RT/CurrentUser.pm:319 +#: lib/RT/CurrentUser.pm:318 msgid "TEST_STRING" msgstr "TEST_STRING" +#: NOT FOUND IN SOURCE +msgid "TabbedUI" +msgstr "页签接口" + #: html/Ticket/Elements/Tabs:142 msgid "Take" msgstr "受理" @@ -5299,11 +5535,11 @@ msgstr "自行承办申请单" msgid "TakeTicket" msgstr "自行承办申请单" -#: lib/RT/Transaction_Overlay.pm:573 +#: lib/RT/Transaction_Overlay.pm:530 msgid "Taken" msgstr "已受理" -#: html/Admin/Elements/EditScrip:80 +#: html/Admin/Elements/EditScrip:88 msgid "Template" msgstr "模板" @@ -5328,7 +5564,7 @@ msgstr "通知模板名称" msgid "Template deleted" msgstr "模板已删除" -#: lib/RT/Scrip_Overlay.pm:152 +#: lib/RT/Scrip_Overlay.pm:156 msgid "Template not found" msgstr "找不到模板" @@ -5336,7 +5572,7 @@ msgstr "找不到模板" msgid "Template not found\\n" msgstr "找不到模板\\n" -#: lib/RT/Template_Overlay.pm:352 +#: lib/RT/Template_Overlay.pm:359 msgid "Template parsed" msgstr "模板剖析完毕" @@ -5344,7 +5580,7 @@ msgstr "模板剖析完毕" msgid "Templates" msgstr "模板" -#: html/Edit/Global/autohandler:8 html/Edit/Queues/autohandler:19 +#: html/Edit/Global/autohandler:8 html/Edit/Queues/autohandler:23 msgid "Templates " msgstr "通知模板" @@ -5352,7 +5588,7 @@ msgstr "通知模板" msgid "Templates for %1\\n" msgstr "找不到 %1 的模板\\n" -#: lib/RT/Interface/Web.pm:894 +#: lib/RT/Interface/Web.pm:954 msgid "That is already the current value" msgstr "已经是目前字段的值" @@ -5360,7 +5596,7 @@ msgstr "已经是目前字段的值" msgid "That is not a value for this custom field" msgstr "这不是该自订字段的值" -#: lib/RT/Ticket_Overlay.pm:1908 +#: lib/RT/Ticket_Overlay.pm:1926 msgid "That is the same value" msgstr "同样的值" @@ -5373,7 +5609,7 @@ msgstr "这项单位已经拥有该权限" msgid "That principal is already a %1 for this queue" msgstr "这项单位已经是这个表单的 %1" -#: lib/RT/Ticket_Overlay.pm:1442 +#: lib/RT/Ticket_Overlay.pm:1460 #. ($self->loc($args{'Type'})) msgid "That principal is already a %1 for this ticket" msgstr "这项单位已经是这份申请单的 %1" @@ -5383,16 +5619,16 @@ msgstr "这项单位已经是这份申请单的 %1" msgid "That principal is not a %1 for this queue" msgstr "这项单位不是这个表单的 %1" -#: lib/RT/Ticket_Overlay.pm:1559 +#: lib/RT/Ticket_Overlay.pm:1577 #. ($args{'Type'}) msgid "That principal is not a %1 for this ticket" msgstr "这项单位不是这份申请单的 %1" -#: lib/RT/Ticket_Overlay.pm:1904 +#: lib/RT/Ticket_Overlay.pm:1922 msgid "That queue does not exist" msgstr "此表单不存在" -#: lib/RT/Ticket_Overlay.pm:3246 +#: lib/RT/Ticket_Overlay.pm:3293 msgid "That ticket has unresolved dependencies" msgstr "这份申请单有尚未解决的附属申请单" @@ -5400,27 +5636,27 @@ msgstr "这份申请单有尚未解决的附属申请单" msgid "That user already has that right" msgstr "使用者已具有该项权限" -#: lib/RT/Ticket_Overlay.pm:3056 +#: lib/RT/Ticket_Overlay.pm:3097 msgid "That user already owns that ticket" msgstr "该使用者已经承办这份申请单" -#: lib/RT/Ticket_Overlay.pm:3028 +#: lib/RT/Ticket_Overlay.pm:3069 msgid "That user does not exist" msgstr "使用者不存在" -#: lib/RT/User_Overlay.pm:374 +#: lib/RT/User_Overlay.pm:381 msgid "That user is already privileged" msgstr "这名使用者已经是内部成员" -#: lib/RT/User_Overlay.pm:395 +#: lib/RT/User_Overlay.pm:402 msgid "That user is already unprivileged" msgstr "这名使用者属于非内部成员群组" -#: lib/RT/User_Overlay.pm:387 +#: lib/RT/User_Overlay.pm:394 msgid "That user is now privileged" msgstr "使用者加入内部成员群组完毕" -#: lib/RT/User_Overlay.pm:408 +#: lib/RT/User_Overlay.pm:415 msgid "That user is now unprivileged" msgstr "这名使用者已加入非内部成员群组" @@ -5428,7 +5664,7 @@ msgstr "这名使用者已加入非内部成员群组" msgid "That user is now unprivilegedileged" msgstr "这名使用者已加入非内部成员群组" -#: lib/RT/Ticket_Overlay.pm:3049 +#: lib/RT/Ticket_Overlay.pm:3090 msgid "That user may not own tickets in that queue" msgstr "使用者可能没有承办表单里的申请单" @@ -5448,7 +5684,7 @@ msgstr "申请单的副本收件人" msgid "The administrative CC of a ticket" msgstr "申请单的管理员副本收件人" -#: lib/RT/Ticket_Overlay.pm:2235 +#: lib/RT/Ticket_Overlay.pm:2255 msgid "The comment has been recorded" msgstr "评论已被纪录" @@ -5460,7 +5696,7 @@ msgstr "下列命令会找到 'general' 表单内所有运作中的申请单, msgid "The following commands were not proccessed:\\n\\n" msgstr "以下命令未被执行:\\n\\n" -#: lib/RT/Interface/Web.pm:897 +#: lib/RT/Interface/Web.pm:957 msgid "The new value has been set." msgstr "新的字段值设定完成。" @@ -5488,7 +5724,7 @@ msgstr "申请单 %1 %2 (%3)\\n" msgid "This tool allows the user to run arbitrary perl modules from within RT." msgstr "此工具程序会让使用者经由 RT 执行任意命令。" -#: lib/RT/Transaction_Overlay.pm:251 +#: lib/RT/Transaction_Overlay.pm:200 msgid "This transaction appears to have no content" msgstr "此项更动报告没有内容" @@ -5509,7 +5745,7 @@ msgstr "星期四" msgid "Thu." msgstr "星期四" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:163 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:163 html/Edit/Global/Workflow/Condition:24 msgid "Ticket" msgstr "申请单" @@ -5531,7 +5767,7 @@ msgstr "更新申请单 #%1 的全部信息:%2" msgid "Ticket #%1: %2" msgstr "申请单 #%1: %2" -#: lib/RT/Ticket_Overlay.pm:595 lib/RT/Ticket_Overlay.pm:616 +#: lib/RT/Ticket_Overlay.pm:632 lib/RT/Ticket_Overlay.pm:653 #. ($self->Id, $QueueObj->Name) msgid "Ticket %1 created in queue '%2'" msgstr "申请单 #%1 成功新增于 '%2' 表单" @@ -5541,12 +5777,12 @@ msgstr "申请单 #%1 成功新增于 '%2' 表单" msgid "Ticket %1 loaded\\n" msgstr "加载申请单 %1\\n" -#: html/Search/Bulk.html:212 html/Work/Search/Bulk.html:169 +#: html/Search/Bulk.html:213 html/Work/Search/Bulk.html:169 #. ($Ticket->Id,$_) msgid "Ticket %1: %2" msgstr "申请单 %1:%2" -#: html/Edit/Queues/Basic/Top:28 html/Edit/Queues/List:16 html/Work/Queues/List:9 +#: html/Edit/Queues/Basic/Top:30 html/Edit/Queues/List:30 html/Work/Queues/List:9 msgid "Ticket Due" msgstr "表单处理期限" @@ -5567,11 +5803,11 @@ msgstr "申请单编号" msgid "Ticket Processing Due" msgstr "表单运行期限" -#: etc/initialdata:332 +#: etc/initialdata:309 msgid "Ticket Resolved" msgstr "申请单已解决" -#: html/Edit/Queues/Basic/Top:18 html/Edit/Queues/Category/List:6 html/Edit/Queues/Category/Top:7 html/Edit/Queues/List:7 html/Edit/Queues/index.html:31 html/Work/Delegates/List:7 html/Work/Delegates/index.html:11 html/Work/Elements/List:12 html/Work/Elements/SelectSearch:9 html/Work/Queues/List:6 html/Work/Queues/Select.html:12 html/Work/Queues/index.html:11 html/Work/Tickets/Create.html:42 html/Work/Tickets/Elements/ShowBasics:33 +#: html/Edit/Queues/Basic/Top:20 html/Edit/Queues/Category/List:6 html/Edit/Queues/Category/Top:7 html/Edit/Queues/List:21 html/Work/Delegates/List:7 html/Work/Delegates/index.html:11 html/Work/Elements/List:12 html/Work/Elements/SelectSearch:9 html/Work/Queues/List:6 html/Work/Queues/Select.html:12 html/Work/Queues/index.html:11 html/Work/Tickets/Create.html:43 html/Work/Tickets/Elements/ShowBasics:34 msgid "Ticket Type" msgstr "表单种类" @@ -5579,19 +5815,19 @@ msgstr "表单种类" msgid "Ticket attachment" msgstr "申请单附件" -#: lib/RT/Tickets_Overlay.pm:1166 +#: lib/RT/Tickets_Overlay.pm:1185 msgid "Ticket content" msgstr "申请单内容" -#: lib/RT/Tickets_Overlay.pm:1212 +#: lib/RT/Tickets_Overlay.pm:1231 msgid "Ticket content type" msgstr "申请单内容类别" -#: lib/RT/Ticket_Overlay.pm:485 lib/RT/Ticket_Overlay.pm:494 lib/RT/Ticket_Overlay.pm:504 lib/RT/Ticket_Overlay.pm:605 +#: lib/RT/Ticket_Overlay.pm:520 lib/RT/Ticket_Overlay.pm:529 lib/RT/Ticket_Overlay.pm:539 lib/RT/Ticket_Overlay.pm:642 msgid "Ticket could not be created due to an internal error" msgstr "内部错误,无法新增申请单" -#: lib/RT/Transaction_Overlay.pm:520 +#: lib/RT/Transaction_Overlay.pm:469 msgid "Ticket created" msgstr "申请单新增完毕" @@ -5599,7 +5835,7 @@ msgstr "申请单新增完毕" msgid "Ticket creation failed" msgstr "申请单新增失败" -#: lib/RT/Transaction_Overlay.pm:525 +#: lib/RT/Transaction_Overlay.pm:474 msgid "Ticket deleted" msgstr "申请单删除完毕" @@ -5615,7 +5851,7 @@ msgstr "申请单删除完毕" msgid "Ticket not found" msgstr "找不到申请单" -#: etc/initialdata:318 +#: etc/initialdata:295 msgid "Ticket status changed" msgstr "申请单现况已改变" @@ -5627,16 +5863,24 @@ msgstr "申请单视察员" msgid "Tickets" msgstr "申请单" -#: lib/RT/Tickets_Overlay.pm:1383 +#: lib/RT/Tickets_Overlay.pm:1402 #. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) msgid "Tickets %1 %2" msgstr "申请单 %1 %2" -#: lib/RT/Tickets_Overlay.pm:1348 +#: lib/RT/Tickets_Overlay.pm:1367 #. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})) msgid "Tickets %1 by %2" msgstr "申请单 %1 (%2)" +#: NOT FOUND IN SOURCE +msgid "Tickets I own" +msgstr "待处理的申请单" + +#: NOT FOUND IN SOURCE +msgid "Tickets I requested" +msgstr "送出的申请单" + #: html/Elements/ViewUser:25 #. ($name) msgid "Tickets from %1" @@ -5646,15 +5890,15 @@ msgstr "%1 的申请单" msgid "Tickets which depend on this approval:" msgstr "批准之后,可接续处理:" -#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 +#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 html/Work/Tickets/Elements/EditBasics:32 msgid "Time Left" msgstr "剩馀时间" -#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42 +#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42 html/Work/Tickets/Elements/EditBasics:24 msgid "Time Worked" msgstr "处理时间" -#: lib/RT/Tickets_Overlay.pm:1139 +#: lib/RT/Tickets_Overlay.pm:1158 msgid "Time left" msgstr "剩馀时间" @@ -5662,7 +5906,7 @@ msgstr "剩馀时间" msgid "Time to display" msgstr "显示时间" -#: lib/RT/Tickets_Overlay.pm:1115 +#: lib/RT/Tickets_Overlay.pm:1134 msgid "Time worked" msgstr "已处理时间" @@ -5670,7 +5914,7 @@ msgstr "已处理时间" msgid "TimeLeft" msgstr "剩馀时间" -#: lib/RT/Ticket_Overlay.pm:1173 +#: lib/RT/Ticket_Overlay.pm:1210 msgid "TimeWorked" msgstr "已处理时间" @@ -5682,32 +5926,40 @@ msgstr "产生这次更动的差异档:" msgid "To generate a diff of this commit:\\n" msgstr "产生这次更动的差异档:\\n" -#: lib/RT/Ticket_Overlay.pm:1176 +#: lib/RT/Ticket_Overlay.pm:1213 msgid "Told" msgstr "告知日期" -#: html/Edit/Elements/Page:46 +#: html/Edit/Elements/Page:47 msgid "Total" msgstr "页" -#: etc/initialdata:239 +#: etc/initialdata:237 msgid "Transaction" msgstr "更动" -#: lib/RT/Transaction_Overlay.pm:640 +#: lib/RT/Transaction_Overlay.pm:666 #. ($self->Data) msgid "Transaction %1 purged" msgstr "清除更动报告 %1" -#: lib/RT/Transaction_Overlay.pm:177 +#: lib/RT/Transaction_Overlay.pm:126 msgid "Transaction Created" msgstr "更动报告已新增" -#: lib/RT/Transaction_Overlay.pm:88 +#: lib/RT/Transaction_Overlay.pm:90 msgid "Transaction->Create couldn't, as you didn't specify a ticket id" msgstr "未指定申请单编号,无法新增更动" -#: lib/RT/Transaction_Overlay.pm:699 +#: NOT FOUND IN SOURCE +msgid "TransactionBatch" +msgstr "批次更动时" + +#: NOT FOUND IN SOURCE +msgid "TransactionCreate" +msgstr "新增更动时" + +#: lib/RT/Transaction_Overlay.pm:721 msgid "Transactions are immutable" msgstr "不可更改更动报告" @@ -5723,7 +5975,7 @@ msgstr "星期二" msgid "Tue." msgstr "星期二" -#: html/Admin/Elements/EditCustomField:43 html/Admin/Elements/ModifyTemplateAsWorkflow:135 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1174 lib/RT/Tickets_Overlay.pm:959 +#: html/Admin/Elements/EditCustomField:43 html/Admin/Elements/ModifyTemplateAsWorkflow:135 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1211 lib/RT/Tickets_Overlay.pm:978 msgid "Type" msgstr "类别" @@ -5739,7 +5991,7 @@ msgstr "外部系统登入帐号" msgid "UnixUsername" msgstr "外部系统登入帐号" -#: lib/RT/Attachment_Overlay.pm:273 lib/RT/Attachment_Overlay.pm:303 +#: lib/RT/Attachment_Overlay.pm:281 lib/RT/Attachment_Overlay.pm:313 #. ($self->ContentEncoding) msgid "Unknown ContentEncoding %1" msgstr "不可解的内容文字编码方式 %1" @@ -5748,11 +6000,11 @@ msgstr "不可解的内容文字编码方式 %1" msgid "Unlimited" msgstr "全数显示" -#: etc/initialdata:50 +#: etc/initialdata:32 msgid "Unprivileged" msgstr "非内部成员" -#: lib/RT/Transaction_Overlay.pm:569 +#: lib/RT/Transaction_Overlay.pm:526 msgid "Untaken" msgstr "未被受理" @@ -5760,7 +6012,7 @@ msgstr "未被受理" msgid "Up" msgstr "上一页" -#: html/Elements/MyTickets:63 html/Search/Bulk.html:32 html/Work/Elements/MyTickets:72 html/Work/Search/Bulk.html:10 html/Work/Tickets/Elements/EditCustomFieldEntries:82 +#: html/Elements/MyTickets:63 html/Search/Bulk.html:32 html/Work/Elements/MyTickets:83 html/Work/Search/Bulk.html:10 html/Work/Tickets/Elements/EditCustomFieldEntries:63 msgid "Update" msgstr "处理" @@ -5784,7 +6036,7 @@ msgstr "更新电子邮件信箱" msgid "Update name" msgstr "更新帐号" -#: lib/RT/Interface/Web.pm:409 +#: lib/RT/Interface/Web.pm:467 msgid "Update not recorded." msgstr "更新未被记录" @@ -5804,21 +6056,21 @@ msgstr "更新申请单" msgid "Update ticket # %1" msgstr "更新申请单 # %1" -#: html/SelfService/Update.html:24 html/SelfService/Update.html:46 +#: html/SelfService/Update.html:24 html/SelfService/Update.html:63 #. ($Ticket->id) msgid "Update ticket #%1" msgstr "更新申请单 #%1" -#: html/Ticket/Update.html:138 html/Work/Tickets/Update.html:122 +#: html/Ticket/Update.html:139 #. ($Ticket->id, $Ticket->Subject) msgid "Update ticket #%1 (%2)" msgstr "更新申请单 #%1 (%2)" -#: lib/RT/Interface/Web.pm:407 +#: lib/RT/Interface/Web.pm:465 msgid "Update type was neither correspondence nor comment." msgstr "更新的内容并非申请单回复也不是评论" -#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:50 lib/RT/Ticket_Overlay.pm:1177 +#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1214 msgid "Updated" msgstr "前次更新" @@ -5842,31 +6094,31 @@ msgstr "找不到使用者 '%1'" msgid "User '%1' not found\\n" msgstr "找不到使用者 '%1'\\n" -#: etc/initialdata:142 etc/initialdata:209 +#: etc/initialdata:124 etc/initialdata:191 msgid "User Defined" msgstr "使用者自订" -#: html/Admin/Users/Prefs.html:58 html/Edit/Users/List:13 html/Edit/Users/Top:42 +#: html/Admin/Users/Prefs.html:58 msgid "User ID" msgstr "使用者 ID" -#: html/Elements/SelectUsers:25 +#: html/Edit/Elements/SelectUsers:3 html/Elements/SelectUsers:25 msgid "User Id" msgstr "使用者 ID" -#: html/Edit/Elements/PickUsers:12 html/Edit/Global/UserRight/List:7 html/Edit/Global/UserRight/Top:9 html/Edit/Users/Add.html:13 html/Edit/Users/List:5 html/Edit/Users/Search.html:23 html/Edit/Users/Top:8 html/Work/Delegates/Info:60 html/Work/Tickets/Cc:10 +#: html/Edit/Elements/PickUsers:12 html/Edit/Global/UserRight/List:7 html/Edit/Global/UserRight/Top:9 html/Edit/Users/Add.html:13 html/Edit/Users/Search.html:23 html/Work/Delegates/Info:60 html/Work/Tickets/Cc:10 msgid "User Number" msgstr "员工编号" -#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 html/Edit/Global/autohandler:11 html/Edit/Queues/autohandler:22 +#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 html/Edit/Global/autohandler:11 html/Edit/Queues/autohandler:26 msgid "User Rights" msgstr "使用者权限" -#: html/Edit/Elements/Tab:32 +#: html/Edit/Elements/Tab:34 msgid "User Setup" msgstr "使用者设定" -#: html/Edit/Users/Info:38 +#: NOT FOUND IN SOURCE msgid "User Shift" msgstr "员工班别" @@ -5875,18 +6127,34 @@ msgstr "员工班别" msgid "User could not be created: %1" msgstr "无法新增使用者:%1" -#: lib/RT/User_Overlay.pm:321 +#: lib/RT/User_Overlay.pm:326 msgid "User created" msgstr "使用者新增完毕" +#: NOT FOUND IN SOURCE +msgid "User created: %1" +msgstr "使用者 %1 新增完毕" + +#: NOT FOUND IN SOURCE +msgid "User created: %1 (%2)" +msgstr "使用者 %1 (%2) 新增完毕" + #: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68 msgid "User defined groups" msgstr "使用者定义的群组" +#: lib/RT/User_Overlay.pm:580 lib/RT/User_Overlay.pm:597 +msgid "User loaded" +msgstr "已加载使用者" + #: NOT FOUND IN SOURCE msgid "User notified" msgstr "已通知使用者" +#: NOT FOUND IN SOURCE +msgid "User renamed from %1 to %2" +msgstr "使用者 %1 已改名为 %2" + #: html/Admin/Users/Prefs.html:24 html/Admin/Users/Prefs.html:28 msgid "User view" msgstr "使用者私人数据" @@ -5899,7 +6167,7 @@ msgstr "使用者自定" msgid "Username" msgstr "帐号" -#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/User/Groups/Members.html:57 html/Work/Tickets/Elements/ShowTransaction:8 +#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/Edit/Groups/Admin:9 html/User/Groups/Members.html:57 html/Work/Tickets/Elements/ShowTransaction:11 msgid "Users" msgstr "使用者" @@ -5907,7 +6175,7 @@ msgstr "使用者" msgid "Users matching search criteria" msgstr "符合查询条件的使用者" -#: html/Search/Elements/PickRestriction:50 html/Work/Search/PickRestriction:31 +#: NOT FOUND IN SOURCE msgid "ValueOfQueue" msgstr "选择表单" @@ -5927,7 +6195,7 @@ msgstr "以管理员副本收件人身份视察" msgid "Watcher loaded" msgstr "成功加载视察员信息" -#: html/Admin/Elements/QueueTabs:41 +#: html/Admin/Elements/QueueTabs:41 html/Edit/Elements/SelectQueues:5 msgid "Watchers" msgstr "视察员" @@ -5943,55 +6211,55 @@ msgstr "星期三" msgid "Wed." msgstr "星期三" -#: etc/initialdata:533 etc/upgrade/2.1.71:161 html/Edit/Elements/CreateApprovalsQueue:135 +#: etc/initialdata:503 etc/upgrade/2.1.71:161 html/Edit/Elements/CreateApprovalsQueue:135 msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket" msgstr "当申请单通过所有签核后,将此讯息回复到原申请单" -#: etc/initialdata:497 etc/upgrade/2.1.71:135 html/Edit/Elements/CreateApprovalsQueue:107 +#: etc/initialdata:467 etc/upgrade/2.1.71:135 html/Edit/Elements/CreateApprovalsQueue:107 msgid "When a ticket has been approved by any approver, add correspondence to the original ticket" msgstr "当申请单通过某项签核后,将此讯息回复到原申请单" -#: etc/initialdata:156 +#: etc/initialdata:138 msgid "When a ticket is created" msgstr "新增申请单时" -#: etc/initialdata:428 etc/upgrade/2.1.71:79 html/Edit/Elements/CreateApprovalsQueue:51 +#: etc/initialdata:400 etc/upgrade/2.1.71:79 html/Edit/Elements/CreateApprovalsQueue:51 msgid "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" msgstr "签核单新增之后,通知应受理的承办人及管理员副本收件人" -#: etc/initialdata:161 +#: etc/initialdata:143 msgid "When anything happens" msgstr "当任何事情发生时" -#: etc/initialdata:202 +#: etc/initialdata:184 msgid "Whenever a ticket is resolved" msgstr "当申请单解决时" -#: etc/initialdata:188 +#: etc/initialdata:170 msgid "Whenever a ticket's owner changes" msgstr "当申请单更换承办人时" -#: etc/initialdata:196 +#: etc/initialdata:178 msgid "Whenever a ticket's queue changes" msgstr "当申请单更换表单时" -#: etc/initialdata:180 +#: etc/initialdata:162 msgid "Whenever a ticket's status changes" msgstr "当申请单更新现况时" -#: etc/initialdata:210 +#: etc/initialdata:192 msgid "Whenever a user-defined condition occurs" msgstr "当使用者自订的情况发生时" -#: etc/initialdata:174 +#: etc/initialdata:156 msgid "Whenever comments come in" msgstr "当评论送达时" -#: etc/initialdata:167 +#: etc/initialdata:149 msgid "Whenever correspondence comes in" msgstr "当回复送达时" -#: html/Admin/Users/Modify.html:163 html/User/Prefs.html:51 html/Work/Preferences/Info:31 +#: html/Admin/Users/Modify.html:163 html/User/Prefs.html:67 html/Work/Preferences/Info:36 msgid "Work" msgstr "公司" @@ -6020,23 +6288,35 @@ msgstr "流程结束" msgid "Workflow deleted" msgstr "流程已删除" -#: html/Edit/Global/autohandler:10 html/Edit/Queues/autohandler:21 +#: html/Edit/Global/autohandler:10 html/Edit/Queues/autohandler:25 msgid "Workflows" msgstr "流程" -#: html/Edit/Global/Basic/Top:25 +#: html/Edit/Global/CustomField/SelectWritable:5 +msgid "Writable" +msgstr "可读写" + +#: html/autohandler:144 +msgid "XXX CHANGEME You are not an authorized user" +msgstr "XXX CHANGEME 您是未经授权的使用者" + +#: html/Edit/Global/Basic/Top:25 html/Edit/Queues/Basic/Top:82 msgid "Yes" msgstr "是" -#: lib/RT/Ticket_Overlay.pm:3159 +#: lib/RT/Ticket_Overlay.pm:3200 msgid "You already own this ticket" msgstr "您已是这份申请单的承办人" -#: html/autohandler:122 +#: html/autohandler:136 msgid "You are not an authorized user" msgstr "您不是被授权的使用者" -#: lib/RT/Ticket_Overlay.pm:3041 +#: html/Ticket/Elements/ShowTransaction:81 +msgid "You can access it with the Download button on the right." +msgstr "您可以按右方的「下载」键来取得。" + +#: lib/RT/Ticket_Overlay.pm:3082 msgid "You can only reassign tickets that you own or that are unowned" msgstr "祇能重新指派您所承办或是没有承办人的申请单" @@ -6044,7 +6324,7 @@ msgstr "祇能重新指派您所承办或是没有承办人的申请单" msgid "You don't have permission to view that ticket.\\n" msgstr "您没有看那份申请单的权限。\\n" -#: docs/design_docs/string-extraction-guide.txt:47 +#: docs/design_docs/string-extraction-guide.txt:47 lib/RT/StyleGuide.pod:760 #. ($num, $queue) msgid "You found %1 tickets in queue %2" msgstr "您会在表单 %2 找到 %1 的申请单" @@ -6057,11 +6337,11 @@ msgstr "您已注销 RT。" msgid "You have no permission to create tickets in that queue." msgstr "您没有在该表单新增申请单的权限。" -#: lib/RT/Ticket_Overlay.pm:1917 +#: lib/RT/Ticket_Overlay.pm:1935 msgid "You may not create requests in that queue." msgstr "您不能在该表单中提出申请。" -#: html/Edit/Global/Basic/Top:38 +#: html/Edit/Global/Basic/Top:42 msgid "You need to restart the Request Tracker service for saved changes to take effect." msgstr "您必须重新激活 Request Tracker 服务,储存的更动才会生效。" @@ -6077,11 +6357,11 @@ msgstr "您提出的 %1 申请单" msgid "Your RT administrator has misconfigured the mail aliases which invoke RT" msgstr "RT 管理员可能设错了由 RT 寄出的邮件收件人标头档" -#: etc/initialdata:514 etc/upgrade/2.1.71:146 html/Edit/Elements/CreateApprovalsQueue:119 +#: etc/initialdata:484 etc/upgrade/2.1.71:146 html/Edit/Elements/CreateApprovalsQueue:119 msgid "Your request has been approved by %1. Other approvals may still be pending." msgstr "申请单已由 %1 批准。可能还有其它待签核的步骤。" -#: etc/initialdata:552 etc/upgrade/2.1.71:180 html/Edit/Elements/CreateApprovalsQueue:154 +#: etc/initialdata:522 etc/upgrade/2.1.71:180 html/Edit/Elements/CreateApprovalsQueue:154 msgid "Your request has been approved." msgstr "您的申请单已完成签核程序。" @@ -6089,19 +6369,19 @@ msgstr "您的申请单已完成签核程序。" msgid "Your request was rejected" msgstr "您的申请单已被驳回" -#: etc/initialdata:455 +#: NOT FOUND IN SOURCE msgid "Your request was rejected by %1." msgstr "您的申请单已被 %1 驳回。" -#: etc/upgrade/2.1.71:101 html/Edit/Elements/CreateApprovalsQueue:73 +#: etc/initialdata:427 etc/upgrade/2.1.71:101 html/Edit/Elements/CreateApprovalsQueue:73 msgid "Your request was rejected." msgstr "您的申请单已被驳回。" -#: html/autohandler:144 +#: html/autohandler:170 msgid "Your username or password is incorrect" msgstr "您的帐号或口令有误" -#: html/Admin/Elements/ModifyUser:83 html/Admin/Users/Modify.html:143 html/User/Prefs.html:95 html/Work/Preferences/Info:84 +#: html/Admin/Elements/ModifyUser:83 html/Admin/Users/Modify.html:143 html/User/Prefs.html:130 html/Work/Preferences/Info:87 msgid "Zip" msgstr "邮政编码" @@ -6117,6 +6397,10 @@ msgstr "过期" msgid "alert" msgstr "急讯" +#: NOT FOUND IN SOURCE +msgid "approving" +msgstr "待签核" + #: html/User/Elements/DelegateRights:58 #. ($right->PrincipalObj->Object->SelfDescription) msgid "as granted to %1" @@ -6138,11 +6422,11 @@ msgstr "内容" msgid "content-type" msgstr "类型" -#: lib/RT/Ticket_Overlay.pm:2304 +#: lib/RT/Ticket_Overlay.pm:2326 msgid "correspondence (probably) not sent" msgstr "申请单回复(可能)未送出" -#: lib/RT/Ticket_Overlay.pm:2314 +#: lib/RT/Ticket_Overlay.pm:2336 msgid "correspondence sent" msgstr "申请单回复已送出" @@ -6150,7 +6434,7 @@ msgstr "申请单回复已送出" msgid "critical" msgstr "严重" -#: html/Admin/Elements/ModifyQueue:62 html/Admin/Queues/Modify.html:76 html/Edit/Queues/Basic/Top:31 html/Edit/Queues/List:18 html/Work/Queues/List:11 lib/RT/Date.pm:319 +#: html/Admin/Elements/ModifyQueue:62 html/Admin/Queues/Modify.html:76 html/Edit/Queues/Basic/Top:34 html/Edit/Queues/List:32 html/Work/Queues/List:11 lib/RT/Date.pm:319 msgid "days" msgstr "天" @@ -6219,11 +6503,11 @@ msgstr "编号" msgid "info" msgstr "信息" -#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickRestriction:46 html/Search/Elements/PickRestriction:75 html/Search/Elements/PickRestriction:87 html/Work/Search/PickRestriction:27 html/Work/Search/PickRestriction:56 html/Work/Search/PickRestriction:69 +#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickRestriction:46 html/Search/Elements/PickRestriction:75 html/Search/Elements/PickRestriction:87 html/Work/Search/PickRestriction:27 html/Work/Search/PickRestriction:56 html/Work/Search/PickRestriction:75 msgid "is" msgstr "是" -#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88 html/Work/Search/PickRestriction:28 html/Work/Search/PickRestriction:57 html/Work/Search/PickRestriction:70 +#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88 html/Work/Search/PickRestriction:28 html/Work/Search/PickRestriction:57 html/Work/Search/PickRestriction:76 msgid "isn't" msgstr "不是" @@ -6259,11 +6543,15 @@ msgstr "月" msgid "new" msgstr "新建立" +#: html/Admin/Elements/EditCustomFields:42 +msgid "no name" +msgstr "没有名称" + #: html/Admin/Elements/EditScrips:42 msgid "no value" msgstr "没有值" -#: html/Admin/Elements/EditQueueWatchers:26 html/Edit/Groups/Member:40 html/Edit/Groups/Members/Add.html:17 html/Edit/Groups/Members/List:8 html/Edit/Queues/Basic/Top:50 html/Edit/Queues/List:18 html/Ticket/Elements/EditWatchers:27 html/Work/Delegates/Info:37 html/Work/Delegates/Info:48 html/Work/Overview/Info:31 html/Work/Queues/List:11 html/Work/Tickets/Elements/ShowBasics:27 +#: html/Admin/Elements/EditQueueWatchers:26 html/Edit/Groups/Member:40 html/Edit/Groups/Members/Add.html:17 html/Edit/Groups/Members/List:8 html/Edit/Queues/List:32 html/Ticket/Elements/EditWatchers:27 html/Work/Delegates/Info:37 html/Work/Delegates/Info:48 html/Work/Overview/Info:31 html/Work/Queues/List:11 html/Work/Tickets/Elements/EditWatchers:5 html/Work/Tickets/Elements/ShowAttachments:30 html/Work/Tickets/Elements/ShowBasics:27 msgid "none" msgstr "无" @@ -6305,11 +6593,11 @@ msgstr "表单 %1 %2" msgid "rejected" msgstr "已驳回" -#: html/Work/Elements/SelectSearch:21 lib/RT/Queue_Overlay.pm:60 +#: lib/RT/Queue_Overlay.pm:60 msgid "resolved" msgstr "已处理" -#: html/Edit/Global/Basic/Top:48 +#: html/Edit/Global/Basic/Top:53 msgid "rtname" msgstr "服务器名称" @@ -6335,16 +6623,21 @@ msgstr "系统群组 '%1'" msgid "the calling component did not specify why" msgstr "呼叫组件未指明原因" +#: lib/RT/URI/fsck_com_rt.pm:234 +#. ($self->Object->Id) +msgid "ticket #%1" +msgstr "申请单 #%1" + #: lib/RT/Group_Overlay.pm:209 #. ($self->Instance, $self->Type) msgid "ticket #%1 %2" msgstr "申请单 #%1 %2" -#: html/Work/Elements/SelectSearch:27 +#: html/Work/Elements/SelectSearch:28 msgid "till" msgstr "至" -#: html/Edit/Elements/PickUsers:15 html/Edit/Global/Workflow/Condition:30 html/Edit/Users/Add.html:16 html/Edit/Users/Search.html:26 html/Work/Tickets/Cc:13 +#: html/Edit/Elements/PickUsers:15 html/Edit/Global/Workflow/Condition:31 html/Edit/Users/Add.html:16 html/Edit/Users/Search.html:26 html/Work/Tickets/Cc:13 msgid "to" msgstr "到" @@ -6357,7 +6650,7 @@ msgstr "真" msgid "undescribed group %1" msgstr "没有描述的群组 %1" -#: html/Work/Elements/SelectSearch:19 +#: NOT FOUND IN SOURCE msgid "unresolved" msgstr "未处理" diff --git a/rt/lib/RT/I18N/zh_tw.po b/rt/lib/RT/I18N/zh_tw.po index 8c8c86e1f..6688b6a89 100644 --- a/rt/lib/RT/I18N/zh_tw.po +++ b/rt/lib/RT/I18N/zh_tw.po @@ -1,4 +1,4 @@ -# Traditional Chinese localization catalog for Request Tracker (RT) +# Chinese localization catalog for Request Tracker (RT) msgid "" msgstr "" "Last-Translator: Autrijus Tang \n" @@ -40,7 +40,7 @@ msgstr "%*(%1) 件尚未解決的申請單" msgid "%1 %2" msgstr "%1 %2" -#: lib/RT/Tickets_Overlay.pm:771 +#: lib/RT/Tickets_Overlay.pm:790 #. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}) msgid "%1 %2 %3" msgstr "%1 %2 %3" @@ -50,10 +50,11 @@ msgstr "%1 %2 %3" msgid "%1 %2 %3 %4:%5:%6 %7" msgstr "%7-%2-%3 %4:%5:%6 %1" -#: lib/RT/Ticket_Overlay.pm:3532 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Overlay.pm:599 +#: lib/RT/Ticket_Overlay.pm:3588 lib/RT/Transaction_Overlay.pm:514 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Vendor.pm:19 #. ($cf->Name, $new_value->Content) #. ($field, $self->NewValue) #. ($self->Field, $principal->Object->Name) +#. ($field, $new_value) msgid "%1 %2 added" msgstr "%2 已新增為 %1" @@ -62,16 +63,18 @@ msgstr "%2 已新增為 %1" msgid "%1 %2 ago" msgstr "%1 %2 之前" -#: lib/RT/Ticket_Overlay.pm:3538 lib/RT/Transaction_Overlay.pm:564 +#: lib/RT/Ticket_Overlay.pm:3594 lib/RT/Transaction_Overlay.pm:521 lib/RT/Transaction_Vendor.pm:25 #. ($cf->Name, $old_value, $new_value->Content) #. ($field, $self->OldValue, $self->NewValue) +#. ($field, $old_value, $new_value) msgid "%1 %2 changed to %3" msgstr "%1 已從 %2 改為 %3" -#: lib/RT/Ticket_Overlay.pm:3535 lib/RT/Transaction_Overlay.pm:560 lib/RT/Transaction_Overlay.pm:605 +#: lib/RT/Ticket_Overlay.pm:3591 lib/RT/Transaction_Overlay.pm:517 lib/RT/Transaction_Overlay.pm:563 lib/RT/Transaction_Vendor.pm:22 #. ($cf->Name, $old_value) #. ($field, $self->OldValue) #. ($self->Field, $principal->Object->Name) +#. ($field, $old_value) msgid "%1 %2 deleted" msgstr "%2 已自 %1 刪除" @@ -121,17 +124,17 @@ msgstr "%1 - 指定欲使用的條件模組" msgid "%1 - Specify the search module you want to use" msgstr "%1 - 指定欲使用的查詢模組" -#: lib/RT/ScripAction_Overlay.pm:121 +#: lib/RT/ScripAction_Overlay.pm:122 #. ($self->Id) msgid "%1 ScripAction loaded" msgstr "載入手續 %1" -#: html/Edit/Elements/Page:48 +#: html/Edit/Elements/Page:49 #. (scalar $count) msgid "%1 Total" msgstr "共 %1 筆" -#: lib/RT/Ticket_Overlay.pm:3565 +#: lib/RT/Ticket_Overlay.pm:3621 #. ($args{'Value'}, $cf->Name) msgid "%1 added as a value for %2" msgstr "新增 %1 作為 %2 的值" @@ -154,13 +157,13 @@ msgstr "別名 %1 需要可用的申請單編號以處理 %3(出自 %2)" msgid "%1 appears to be a local object, but can't be found in the database" msgstr "%1 看來是個本地物件,卻不在資料庫裡" -#: html/Ticket/Elements/ShowDates:51 lib/RT/Transaction_Overlay.pm:481 +#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:430 #. ($self->BriefDescription , $self->CreatorObj->Name) #. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) msgid "%1 by %2" msgstr "%1 (%2)" -#: lib/RT/Transaction_Overlay.pm:535 lib/RT/Transaction_Overlay.pm:624 lib/RT/Transaction_Overlay.pm:633 lib/RT/Transaction_Overlay.pm:636 +#: lib/RT/Transaction_Overlay.pm:484 lib/RT/Transaction_Overlay.pm:649 lib/RT/Transaction_Overlay.pm:658 lib/RT/Transaction_Overlay.pm:661 #. ($self->Field , ( $self->OldValue || $no_value ) , $self->NewValue) #. ($self->Field , $q1->Name , $q2->Name) #. ($self->Field, $t2->AsString, $t1->AsString) @@ -168,7 +171,7 @@ msgstr "%1 (%2)" msgid "%1 changed from %2 to %3" msgstr "%1 的值從 %2 改為 %3" -#: lib/RT/Interface/Web.pm:893 x:896 +#: lib/RT/Interface/Web.pm:953 msgid "%1 could not be set to %2." msgstr "無法將 %1 設定為 %2。" @@ -176,7 +179,7 @@ msgstr "無法將 %1 設定為 %2。" msgid "%1 couldn't init a transaction (%2)\\n" msgstr "%1 無法初始更新 (%2)\\n" -#: lib/RT/Ticket_Overlay.pm:2830 +#: lib/RT/Ticket_Overlay.pm:2880 #. ($self) msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent." msgstr "%1 無法將現況設成已解決。RT 資料庫內容可能不一致。" @@ -206,12 +209,12 @@ msgstr "%1 是從外部排程程式(如 cron)來對申請單進行操作的工 msgid "%1 is no longer a %2 for this queue." msgstr "%1 已不再是此表單的 %2。" -#: lib/RT/Ticket_Overlay.pm:1569 +#: lib/RT/Ticket_Overlay.pm:1596 #. ($principal->Object->Name, $args{'Type'}) msgid "%1 is no longer a %2 for this ticket." msgstr "%1 已不再是此申請單的 %2。" -#: lib/RT/Ticket_Overlay.pm:3621 +#: lib/RT/Ticket_Overlay.pm:3677 #. ($args{'Value'}, $cf->Name) msgid "%1 is no longer a value for custom field %2" msgstr "%1 已不再是自訂欄位 %2 的值。" @@ -264,17 +267,17 @@ msgstr "%1 會解決在已解決群組裡成員的申請單。" msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request." msgstr "如果 %1 起始申請單依賴於某個鏈結,或是某個鏈結的成員,它將會被延宕。" -#: lib/RT/Transaction_Overlay.pm:433 +#: lib/RT/Transaction_Overlay.pm:382 lib/RT/Transaction_Vendor.pm:37 #. ($self) msgid "%1: no attachment specified" msgstr "%1:未指定附件" -#: html/Ticket/Elements/ShowTransaction:89 html/Work/Tickets/Elements/ShowTransaction:154 +#: html/Ticket/Elements/ShowTransaction:100 html/Work/Tickets/Elements/ShowTransaction:158 #. ($size) msgid "%1b" msgstr "%1 位元組" -#: html/Ticket/Elements/ShowTransaction:86 html/Work/Tickets/Elements/ShowTransaction:151 +#: html/Ticket/Elements/ShowTransaction:97 html/Work/Tickets/Elements/ShowTransaction:155 #. (int($size/102.4)/10) msgid "%1k" msgstr "%1k 位元組" @@ -283,7 +286,7 @@ msgstr "%1k 位元組" msgid "%quant(%1,result) found" msgstr "找到 %1 項結果" -#: lib/RT/Ticket_Overlay.pm:1158 +#: lib/RT/Ticket_Overlay.pm:1185 #. ($args{'Status'}) msgid "'%1' is an invalid value for status" msgstr "'%1' 不是一個合法的狀態值" @@ -300,7 +303,7 @@ msgstr "(點選欲刪除的成員)" msgid "(Check box to delete scrip)" msgstr "(點選欲刪除的手續)" -#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Elements/EditWorkflows:36 html/Admin/Groups/Members.html:51 html/Ticket/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 +#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Elements/EditWorkflows:36 html/Admin/Groups/Members.html:51 html/Ticket/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 html/Work/Tickets/Elements/EditLinks:20 html/Work/Tickets/Elements/EditPeople:36 msgid "(Check box to delete)" msgstr "(點選欲刪除的項目)" @@ -308,7 +311,7 @@ msgstr "(點選欲刪除的項目)" msgid "(Check boxes to delete)" msgstr "(點選欲刪除的項目)" -#: html/Ticket/Create.html:177 +#: html/Ticket/Create.html:178 msgid "(Enter ticket ids or URLs, seperated with spaces)" msgstr "(鍵入申請單編號或網址,以空白分隔)" @@ -342,7 +345,7 @@ msgstr "沒有範本" msgid "(No workflows)" msgstr "沒有流程" -#: html/Ticket/Update.html:83 html/Work/Tickets/Update.html:52 +#: html/Ticket/Update.html:83 html/Work/Tickets/Update.html:56 msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does not change who will receive future updates.)" msgstr "(送出本份更新的密件副本給名單上以逗號隔開的電子郵件位址。這不會更改後續的收件者名單。)" @@ -366,7 +369,7 @@ msgstr "(送出本份更新的副本給名單上以逗號隔開的電子郵件 msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people will receive future updates.)" msgstr "(送出本份更新的副本給名單上以逗號隔開的電子郵件位址。這將會更改後續的收件者名單。)" -#: html/Ticket/Elements/EditCustomFieldEntries:35 html/Work/Tickets/Elements/EditCustomFieldEntries:48 html/Work/Tickets/Elements/ShowCustomFieldEntries:13 +#: html/Ticket/Elements/EditCustomFieldEntries:35 html/Work/Tickets/Elements/EditCustomFieldEntries:43 html/Work/Tickets/Elements/ShowCustomFieldEntries:14 msgid "(delete)" msgstr "(刪除)" @@ -374,7 +377,7 @@ msgstr "(刪除)" msgid "(empty)" msgstr "(空白)" -#: html/Edit/Global/CustomField/index.html:113 html/Edit/Global/Scrip/index.html:111 html/Edit/Global/Template/index.html:106 +#: html/Edit/Elements/Index:87 html/Edit/Global/CustomField/index.html:116 html/Edit/Global/Scrip/index.html:111 html/Edit/Global/Template/index.html:106 msgid "(new)" msgstr "(新增)" @@ -382,23 +385,23 @@ msgstr "(新增)" msgid "(no name listed)" msgstr "(沒有列出姓名)" -#: html/Elements/MyRequests:42 html/Elements/MyTickets:44 html/Work/Elements/MyApprovals:37 html/Work/Elements/MyRequests:42 html/Work/Elements/MyTickets:51 +#: html/Elements/MyRequests:42 html/Elements/MyTickets:44 html/Work/Elements/MyApprovals:37 html/Work/Elements/MyRequests:43 html/Work/Elements/MyTickets:52 msgid "(no subject)" msgstr "(沒有主題)" -#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:60 html/Ticket/Elements/EditCustomFieldValues:52 html/Ticket/Elements/ShowCustomFields:35 html/Work/Elements/EditCustomFieldValues:50 html/Work/Elements/EditCustomFields:32 html/Work/Tickets/Elements/EditCustomFieldValues:33 lib/RT/Transaction_Overlay.pm:534 +#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:64 html/Ticket/Elements/EditCustomFieldValues:52 html/Ticket/Elements/ShowCustomFields:35 html/Work/Elements/EditCustomFieldValues:50 html/Work/Elements/EditCustomFields:32 html/Work/Tickets/Elements/EditCustomFieldValues:33 lib/RT/Transaction_Overlay.pm:483 msgid "(no value)" msgstr "(無)" -#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:115 html/Work/Search/BulkLinks:3 +#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:98 html/Work/Search/BulkLinks:3 html/Work/Tickets/Elements/EditLinks:102 msgid "(only one ticket)" msgstr "(僅能指定一份申請單)" -#: html/Elements/MyRequests:51 html/Elements/MyTickets:54 html/Work/Elements/List:17 html/Work/Elements/MyRequests:52 html/Work/Elements/MyTickets:66 html/Work/Tickets/Elements/ShowBasics:52 +#: html/Elements/MyRequests:51 html/Elements/MyTickets:54 html/Work/Elements/List:17 html/Work/Elements/MyRequests:53 html/Work/Elements/MyTickets:67 html/Work/Tickets/Elements/ShowBasics:52 msgid "(pending approval)" msgstr "(等待簽核)" -#: html/Elements/MyRequests:53 html/Elements/MyTickets:56 html/Work/Elements/MyRequests:54 html/Work/Elements/MyTickets:68 +#: html/Elements/MyRequests:53 html/Elements/MyTickets:56 html/Work/Elements/MyRequests:55 html/Work/Elements/MyTickets:69 msgid "(pending other tickets)" msgstr "(等待其他申請單)" @@ -406,11 +409,11 @@ msgstr "(等待其他申請單)" msgid "(requestor's group)" msgstr "(申請人所屬)" -#: html/Admin/Users/Modify.html:49 +#: html/Admin/Users/Modify.html:49 html/Edit/Users/Info:26 msgid "(required)" msgstr "(必填)" -#: html/Ticket/Elements/ShowTransaction:92 html/Work/Tickets/Elements/ShowTransaction:39 +#: html/Ticket/Elements/ShowTransaction:103 html/Work/Tickets/Elements/ShowTransaction:44 msgid "(untitled)" msgstr "(未命名)" @@ -426,12 +429,12 @@ msgstr "<% $Ticket->Status%>" msgid "<% $_ %>" msgstr "<% $_ %>" -#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 html/Work/Elements/104Header:43 +#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 html/Work/Elements/104Header:43 lib/RT/StyleGuide.pod:767 #. ($m->scomp('/Elements/SelectNewTicketQueue')) msgid " %1" msgstr " %1" -#: etc/initialdata.zh:221 etc/initialdata:203 +#: etc/initialdata:203 msgid "A blank template" msgstr "空白範本" @@ -479,11 +482,11 @@ msgstr "系統使用登錄權限" msgid "Access control" msgstr "存取權限" -#: html/Admin/Elements/EditScrip:56 html/Work/Tickets/Elements/ShowTransaction:18 +#: html/Admin/Elements/EditScrip:56 html/Work/Tickets/Elements/ShowTransaction:21 msgid "Action" msgstr "動作" -#: lib/RT/Scrip_Overlay.pm:146 +#: lib/RT/Scrip_Overlay.pm:148 #. ($args{'ScripAction'}) msgid "Action %1 not found" msgstr "動作 %1 找不到" @@ -496,11 +499,11 @@ msgstr "動作執行完畢" msgid "Action prepared..." msgstr "動作準備完畢..." -#: html/Work/Elements/List:13 html/Work/Elements/SelectSearch:24 html/Work/Tickets/Create.html:28 html/Work/Tickets/Elements/ShowBasics:12 +#: html/Work/Elements/List:13 html/Work/Elements/SelectSearch:25 html/Work/Tickets/Create.html:27 html/Work/Tickets/Elements/ShowBasics:12 msgid "Activated Date" msgstr "申請啟動時間" -#: html/Edit/Elements/104Buttons:71 html/Edit/Elements/ListButtons:7 +#: html/Edit/Elements/104Buttons:82 html/Edit/Elements/ListButtons:7 msgid "Add" msgstr "新增" @@ -512,11 +515,11 @@ msgstr "新增管理員副本收件人" msgid "Add Cc" msgstr "新增副本收件人" -#: html/Ticket/Elements/EditCustomFieldEntries:71 html/Work/Tickets/Elements/ShowCustomFieldEntries:49 +#: html/Ticket/Elements/EditCustomFieldEntries:71 html/Work/Tickets/Elements/ShowCustomFieldEntries:50 msgid "Add Entry" msgstr "新增列" -#: html/Ticket/Create.html:113 html/Ticket/Update.html:98 html/Work/Tickets/Elements/AddAttachments:18 +#: html/Ticket/Create.html:113 html/Ticket/Update.html:98 html/Work/Tickets/Elements/AddAttachments:23 msgid "Add More Files" msgstr "新增更多附件" @@ -577,16 +580,20 @@ msgstr "新增下一項關卡" msgid "Added principal as a %1 for this queue" msgstr "單位已新增為此表單的 %1" -#: lib/RT/Ticket_Overlay.pm:1453 +#: lib/RT/Ticket_Overlay.pm:1480 #. ($self->loc($args{'Type'})) msgid "Added principal as a %1 for this ticket" msgstr "單位已新增為此申請單的 %1" -#: html/Admin/Elements/ModifyUser:75 html/Admin/Users/Modify.html:121 html/User/Prefs.html:87 html/Work/Preferences/Info:77 +#: html/Edit/Global/CustomField/Top:52 +msgid "Additional Hints" +msgstr "額外提示" + +#: html/Admin/Elements/ModifyUser:75 html/Admin/Users/Modify.html:121 html/User/Prefs.html:114 html/Work/Preferences/Info:79 msgid "Address1" msgstr "住址" -#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:89 html/Work/Preferences/Info:79 +#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:118 html/Work/Preferences/Info:81 msgid "Address2" msgstr "住址(續)" @@ -594,7 +601,7 @@ msgstr "住址(續)" msgid "Adjust Blinking Rate" msgstr "調整閃爍速度快慢" -#: html/Edit/Groups/Admin:9 +#: html/Edit/Queues/List:12 msgid "Admin" msgstr "管理員" @@ -602,11 +609,11 @@ msgstr "管理員" msgid "Admin Cc" msgstr "管理員副本" -#: etc/initialdata.zh:303 etc/initialdata:280 +#: etc/initialdata:280 msgid "Admin Comment" msgstr "管理員評論" -#: etc/initialdata.zh:261 etc/initialdata:259 +#: etc/initialdata:259 msgid "Admin Correspondence" msgstr "管理員回覆" @@ -634,7 +641,7 @@ msgstr "管理/群組" msgid "Admin/Queue/Basics" msgstr "管理/表單/基本資訊" -#: html/Edit/Global/Basic/Top:60 +#: html/Edit/Global/Basic/Top:65 msgid "AdminAddress" msgstr "管理員 Email" @@ -642,7 +649,7 @@ msgstr "管理員 Email" msgid "AdminAllPersonalGroups" msgstr "管理所有代理人群組" -#: etc/initialdata.zh:74 etc/initialdata:56 html/Admin/Elements/ModifyTemplateAsWorkflow:155 html/Ticket/Elements/ShowPeople:38 html/Ticket/Update.html:49 lib/RT/ACE_Overlay.pm:88 +#: etc/initialdata:56 html/Admin/Elements/ModifyTemplateAsWorkflow:155 html/Ticket/Elements/ShowPeople:38 html/Ticket/Update.html:49 html/Work/Tickets/Elements/ShowLinks:11 lib/RT/ACE_Overlay.pm:88 msgid "AdminCc" msgstr "管理員副本" @@ -658,7 +665,7 @@ msgstr "管理員回覆" msgid "AdminCustomFields" msgstr "管理自訂欄位" -#: html/Edit/Groups/Admin:12 lib/RT/Group_Overlay.pm:145 +#: lib/RT/Group_Overlay.pm:145 msgid "AdminGroup" msgstr "管理群組" @@ -698,7 +705,7 @@ msgstr "管理使用者" msgid "Administrative" msgstr "行政類" -#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 +#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 html/Work/Tickets/Elements/EditPeople:44 msgid "Administrative Cc" msgstr "管理員副本" @@ -718,7 +725,7 @@ msgstr "晚於" msgid "Age" msgstr "經歷時間" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:172 html/Edit/Global/Workflow/Action:39 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:172 html/Edit/Global/Workflow/Action:35 msgid "Alias" msgstr "執行其他流程" @@ -726,11 +733,11 @@ msgstr "執行其他流程" msgid "Alias for" msgstr "相當於" -#: html/Edit/Queues/index.html:33 html/Work/Delegates/index.html:13 html/Work/Elements/SelectSearch:11 html/Work/Queues/Select.html:14 html/Work/Queues/index.html:13 +#: html/Work/Delegates/index.html:13 html/Work/Elements/SelectSearch:11 html/Work/Queues/Select.html:14 html/Work/Queues/index.html:13 msgid "All" msgstr "全部" -#: etc/initialdata.zh:372 etc/initialdata:348 +#: etc/initialdata:348 msgid "All Approvals Passed" msgstr "完成全部簽核" @@ -738,7 +745,7 @@ msgstr "完成全部簽核" msgid "All Condition" msgstr "所有條件" -#: html/Admin/Elements/EditCustomFields:95 +#: html/Admin/Elements/EditCustomFields:94 msgid "All Custom Fields" msgstr "所有自訂欄位" @@ -751,6 +758,10 @@ msgid "All Users" msgstr "全體員工" #: NOT FOUND IN SOURCE +msgid "All done! Now you can proceed to %1." +msgstr "處理完畢!您現在可以繼續進行 %1。" + +#: NOT FOUND IN SOURCE msgid "Allowance Request" msgstr "福利補助申請" @@ -766,7 +777,7 @@ msgstr "數額" msgid "Any Condition" msgstr "任意條件" -#: html/Edit/Global/Scrip/List:10 html/Edit/Global/Scrip/Top:74 +#: html/Edit/Global/Scrip/List:10 html/Edit/Global/Scrip/Top:86 msgid "Apply Template" msgstr "引用範本" @@ -803,11 +814,11 @@ msgstr "簽核時限" msgid "Approval Notes" msgstr "簽核意見" -#: etc/initialdata.zh:357 etc/initialdata:336 +#: etc/initialdata:336 msgid "Approval Passed" msgstr "完成某項簽核" -#: etc/initialdata.zh:383 etc/initialdata:359 +#: etc/initialdata:359 msgid "Approval Rejected" msgstr "駁回某項簽核" @@ -835,11 +846,11 @@ msgstr "核准" msgid "Approver" msgstr "簽核人" -#: html/Edit/Global/Workflow/Action:29 html/Edit/Global/Workflow/Owner.html:10 +#: html/Edit/Global/Workflow/Action:25 html/Edit/Global/Workflow/Owner.html:10 msgid "Approver Setting" msgstr "執行簽核人設定" -#: etc/initialdata.zh:516 etc/initialdata:486 etc/upgrade/2.1.71:148 html/Edit/Elements/CreateApprovalsQueue:122 +#: etc/initialdata:486 etc/upgrade/2.1.71:148 html/Edit/Elements/CreateApprovalsQueue:122 msgid "Approver's notes: %1" msgstr "簽核備註:%1" @@ -863,15 +874,15 @@ msgstr "您確定要刪除?" msgid "Ascending" msgstr "遞增" -#: html/Search/Bulk.html:136 html/SelfService/Update.html:32 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:98 html/Work/Search/Bulk.html:88 +#: html/Search/Bulk.html:136 html/SelfService/Update.html:47 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:98 html/Work/Search/Bulk.html:88 msgid "Attach" msgstr "附件" -#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 html/Work/Tickets/Elements/AddAttachments:15 +#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 html/Work/Tickets/Elements/AddAttachments:19 msgid "Attach file" msgstr "附加檔案" -#: html/Ticket/Create.html:97 html/Ticket/Update.html:87 html/Work/Tickets/Elements/AddAttachments:6 +#: html/SelfService/Update.html:36 html/Ticket/Create.html:97 html/Ticket/Update.html:87 html/Work/Tickets/Elements/AddAttachments:7 html/Work/Tickets/Elements/ShowAttachments:9 msgid "Attached file" msgstr "現有附件" @@ -879,15 +890,15 @@ msgstr "現有附件" msgid "Attachment '%1' could not be loaded" msgstr "無法載入附件 '%1'" -#: lib/RT/Transaction_Overlay.pm:441 +#: lib/RT/Transaction_Overlay.pm:390 lib/RT/Transaction_Vendor.pm:50 msgid "Attachment created" msgstr "附件新增完畢" -#: lib/RT/Tickets_Overlay.pm:1189 +#: lib/RT/Tickets_Overlay.pm:1208 msgid "Attachment filename" msgstr "附件檔名" -#: html/Ticket/Elements/ShowAttachments:25 html/Work/Tickets/Elements/ShowTransaction:32 +#: html/Ticket/Elements/ShowAttachments:25 html/Work/Tickets/Elements/ShowTransaction:37 msgid "Attachments" msgstr "附件" @@ -915,11 +926,11 @@ msgstr "自動駁回表單" msgid "AutoResolve" msgstr "自動完成表單處理" -#: etc/initialdata.zh:224 etc/initialdata:206 +#: etc/initialdata:206 msgid "Autoreply" msgstr "自動回覆" -#: etc/initialdata.zh:90 etc/initialdata:72 +#: etc/initialdata:72 msgid "Autoreply To Requestors" msgstr "自動對申請人回覆" @@ -927,7 +938,7 @@ msgstr "自動對申請人回覆" msgid "AutoreplyToRequestors" msgstr "自動對申請人回覆" -#: html/Edit/Rights/index.html:16 +#: html/Edit/Rights/index.html:17 msgid "Available Rights:" msgstr "權限項目列表:" @@ -956,19 +967,19 @@ msgstr "%1 的資料錯誤" msgid "Bad transaction number for attachment. %1 should be %2\\n" msgstr "附件的處理號碼錯誤。%1 應為 %2\\n" -#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Edit/Global/autohandler:6 html/Edit/Queues/autohandler:17 html/Edit/Users/index.html:121 html/Ticket/Elements/Tabs:89 html/User/Elements/GroupTabs:37 +#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Edit/Global/autohandler:6 html/Edit/Queues/autohandler:21 html/Edit/Users/index.html:94 html/Ticket/Elements/Tabs:89 html/User/Elements/GroupTabs:37 msgid "Basics" msgstr "基本資訊" -#: html/Ticket/Update.html:81 html/Work/Tickets/Update.html:49 +#: html/Ticket/Update.html:81 html/Work/Tickets/Update.html:53 msgid "Bcc" msgstr "密件副本" -#: html/Admin/Elements/EditScrip:87 html/Admin/Global/GroupRights.html:84 html/Admin/Global/Template.html:45 html/Admin/Global/UserRights.html:53 html/Admin/Global/Workflow.html:46 html/Admin/Groups/GroupRights.html:72 html/Admin/Groups/Members.html:80 html/Admin/Groups/Modify.html:55 html/Admin/Groups/UserRights.html:54 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:44 html/Admin/Queues/UserRights.html:53 html/Admin/Queues/Workflow.html:44 html/User/Groups/Modify.html:55 +#: html/Admin/Elements/EditScrip:95 html/Admin/Global/GroupRights.html:84 html/Admin/Global/Template.html:45 html/Admin/Global/UserRights.html:53 html/Admin/Global/Workflow.html:46 html/Admin/Groups/GroupRights.html:72 html/Admin/Groups/Members.html:80 html/Admin/Groups/Modify.html:55 html/Admin/Groups/UserRights.html:54 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:44 html/Admin/Queues/UserRights.html:53 html/Admin/Queues/Workflow.html:44 html/User/Groups/Modify.html:55 msgid "Be sure to save your changes" msgstr "請別忘了儲存修改。" -#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:321 +#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:320 msgid "Before" msgstr "早於" @@ -980,11 +991,11 @@ msgstr "開始簽核" msgid "Begin From " msgstr "起始日" -#: html/Edit/Users/Info:25 +#: NOT FOUND IN SOURCE msgid "Birthday" msgstr "生日" -#: etc/initialdata.zh:220 etc/initialdata:202 +#: etc/initialdata:202 msgid "Blank" msgstr "空白範本" @@ -1008,7 +1019,7 @@ msgstr "事業部" msgid "Business Unit:" msgstr "事業部:" -#: lib/RT/User_Overlay.pm:1524 +#: lib/RT/User_Overlay.pm:1529 msgid "Can not modify system users" msgstr "無法更改系統使用者" @@ -1024,11 +1035,11 @@ msgstr "不能新增沒有名稱的自訂欄位值" msgid "Can't link a ticket to itself" msgstr "申請單不能鏈結自己。" -#: lib/RT/Ticket_Overlay.pm:2807 +#: lib/RT/Ticket_Overlay.pm:2857 msgid "Can't merge into a merged ticket. You should never get this error" msgstr "不能整合進已整合過的申請單。這個錯誤不該發生。" -#: lib/RT/Ticket_Overlay.pm:2625 lib/RT/Ticket_Overlay.pm:2694 +#: lib/RT/Ticket_Overlay.pm:2659 lib/RT/Ticket_Overlay.pm:2738 msgid "Can't specifiy both base and target" msgstr "不能同時指定起始申請單與目的申請單" @@ -1036,7 +1047,7 @@ msgstr "不能同時指定起始申請單與目的申請單" msgid "Cancel" msgstr "取消" -#: html/autohandler:113 +#: html/autohandler:126 #. ($msg) msgid "Cannot create user: %1" msgstr "無法新增使用者:%1" @@ -1053,7 +1064,7 @@ msgstr "分類管理" msgid "Category" msgstr "分類" -#: etc/initialdata.zh:68 etc/initialdata:50 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:44 html/Ticket/Update.html:76 html/Work/Tickets/Update.html:43 lib/RT/ACE_Overlay.pm:87 +#: etc/initialdata:50 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:44 html/Ticket/Update.html:76 html/Work/Tickets/Elements/EditPeople:41 html/Work/Tickets/Elements/ShowLinks:6 html/Work/Tickets/Update.html:43 lib/RT/ACE_Overlay.pm:87 msgid "Cc" msgstr "副本" @@ -1073,11 +1084,11 @@ msgstr "修改申請單" msgid "Change password" msgstr "更改密碼" -#: html/Edit/Global/Basic/Top:70 +#: html/Edit/Global/Basic/Top:79 msgid "ChangeOwnerUI" msgstr "可否選擇表單承辦人" -#: html/Ticket/Create.html:100 html/Ticket/Elements/EditCustomFieldEntries:35 html/Ticket/Update.html:90 html/Work/Tickets/Elements/ShowCustomFieldEntries:13 +#: html/SelfService/Update.html:39 html/Ticket/Create.html:100 html/Ticket/Elements/EditCustomFieldEntries:35 html/Ticket/Update.html:90 html/Work/Tickets/Elements/ShowCustomFieldEntries:14 msgid "Check box to delete" msgstr "選擇欲刪除的項目" @@ -1085,11 +1096,11 @@ msgstr "選擇欲刪除的項目" msgid "Check box to revoke right" msgstr "選擇欲撤消的權利" -#: html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:42 html/Ticket/Elements/EditLinks:130 html/Ticket/Elements/EditLinks:68 html/Ticket/Elements/ShowLinks:56 html/Work/Search/BulkLinks:18 +#: html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:42 html/Ticket/Elements/EditLinks:113 html/Ticket/Elements/EditLinks:63 html/Ticket/Elements/ShowLinks:56 html/Work/Search/BulkLinks:18 html/Work/Tickets/Elements/EditLinks:117 html/Work/Tickets/Elements/EditLinks:56 html/Work/Tickets/Elements/ShowMembers:4 msgid "Children" msgstr "子申請單" -#: html/Edit/Elements/PickUsers:21 html/Edit/Global/UserRight/List:8 html/Edit/Global/UserRight/Top:19 html/Edit/Users/List:6 html/Edit/Users/Top:18 +#: html/Edit/Elements/PickUsers:21 html/Edit/Global/UserRight/List:8 html/Edit/Global/UserRight/Top:19 msgid "Chinese Name" msgstr "中文姓名" @@ -1097,7 +1108,7 @@ msgstr "中文姓名" msgid "Chinese/English" msgstr "中英文" -#: html/Admin/Elements/ModifyUser:79 html/Admin/Users/Modify.html:131 html/User/Prefs.html:91 html/Work/Preferences/Info:81 +#: html/Admin/Elements/ModifyUser:79 html/Admin/Users/Modify.html:131 html/User/Prefs.html:122 html/Work/Preferences/Info:83 msgid "City" msgstr "所在城市" @@ -1105,7 +1116,7 @@ msgstr "所在城市" msgid "ClassicUI" msgstr "傳統介面" -#: html/Ticket/Elements/ShowDates:46 +#: html/Ticket/Elements/ShowDates:47 msgid "Closed" msgstr "已解決" @@ -1117,7 +1128,7 @@ msgstr "已解決的申請單" msgid "Closed tickets" msgstr "已解決的申請單" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:181 html/Edit/Global/Workflow/Action:58 html/Edit/Global/Workflow/Condition:51 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:181 html/Edit/Global/Workflow/Action:54 html/Edit/Global/Workflow/Condition:52 msgid "Code" msgstr "執行程式碼" @@ -1125,7 +1136,7 @@ msgstr "執行程式碼" msgid "Command not understood!\\n" msgstr "指令無法辨識!\\n" -#: html/Ticket/Elements/ShowTransaction:166 html/Ticket/Elements/Tabs:152 html/Work/Search/Bulk.html:89 html/Work/Tickets/Display.html:37 html/Work/Tickets/Elements/ShowTransaction:114 html/Work/Tickets/Elements/ShowTransaction:27 +#: html/Ticket/Elements/ShowTransaction:178 html/Ticket/Elements/Tabs:152 html/Work/Search/Bulk.html:89 html/Work/Tickets/Display.html:60 html/Work/Tickets/Elements/ShowTransaction:118 html/Work/Tickets/Elements/ShowTransaction:32 msgid "Comment" msgstr "評論" @@ -1145,7 +1156,7 @@ msgstr "對申請單提出評論" msgid "CommentOnTicket" msgstr "評論申請單" -#: html/Admin/Elements/ModifyUser:34 html/Work/Tickets/Update.html:59 +#: html/Admin/Elements/ModifyUser:34 html/Work/Tickets/Elements/AddContent:7 msgid "Comments" msgstr "評論" @@ -1162,11 +1173,11 @@ msgstr "評論(不送給申請人)" msgid "Comments about %1" msgstr "對 %1 的評論" -#: html/Admin/Users/Modify.html:184 html/Ticket/Elements/ShowRequestor:43 +#: html/Admin/Users/Modify.html:184 html/Edit/Users/Info:46 html/Ticket/Elements/ShowRequestor:43 msgid "Comments about this user" msgstr "使用者描述" -#: lib/RT/Transaction_Overlay.pm:543 +#: lib/RT/Transaction_Overlay.pm:501 msgid "Comments added" msgstr "新增評論完畢" @@ -1178,10 +1189,14 @@ msgstr "確認" msgid "Commit Stubbed" msgstr "消除更動完畢" -#: html/Edit/Users/Info:41 +#: NOT FOUND IN SOURCE msgid "Company Name" msgstr "公司名稱" +#: html/Edit/Global/Basic/Top:85 +msgid "CompanySpecific" +msgstr "各公司獨立顯示" + #: NOT FOUND IN SOURCE msgid "Compile Restrictions" msgstr "設定查詢條件" @@ -1194,11 +1209,11 @@ msgstr "條件" msgid "Condition matches..." msgstr "符合條件..." -#: lib/RT/Scrip_Overlay.pm:159 +#: lib/RT/Scrip_Overlay.pm:164 msgid "Condition not found" msgstr "未找到符合的現況" -#: html/Edit/Global/GroupRight/Top:26 html/Edit/Global/UserRight/Top:45 html/Edit/Groups/Member:57 html/Elements/Tabs:49 +#: html/Edit/Global/GroupRight/Top:26 html/Edit/Global/UserRight/Top:45 html/Edit/Groups/Member:56 html/Elements/Tabs:49 msgid "Configuration" msgstr "設定" @@ -1210,7 +1225,7 @@ msgstr "確認密碼" msgid "Confirm Password" msgstr "密碼確認" -#: html/Work/Approvals/Display.html:25 html/Work/Tickets/Create.html:161 html/Work/Tickets/Create.html:174 html/Work/Tickets/Update.html:81 +#: html/Work/Approvals/Display.html:25 html/Work/Tickets/Create.html:154 html/Work/Tickets/Create.html:168 html/Work/Tickets/Update.html:77 msgid "Confirm Submit" msgstr "確定送出" @@ -1234,7 +1249,7 @@ msgstr "內容" msgid "Coould not create group" msgstr "無法新增群組" -#: html/Edit/Elements/104Buttons:74 +#: html/Edit/Elements/104Buttons:85 msgid "Copy" msgstr "複製" @@ -1242,7 +1257,7 @@ msgstr "複製" msgid "Copy Field From:" msgstr "欲複製欄位:" -#: etc/initialdata.zh:282 etc/initialdata:271 +#: etc/initialdata:271 msgid "Correspondence" msgstr "回覆" @@ -1250,7 +1265,7 @@ msgstr "回覆" msgid "Correspondence Address" msgstr "申請單回覆地址" -#: lib/RT/Transaction_Overlay.pm:539 +#: lib/RT/Transaction_Overlay.pm:497 msgid "Correspondence added" msgstr "新增申請單回覆" @@ -1258,7 +1273,7 @@ msgstr "新增申請單回覆" msgid "Correspondence not recorded" msgstr "未紀錄申請單回覆" -#: lib/RT/Ticket_Overlay.pm:3552 +#: lib/RT/Ticket_Overlay.pm:3608 msgid "Could not add new custom field value for ticket. " msgstr "不能新增自訂欄位的值 " @@ -1266,11 +1281,11 @@ msgstr "不能新增自訂欄位的值 " msgid "Could not add new custom field value for ticket. %1 " msgstr "不能新增自訂欄位的值。%1 " -#: lib/RT/Ticket_Overlay.pm:3058 lib/RT/Ticket_Overlay.pm:3066 lib/RT/Ticket_Overlay.pm:3083 +#: lib/RT/Ticket_Overlay.pm:3108 lib/RT/Ticket_Overlay.pm:3116 lib/RT/Ticket_Overlay.pm:3133 msgid "Could not change owner. " msgstr "不能更改承辦人。 " -#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:165 html/Edit/Global/CustomField/index.html:117 +#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:164 html/Edit/Global/CustomField/index.html:120 #. ($msg) msgid "Could not create CustomField" msgstr "無法新增自訂欄位" @@ -1285,20 +1300,25 @@ msgstr "無法建立訊息通知" msgid "Could not create Template" msgstr "無法建立通知範本" -#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:473 lib/RT/Group_Overlay.pm:480 +#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:471 lib/RT/Group_Overlay.pm:478 msgid "Could not create group" msgstr "無法新增群組" +#: html/Edit/Elements/Index:89 +#. ($msg) +msgid "Could not create item" +msgstr "無法新增項目" + #: html/Admin/Global/Template.html:74 html/Admin/Queues/Template.html:71 #. ($msg) msgid "Could not create template: %1" msgstr "無法新增範本:%1" -#: lib/RT/Ticket_Overlay.pm:1091 lib/RT/Ticket_Overlay.pm:334 +#: lib/RT/Ticket_Overlay.pm:1118 lib/RT/Ticket_Overlay.pm:353 msgid "Could not create ticket. Queue not set" msgstr "無法新增申請單。尚未指定表單。" -#: lib/RT/User_Overlay.pm:267 lib/RT/User_Overlay.pm:279 lib/RT/User_Overlay.pm:297 lib/RT/User_Overlay.pm:483 +#: lib/RT/User_Overlay.pm:271 lib/RT/User_Overlay.pm:284 lib/RT/User_Overlay.pm:302 lib/RT/User_Overlay.pm:488 msgid "Could not create user" msgstr "無法新增使用者" @@ -1319,11 +1339,11 @@ msgstr "找不到編號 %1 的申請單" msgid "Could not find group %1." msgstr "找不到群組 %1。" -#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1421 +#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1448 msgid "Could not find or create that user" msgstr "找不到或無法新增該名使用者" -#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1500 +#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1527 msgid "Could not find that principal" msgstr "找不到該單位" @@ -1331,8 +1351,7 @@ msgstr "找不到該單位" msgid "Could not find user %1." msgstr "找不到使用者 %1。" -#: html/Admin/Groups/Members.html:87 html/Edit/Users/index.html:83 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 -#. ( . $GroupId) +#: html/Admin/Groups/Members.html:87 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 msgid "Could not load group" msgstr "無法載入群組" @@ -1341,7 +1360,7 @@ msgstr "無法載入群組" msgid "Could not make that principal a %1 for this queue" msgstr "無法將該單位設為此表單的 %1。" -#: lib/RT/Ticket_Overlay.pm:1442 +#: lib/RT/Ticket_Overlay.pm:1469 #. ($self->loc($args{'Type'})) msgid "Could not make that principal a %1 for this ticket" msgstr "無法將該單位設為此申請單的 %1。" @@ -1351,16 +1370,16 @@ msgstr "無法將該單位設為此申請單的 %1。" msgid "Could not remove that principal as a %1 for this queue" msgstr "無法將單位 %1 從表單移除。" -#: lib/RT/Ticket_Overlay.pm:1558 +#: lib/RT/Ticket_Overlay.pm:1585 #. ($args{'Type'}) msgid "Could not remove that principal as a %1 for this ticket" msgstr "無法將單位 %1 從申請單移除。" -#: lib/RT/Group_Overlay.pm:984 +#: lib/RT/Group_Overlay.pm:982 msgid "Couldn't add member to group" msgstr "無法新增成員至群組" -#: lib/RT/Ticket_Overlay.pm:3562 lib/RT/Ticket_Overlay.pm:3618 +#: lib/RT/Ticket_Overlay.pm:3618 lib/RT/Ticket_Overlay.pm:3674 #. ($Msg) msgid "Couldn't create a transaction: %1" msgstr "無法新增更動報告" @@ -1373,11 +1392,11 @@ msgstr "無法從 gpg 回函辨識出該採取的行動\\n" msgid "Couldn't find group\\n" msgstr "找不到群組\\n" -#: lib/RT/Interface/Web.pm:902 x:905 +#: lib/RT/Interface/Web.pm:962 msgid "Couldn't find row" msgstr "找不到此列資料" -#: lib/RT/Group_Overlay.pm:958 +#: lib/RT/Group_Overlay.pm:956 msgid "Couldn't find that principal" msgstr "找不到該單位" @@ -1410,9 +1429,10 @@ msgstr "無法載入 RT 設定檔 '%1' %2" msgid "Couldn't load Scrips." msgstr "無法載入手續。" -#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 html/Edit/Global/GroupRight/Add.html:54 html/Edit/Global/UserRight/Add.html:23 html/Edit/Groups/Member:121 html/Edit/Groups/Members/Add.html:44 html/Edit/Rights/index.html:57 -#. ($Group) +#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 html/Edit/Global/GroupRight/Add.html:55 html/Edit/Global/GroupRight/Add.html:60 html/Edit/Global/UserRight/Add.html:25 html/Edit/Global/UserRight/Add.html:30 html/Edit/Groups/Member:120 html/Edit/Groups/Members/Add.html:43 html/Edit/Rights/index.html:58 html/Edit/Rights/index.html:63 #. ($ObjectGroup) +#. ($Report) +#. ($Group) #. ($id) msgid "Couldn't load group %1" msgstr "無法載入手續 %1" @@ -1421,12 +1441,12 @@ msgstr "無法載入手續 %1" msgid "Couldn't load link" msgstr "無法載入鏈結。" -#: html/Admin/Elements/EditCustomFields:146 html/Admin/Queues/People.html:120 +#: html/Admin/Elements/EditCustomFields:145 html/Admin/Queues/CustomFields.html:35 html/Admin/Queues/People.html:120 #. ($id) msgid "Couldn't load queue" msgstr "無法載入表單" -#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 html/Edit/Global/GroupRight/Add.html:50 html/Edit/Global/GroupRight/index.html:81 html/Edit/Global/UserRight/Add.html:19 html/Edit/Global/UserRight/index.html:83 html/Edit/Rights/index.html:53 +#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 html/Edit/Global/GroupRight/Add.html:51 html/Edit/Global/GroupRight/index.html:82 html/Edit/Global/GroupRight/index.html:87 html/Edit/Global/UserRight/Add.html:21 html/Edit/Global/UserRight/index.html:83 html/Edit/Global/UserRight/index.html:88 html/Edit/Rights/index.html:54 #. ($Queue) #. ($id) msgid "Couldn't load queue %1" @@ -1445,16 +1465,16 @@ msgstr "無法載入範本" msgid "Couldn't load that user (%1)" msgstr "無法載入該名使用者(%1)" -#: html/SelfService/Display.html:108 +#: html/SelfService/Display.html:114 #. ($id) msgid "Couldn't load ticket '%1'" msgstr "無法載入申請單 '%1'" -#: html/Admin/Elements/ModifyUser:85 html/Admin/Users/Modify.html:148 html/User/Prefs.html:97 html/Work/Preferences/Info:87 +#: html/Admin/Elements/ModifyUser:85 html/Admin/Users/Modify.html:148 html/User/Prefs.html:134 html/Work/Preferences/Info:89 msgid "Country" msgstr "國家" -#: html/Admin/Elements/CreateUserCalled:25 html/Edit/Elements/PopHeader:29 html/Edit/Global/GroupRight/Add.html:18 html/Ticket/Create.html:134 html/Ticket/Create.html:194 +#: html/Admin/Elements/CreateUserCalled:25 html/Edit/Elements/PopHeader:33 html/Edit/Global/GroupRight/Add.html:19 html/Ticket/Create.html:134 html/Ticket/Create.html:195 msgid "Create" msgstr "新增" @@ -1462,7 +1482,7 @@ msgstr "新增" msgid "Create Subgroup:" msgstr "新增子群組:" -#: etc/initialdata.zh:145 etc/initialdata:127 +#: etc/initialdata:127 msgid "Create Tickets" msgstr "新增申請單" @@ -1519,7 +1539,7 @@ msgstr "新增範本" msgid "Create a new ticket" msgstr "新增申請單" -#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:240 +#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:242 msgid "Create a new user" msgstr "新增使用者" @@ -1568,7 +1588,7 @@ msgstr "新增失敗:%1/%2/%3" msgid "Create new item" msgstr "建立新項目" -#: etc/initialdata.zh:147 etc/initialdata:129 +#: etc/initialdata:129 msgid "Create new tickets based on this scrip's template" msgstr "依據此項手續內的模版,新增申請單" @@ -1604,7 +1624,7 @@ msgstr "新增、刪除及更改使用者" msgid "CreateTicket" msgstr "新增申請單" -#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:26 lib/RT/Ticket_Overlay.pm:1185 +#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1212 msgid "Created" msgstr "新增日" @@ -1638,11 +1658,11 @@ msgstr "現有自訂欄位" msgid "Current Groups:" msgstr "現有群組列表:" -#: html/Ticket/Elements/EditLinks:27 +#: html/Ticket/Elements/EditLinks:27 html/Work/Tickets/Elements/EditLinks:10 msgid "Current Relationships" msgstr "現有關係" -#: html/Edit/Rights/index.html:19 +#: html/Edit/Rights/index.html:20 msgid "Current Rights:" msgstr "現有權限:" @@ -1650,7 +1670,7 @@ msgstr "現有權限:" msgid "Current Scrips" msgstr "現有手續" -#: html/Work/Tickets/Create.html:50 html/Work/Tickets/Elements/ShowBasics:47 +#: html/Work/Tickets/Create.html:49 html/Work/Tickets/Elements/ShowBasics:47 msgid "Current Status" msgstr "目前狀態" @@ -1658,6 +1678,10 @@ msgstr "目前狀態" msgid "Current Templates" msgstr "現有範本" +#: html/Work/Tickets/Elements/EditPeople:9 +msgid "Current Watchers" +msgstr "現有視察員" + #: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41 msgid "Current members" msgstr "現有成員" @@ -1670,7 +1694,7 @@ msgstr "現有權限" msgid "Current search criteria" msgstr "現有查詢條件" -#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 +#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 html/Work/Tickets/Elements/EditPeople:32 msgid "Current watchers" msgstr "現有視察員" @@ -1679,7 +1703,7 @@ msgstr "現有視察員" msgid "Custom Field #%1" msgstr "自訂欄位 #%1" -#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Edit/Global/autohandler:7 html/Edit/Queues/autohandler:18 html/Ticket/Elements/ShowSummary:35 +#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Edit/Global/autohandler:7 html/Edit/Queues/autohandler:22 html/Ticket/Elements/ShowSummary:35 msgid "Custom Fields" msgstr "自訂欄位" @@ -1699,31 +1723,31 @@ msgstr "動作前執行程式" msgid "Custom condition" msgstr "自訂條件" -#: lib/RT/Tickets_Overlay.pm:1618 +#: lib/RT/Tickets_Overlay.pm:1637 #. ($CF->Name , $args{OPERATOR} , $args{VALUE}) msgid "Custom field %1 %2 %3" msgstr "自訂欄位 %1 %2 %3" -#: lib/RT/Tickets_Overlay.pm:1613 +#: lib/RT/Tickets_Overlay.pm:1632 #. ($CF->Name) msgid "Custom field %1 has a value." msgstr "自訂欄位 %1 已有值" -#: lib/RT/Tickets_Overlay.pm:1610 +#: lib/RT/Tickets_Overlay.pm:1629 #. ($CF->Name) msgid "Custom field %1 has no value." msgstr "自訂欄位 %1 沒有值" -#: lib/RT/Ticket_Overlay.pm:3454 +#: lib/RT/Ticket_Overlay.pm:3510 #. ($args{'Field'}) msgid "Custom field %1 not found" msgstr "找不到自訂欄位 %1" -#: html/Admin/Elements/EditCustomFields:196 +#: html/Admin/Elements/EditCustomFields:195 msgid "Custom field deleted" msgstr "自訂欄位已刪除" -#: lib/RT/Ticket_Overlay.pm:3604 +#: lib/RT/Ticket_Overlay.pm:3660 msgid "Custom field not found" msgstr "找不到自訂欄位" @@ -1748,7 +1772,7 @@ msgstr "找不到自訂欄位值" msgid "Custom field value deleted" msgstr "自訂欄位值刪除成功" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:145 html/Edit/Global/Workflow/Owner.html:90 lib/RT/Transaction_Overlay.pm:548 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:145 html/Edit/Global/Workflow/Owner.html:90 lib/RT/Transaction_Overlay.pm:505 lib/RT/Transaction_Vendor.pm:5 msgid "CustomField" msgstr "自訂欄位" @@ -1756,11 +1780,19 @@ msgstr "自訂欄位" msgid "Data error" msgstr "資料錯誤" +#: html/Edit/Global/Basic/Top:77 +msgid "DatabaseBindRemote" +msgstr "容許外部連線" + +#: html/Edit/Global/Basic/Top:75 +msgid "DatabaseName" +msgstr "MySQL資料庫" + #: NOT FOUND IN SOURCE msgid "Date of Departure" msgstr "出發日期" -#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:92 html/Ticket/ModifyAll.html:43 html/Work/Tickets/Elements/ShowTransaction:14 +#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:92 html/Ticket/ModifyAll.html:43 html/Work/Tickets/Elements/ShowTransaction:17 msgid "Dates" msgstr "日期" @@ -1777,34 +1809,46 @@ msgid "December" msgstr "十二月" #: NOT FOUND IN SOURCE +msgid "Default Approval" +msgstr "預設簽核" + +#: NOT FOUND IN SOURCE msgid "Default Autoresponse Template" msgstr "預設自動回應範本" -#: etc/initialdata.zh:225 etc/initialdata:207 +#: etc/initialdata:207 msgid "Default Autoresponse template" msgstr "預設自動回應範本" -#: etc/initialdata.zh:304 etc/initialdata:281 +#: html/Edit/Global/CustomField/Top:46 +msgid "Default Value" +msgstr "預設值" + +#: etc/initialdata:281 msgid "Default admin comment template" msgstr "預設管理員評論範本" -#: etc/initialdata.zh:262 etc/initialdata:260 +#: etc/initialdata:260 msgid "Default admin correspondence template" msgstr "預設管理員回覆範本" -#: etc/initialdata.zh:283 etc/initialdata:272 +#: etc/initialdata:272 msgid "Default correspondence template" msgstr "預設回覆範本" -#: etc/initialdata.zh:240 etc/initialdata:238 +#: etc/initialdata:238 msgid "Default transaction template" msgstr "預設更動範本" -#: lib/RT/Transaction_Overlay.pm:643 +#: lib/RT/Transaction_Overlay.pm:491 #. ($type, $self->Field, $self->OldValue, $self->NewValue) msgid "Default: %1/%2 changed from %3 to %4" msgstr "預設:%1/%2 已自 %3 改為 %4" +#: NOT FOUND IN SOURCE +msgid "DefaultApproval" +msgstr "預設簽核" + #: html/User/Delegation.html:24 html/User/Delegation.html:27 msgid "Delegate rights" msgstr "代表團權限" @@ -1833,7 +1877,7 @@ msgstr "代理表單:" msgid "Delegated Type" msgstr "代理表單種類" -#: html/Edit/Users/index.html:125 html/Work/Delegates/Info:31 html/Work/Delegates/List:8 html/Work/Elements/Tab:41 html/Work/Overview/Info:28 +#: html/Edit/Users/index.html:98 html/Work/Delegates/Info:31 html/Work/Delegates/List:8 html/Work/Elements/Tab:41 html/Work/Overview/Info:28 msgid "Delegates" msgstr "代理人" @@ -1877,10 +1921,14 @@ msgstr "代理人群組" msgid "Delegation Rights" msgstr "代理人權限" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:113 html/Edit/Elements/104Buttons:73 html/Work/Search/index.html:48 html/Work/Search/index.html:48 +#: html/Admin/Elements/EditScrips:53 html/Admin/Elements/ModifyTemplateAsWorkflow:113 html/Edit/Elements/104Buttons:84 html/Work/Search/index.html:48 html/Work/Search/index.html:48 msgid "Delete" msgstr "刪除" +#: html/Admin/Elements/EditScrips:52 +msgid "Delete selected scrips" +msgstr "刪除指定的手續" + #: lib/RT/Queue_Overlay.pm:88 msgid "Delete tickets" msgstr "刪除申請單" @@ -1889,7 +1937,7 @@ msgstr "刪除申請單" msgid "DeleteTicket" msgstr "刪除申請單" -#: lib/RT/Transaction_Overlay.pm:187 +#: lib/RT/Transaction_Overlay.pm:136 msgid "Deleting this object could break referential integrity" msgstr "刪除此物件可能破壞參考完整性" @@ -1897,7 +1945,7 @@ msgstr "刪除此物件可能破壞參考完整性" msgid "Deleting this object would break referential integrity" msgstr "刪除此物件可能破壞參考完整性" -#: lib/RT/User_Overlay.pm:499 +#: lib/RT/User_Overlay.pm:504 msgid "Deleting this object would violate referential integrity" msgstr "刪除此物件會違反參考完整性" @@ -1917,11 +1965,11 @@ msgstr "駁回" msgid "Department" msgstr "部門" -#: html/Edit/Global/UserRight/List:12 html/Edit/Global/UserRight/Top:13 html/Edit/Users/List:10 html/Edit/Users/Top:12 +#: html/Edit/Global/UserRight/List:12 html/Edit/Global/UserRight/Top:13 msgid "Department ID" msgstr "部門代碼" -#: html/Edit/Global/UserRight/List:11 html/Edit/Global/UserRight/Top:49 html/Edit/Users/List:9 html/Edit/Users/Top:48 html/Work/Delegates/Info:78 html/Work/Overview/Info:60 +#: html/Edit/Global/UserRight/List:11 html/Edit/Global/UserRight/Top:49 html/Work/Delegates/Info:78 html/Work/Overview/Info:60 msgid "Department Name" msgstr "部門名稱" @@ -1945,7 +1993,7 @@ msgstr "請假單" msgid "Departure Until" msgstr "差旅截止日" -#: html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/EditLinks:122 html/Ticket/Elements/EditLinks:46 html/Ticket/Elements/ShowDependencies:31 html/Ticket/Elements/ShowLinks:36 html/Work/Search/BulkLinks:10 +#: html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/EditLinks:105 html/Ticket/Elements/EditLinks:44 html/Ticket/Elements/ShowDependencies:31 html/Ticket/Elements/ShowLinks:36 html/Work/Search/BulkLinks:10 html/Work/Tickets/Elements/EditLinks:109 html/Work/Tickets/Elements/EditLinks:34 html/Work/Tickets/Elements/ShowLinks:21 msgid "Depended on by" msgstr "可接續處理的申請單" @@ -1953,7 +2001,27 @@ msgstr "可接續處理的申請單" msgid "Dependencies: \\n" msgstr "附屬性:\\n" -#: html/Elements/SelectLinkType:26 html/Ticket/Create.html:179 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/EditLinks:118 html/Ticket/Elements/EditLinks:35 html/Ticket/Elements/ShowDependencies:24 html/Ticket/Elements/ShowLinks:26 html/Work/Search/BulkLinks:6 +#: lib/RT/Transaction_Overlay.pm:585 +#. ($value) +msgid "Dependency by %1 added" +msgstr "已加入可接續處理的申請單 %1" + +#: lib/RT/Transaction_Overlay.pm:622 +#. ($value) +msgid "Dependency by %1 deleted" +msgstr "已移除可接續處理的申請單 %1" + +#: lib/RT/Transaction_Overlay.pm:582 +#. ($value) +msgid "Dependency on %1 added" +msgstr "已加入需先處理的申請單 %1" + +#: lib/RT/Transaction_Overlay.pm:619 +#. ($value) +msgid "Dependency on %1 deleted" +msgstr "已移除需先處理的申請單 %1" + +#: html/Elements/SelectLinkType:26 html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/EditLinks:101 html/Ticket/Elements/EditLinks:35 html/Ticket/Elements/ShowDependencies:24 html/Ticket/Elements/ShowLinks:26 html/Work/Search/BulkLinks:6 html/Work/Tickets/Elements/EditLinks:105 html/Work/Tickets/Elements/EditLinks:23 html/Work/Tickets/Elements/ShowLinks:16 msgid "Depends on" msgstr "需先處理" @@ -1969,7 +2037,7 @@ msgstr "遞減" msgid "Describe the issue below" msgstr "在以下欄位描述主題" -#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:33 html/Admin/Elements/ModifyQueue:35 html/Admin/Elements/ModifyTemplate:35 html/Admin/Elements/ModifyTemplateAsWorkflow:192 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Edit/Global/Workflow/Action:14 html/Elements/SelectGroups:26 html/User/Groups/Modify.html:48 html/Work/Preferences/Info:103 +#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:33 html/Admin/Elements/ModifyQueue:35 html/Admin/Elements/ModifyTemplate:35 html/Admin/Elements/ModifyTemplateAsWorkflow:192 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Edit/Elements/SelectQueues:4 html/Edit/Global/Workflow/Action:13 html/Elements/SelectGroups:26 html/User/Groups/Modify.html:48 msgid "Description" msgstr "描述" @@ -1981,7 +2049,7 @@ msgstr "經辦業務說明" msgid "Description:" msgstr "描述:" -#: html/Work/Tickets/Create.html:117 html/Work/Tickets/Create.html:85 html/Work/Tickets/Elements/EditCustomFields:13 html/Work/Tickets/Elements/EditCustomFields:47 html/Work/Tickets/Elements/ShowCustomFields:15 html/Work/Tickets/Elements/ShowCustomFields:50 +#: html/Work/Tickets/Create.html:132 html/Work/Tickets/Create.html:84 html/Work/Tickets/Elements/EditCustomFields:13 html/Work/Tickets/Elements/EditCustomFields:61 html/Work/Tickets/Elements/ShowCustomFields:14 html/Work/Tickets/Elements/ShowCustomFields:53 msgid "Details" msgstr "細節" @@ -1989,15 +2057,15 @@ msgstr "細節" msgid "Direct" msgstr "直接" -#: html/Edit/Users/Info:31 +#: NOT FOUND IN SOURCE msgid "Disability" msgstr "殘障身分" -#: html/Edit/Users/Info:29 +#: NOT FOUND IN SOURCE msgid "Disability Type" msgstr "殘障類別" -#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:19 html/Edit/Queues/Basic/Top:70 html/Edit/Queues/List:13 html/Work/Delegates/Info:48 html/Work/Delegates/Info:53 html/Work/Delegates/List:12 html/Work/Overview/Info:42 +#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:19 html/Edit/Queues/Basic/Top:69 html/Edit/Queues/List:15 html/Edit/Queues/List:27 html/Work/Delegates/Info:48 html/Work/Delegates/Info:53 html/Work/Delegates/List:12 html/Work/Overview/Info:42 msgid "Disabled" msgstr "停用" @@ -2033,7 +2101,7 @@ msgstr "允許一切操作" msgid "Don't refresh this page." msgstr "不更新此頁面。" -#: html/Search/Elements/PickRestriction:113 html/Work/Search/PickRestriction:95 +#: html/Search/Elements/PickRestriction:113 html/Work/Search/PickRestriction:101 msgid "Don't show search results" msgstr "不顯示查詢結果" @@ -2041,7 +2109,7 @@ msgstr "不顯示查詢結果" msgid "Down" msgstr "下一頁" -#: html/Ticket/Elements/ShowTransaction:92 +#: html/Ticket/Elements/ShowTransaction:103 msgid "Download" msgstr "下載" @@ -2049,7 +2117,7 @@ msgstr "下載" msgid "Dr." msgstr "博士" -#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:42 lib/RT/Ticket_Overlay.pm:1189 +#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:43 html/Work/Tickets/Elements/EditBasics:54 lib/RT/Ticket_Overlay.pm:1216 msgid "Due" msgstr "到期日" @@ -2066,7 +2134,7 @@ msgstr "無法解讀日期 '%1'" msgid "ERROR: Couldn't load ticket '%1': %2.\\n" msgstr "無法載入申請單 '%1':%2.\\n" -#: html/Work/Tickets/Update.html:46 +#: html/Work/Tickets/Update.html:47 msgid "Edit" msgstr "編輯" @@ -2074,7 +2142,7 @@ msgstr "編輯" msgid "Edit Conditions" msgstr "編輯前置條件" -#: html/Admin/Queues/CustomFields.html:44 +#: html/Admin/Queues/CustomFields.html:45 #. ($Queue->Name) msgid "Edit Custom Fields for %1" msgstr "編輯 %1 的自訂欄位" @@ -2168,15 +2236,19 @@ msgstr "最高學歷" msgid "EffectiveId" msgstr "有效編號" -#: lib/RT/Ticket_Overlay.pm:2635 lib/RT/Ticket_Overlay.pm:2703 +#: lib/RT/Ticket_Overlay.pm:2673 lib/RT/Ticket_Overlay.pm:2751 msgid "Either base or target must be specified" msgstr "需要指定起始申請單或目的申請單" -#: html/Admin/Users/Modify.html:52 html/Admin/Users/Prefs.html:45 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:41 html/Work/Delegates/Info:96 html/Work/Overview/Info:78 html/Work/Preferences/Info:16 +#: html/Admin/Users/Modify.html:52 html/Admin/Users/Prefs.html:45 html/Edit/Elements/SelectUsers:4 html/Edit/Users/List:7 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:43 html/Work/Delegates/Info:96 html/Work/Overview/Info:78 msgid "Email" msgstr "電子郵件信箱" -#: lib/RT/User_Overlay.pm:247 +#: html/Work/Preferences/Info:16 +msgid "Email Address" +msgstr "電子郵件信箱" + +#: lib/RT/User_Overlay.pm:251 msgid "Email address in use" msgstr "此電子郵件信箱已被使用" @@ -2216,11 +2288,11 @@ msgstr "啟用(取消勾選將停用此群組)" msgid "Enabled (Unchecking this box disables this queue)" msgstr "啟用(取消勾選將停用此表單)" -#: html/Admin/Elements/EditCustomFields:98 +#: html/Admin/Elements/EditCustomFields:97 msgid "Enabled Custom Fields" msgstr "已啟用的自訂欄位" -#: html/Edit/Queues/Basic/Top:75 html/Edit/Queues/List:15 +#: html/Edit/Queues/Basic/Top:74 html/Edit/Queues/List:17 html/Edit/Queues/List:29 msgid "Enabled Date" msgstr "啟用日期" @@ -2232,16 +2304,16 @@ msgstr "啟動日期:" msgid "Enabled Queues" msgstr "已啟用的表單" -#: html/Edit/Queues/Basic/Top:66 html/Edit/Queues/List:11 +#: html/Edit/Queues/Basic/Top:65 html/Edit/Queues/List:13 html/Edit/Queues/List:25 msgid "Enabled Status" msgstr "啟用狀態" -#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:282 html/User/Groups/Modify.html:116 +#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:284 html/User/Groups/Modify.html:116 #. (loc_fuzzy($msg)) msgid "Enabled status %1" msgstr "啟用狀態 %1" -#: html/Edit/Users/Info:34 +#: NOT FOUND IN SOURCE msgid "End of Trial" msgstr "試用期滿日" @@ -2261,7 +2333,7 @@ msgstr "輸入下列單一或複式條件,查詢用戶資料" msgid "Enter one value" msgstr "鍵入單一項目" -#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:111 html/Work/Search/Bulk.html:95 +#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:94 html/Work/Search/Bulk.html:95 html/Work/Tickets/Elements/EditLinks:98 msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." msgstr "輸入申請單可鏈結到的申請單編號或網址。以空白隔開。" @@ -2313,15 +2385,15 @@ msgstr "表單->新增視察員的參數有誤" msgid "Error in parameters to Queue->DelWatcher" msgstr "表單->刪除視察員的參數有誤" -#: lib/RT/Ticket_Overlay.pm:1374 +#: lib/RT/Ticket_Overlay.pm:1401 msgid "Error in parameters to Ticket->AddWatcher" msgstr "申請單->新增視察員的參數有誤" -#: lib/RT/Ticket_Overlay.pm:1531 +#: lib/RT/Ticket_Overlay.pm:1558 msgid "Error in parameters to Ticket->DelWatcher" msgstr "申請單->刪除視察員的參數有誤" -#: etc/initialdata.zh:38 etc/initialdata:20 +#: etc/initialdata:20 msgid "Everyone" msgstr "所有人" @@ -2329,7 +2401,11 @@ msgstr "所有人" msgid "Example:" msgstr "範例:" -#: html/Edit/Elements/104Buttons:77 +#: NOT FOUND IN SOURCE +msgid "Existing user renamed from %1 to %2" +msgstr "現有使用者 %1 已改名為 %2" + +#: html/Edit/Elements/104Buttons:88 msgid "Export" msgstr "匯出" @@ -2341,31 +2417,31 @@ msgstr "外部認證帳號" msgid "ExternalContactInfoId" msgstr "外部聯絡方式帳號" -#: html/Edit/Global/Basic/Top:64 +#: html/Edit/Global/Basic/Top:69 msgid "ExternalDatabaseDSN" msgstr "外部資料庫連結字串" -#: html/Edit/Global/Basic/Top:68 +#: html/Edit/Global/Basic/Top:73 msgid "ExternalDatabasePass" msgstr "外部資料庫密碼" -#: html/Edit/Global/Basic/Top:66 +#: html/Edit/Global/Basic/Top:71 msgid "ExternalDatabaseUser" msgstr "外部資料庫用戶" -#: html/Edit/Global/Basic/Top:62 +#: html/Edit/Global/Basic/Top:67 msgid "ExternalURL" msgstr "外部介面網址" -#: html/Admin/Users/Modify.html:72 +#: html/Admin/Users/Modify.html:72 html/Edit/Users/Info:41 msgid "Extra info" msgstr "備註" -#: lib/RT/User_Overlay.pm:363 +#: lib/RT/User_Overlay.pm:368 msgid "Failed to find 'Privileged' users pseudogroup." msgstr "找不到「內部成員」虛擬群組的使用者。" -#: lib/RT/User_Overlay.pm:370 +#: lib/RT/User_Overlay.pm:375 msgid "Failed to find 'Unprivileged' users pseudogroup" msgstr "找不到「非內部成員」虛擬群組的使用者。" @@ -2390,22 +2466,22 @@ msgstr "二月" msgid "Female" msgstr "女" -#: html/Edit/Global/CustomField/List:5 html/Edit/Global/CustomField/Top:9 -msgid "Field Attribute" -msgstr "欄位屬性" - #: html/Edit/Global/CustomField/Info:14 msgid "Field Content:" msgstr "欄位內容:" -#: html/Edit/Global/CustomField/List:7 html/Edit/Global/CustomField/Top:21 +#: html/Edit/Global/CustomField/List:7 html/Edit/Global/CustomField/Top:20 msgid "Field Description" msgstr "欄位描述" -#: html/Edit/Global/CustomField/List:6 html/Edit/Global/CustomField/Top:15 +#: html/Edit/Global/CustomField/List:6 html/Edit/Global/CustomField/Top:14 msgid "Field Name" msgstr "欄位名稱" +#: html/Edit/Global/CustomField/List:5 html/Edit/Global/CustomField/Top:9 +msgid "Field Type" +msgstr "欄位屬性" + #: html/Edit/Elements/PickUsers:52 html/Edit/Users/Add.html:47 msgid "Filter" msgstr "篩選" @@ -2422,19 +2498,19 @@ msgstr "篩選列表:" msgid "Fin" msgstr "最終" -#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 lib/RT/Tickets_Overlay.pm:1091 +#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 html/Work/Tickets/Elements/EditBasics:52 lib/RT/Tickets_Overlay.pm:1110 msgid "Final Priority" -msgstr "最低順位" +msgstr "最終順位" -#: lib/RT/Ticket_Overlay.pm:1180 +#: lib/RT/Ticket_Overlay.pm:1207 msgid "FinalPriority" -msgstr "最低順位" +msgstr "最終順位" #: NOT FOUND IN SOURCE msgid "Financial Department:" msgstr "財務部:" -#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 +#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 html/Work/Tickets/Elements/EditPeople:18 msgid "Find group whose" msgstr "尋找群組的" @@ -2442,10 +2518,14 @@ msgstr "尋找群組的" msgid "Find new/open tickets" msgstr "尋找/開啟申請單" -#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29 +#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Edit/Users/Top:6 html/Ticket/Elements/EditPeople:29 html/Work/Tickets/Elements/EditPeople:14 msgid "Find people whose" msgstr "尋找人員的" +#: html/Edit/Queues/Top:6 +msgid "Find queues whose" +msgstr "尋找表單的" + #: html/Search/Listing.html:107 html/Work/Search/index.html:88 msgid "Find tickets" msgstr "尋找申請單" @@ -2470,7 +2550,7 @@ msgstr "一" msgid "First-level Admins" msgstr "一階主管" -#: html/Edit/Users/Info:39 +#: NOT FOUND IN SOURCE msgid "First-level Users" msgstr "一階主管員工" @@ -2478,17 +2558,17 @@ msgstr "一階主管員工" msgid "Fixed shift" msgstr "固定班" -#: docs/design_docs/string-extraction-guide.txt:33 +#: docs/design_docs/string-extraction-guide.txt:33 lib/RT/StyleGuide.pod:746 msgid "Foo Bar Baz" msgstr "甲 乙 丙" -#: docs/design_docs/string-extraction-guide.txt:24 +#: docs/design_docs/string-extraction-guide.txt:24 lib/RT/StyleGuide.pod:737 msgid "Foo!" msgstr "甲!" #: html/Search/Bulk.html:86 html/Work/Search/Bulk.html:55 msgid "Force change" -msgstr "強制更新" +msgstr "強制更換" #: html/Work/Elements/104Header:89 msgid "Form Processing" @@ -2499,7 +2579,7 @@ msgstr "電子表單作業區" msgid "Found %quant(%1,ticket)" msgstr "找到 %1 張申請單" -#: lib/RT/Interface/Web.pm:904 x:907 +#: lib/RT/Interface/Web.pm:964 msgid "Found Object" msgstr "已找到物件" @@ -2555,7 +2635,7 @@ msgstr "完整標頭檔" msgid "Gecos" msgstr "登入帳號" -#: html/Edit/Users/Info:26 +#: NOT FOUND IN SOURCE msgid "Gender" msgstr "性別" @@ -2563,7 +2643,7 @@ msgstr "性別" msgid "Getting the current user from a pgp sig\\n" msgstr "取得目前使用者的 pgp 簽章\\n" -#: lib/RT/Transaction_Overlay.pm:593 +#: lib/RT/Transaction_Overlay.pm:551 #. ($New->Name) msgid "Given to %1" msgstr "交予 %1" @@ -2573,6 +2653,10 @@ msgid "Global" msgstr "全域設定" #: NOT FOUND IN SOURCE +msgid "Global Approval" +msgstr "全域簽核" + +#: NOT FOUND IN SOURCE msgid "Global Keyword Selections" msgstr "全域關鍵字選取" @@ -2593,7 +2677,11 @@ msgstr "全域設定" msgid "Global template: %1" msgstr "全域範本:%1" -#: html/Admin/Elements/EditCustomFields:74 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/index.html:40 +#: NOT FOUND IN SOURCE +msgid "GlobalApproval" +msgstr "全域簽核" + +#: html/Admin/Elements/EditCustomFields:73 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/Work/Tickets/Elements/EditPeople:16 html/Work/Tickets/Elements/EditPeople:20 html/index.html:40 msgid "Go!" msgstr "執行" @@ -2621,6 +2709,10 @@ msgstr "群組" msgid "Group %1 %2: %3" msgstr "群組 %1 %2:%3" +#: NOT FOUND IN SOURCE +msgid "Group Admin" +msgstr "群組管理員" + #: html/Edit/Global/GroupRight/List:5 html/Edit/Global/GroupRight/Top:20 html/Edit/Groups/List:7 msgid "Group Description" msgstr "群組描述" @@ -2633,7 +2725,7 @@ msgstr "群組管理" msgid "Group Members" msgstr "群組成員" -#: html/Edit/Elements/PickUsers:28 html/Edit/Global/GroupRight/List:4 html/Edit/Global/GroupRight/Top:10 html/Edit/Groups/List:6 html/Edit/Groups/Top:7 html/Edit/Users/Add.html:29 html/Edit/Users/Group:10 html/Edit/Users/Search.html:43 html/Work/Delegates/Add.html:15 html/Work/Tickets/Cc:24 +#: html/Edit/Elements/PickUsers:28 html/Edit/Global/GroupRight/List:4 html/Edit/Global/GroupRight/Top:10 html/Edit/Groups/List:6 html/Edit/Groups/Top:7 html/Edit/Queues/Basic/Add.html:15 html/Edit/Users/Add.html:29 html/Edit/Users/Group:10 html/Edit/Users/Search.html:43 html/Work/Delegates/Add.html:15 html/Work/Tickets/Cc:24 msgid "Group Name" msgstr "群組名稱" @@ -2641,7 +2733,7 @@ msgstr "群組名稱" msgid "Group Name:" msgstr "群組名稱:" -#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 html/Edit/Global/autohandler:12 html/Edit/Queues/autohandler:23 html/Edit/Users/Group:11 html/Edit/Users/index.html:123 +#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 html/Edit/Global/autohandler:12 html/Edit/Queues/autohandler:27 html/Edit/Users/Group:11 html/Edit/Users/index.html:96 msgid "Group Rights" msgstr "群組權限" @@ -2657,7 +2749,7 @@ msgstr "群組設定" msgid "Group Status" msgstr "群組狀態" -#: lib/RT/Group_Overlay.pm:964 +#: lib/RT/Group_Overlay.pm:962 msgid "Group already has member" msgstr "群組內已有此成員" @@ -2670,15 +2762,19 @@ msgstr "無法新增群組" msgid "Group could not be created: %1" msgstr "無法新增群組:%1" -#: lib/RT/Group_Overlay.pm:496 +#: lib/RT/Group_Overlay.pm:494 msgid "Group created" msgstr "群組新增完畢" -#: lib/RT/Group_Overlay.pm:1132 +#: NOT FOUND IN SOURCE +msgid "Group created: %1" +msgstr "群組 %1 新增完畢" + +#: lib/RT/Group_Overlay.pm:1134 msgid "Group has no such member" msgstr "群組沒有這個成員" -#: lib/RT/Group_Overlay.pm:944 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1428 lib/RT/Ticket_Overlay.pm:1506 +#: lib/RT/Group_Overlay.pm:942 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1455 lib/RT/Ticket_Overlay.pm:1533 msgid "Group not found" msgstr "找不到群組" @@ -2691,6 +2787,14 @@ msgid "Group not specified.\\n" msgstr "未指定群組。\\n" #: NOT FOUND IN SOURCE +msgid "Group redescribed from %1 to %2" +msgstr "群組描述 %1 已改為 %2" + +#: NOT FOUND IN SOURCE +msgid "Group renamed from %1 to %2" +msgstr "群組 %1 已改名為 %2" + +#: NOT FOUND IN SOURCE msgid "Group with Queue Rights" msgstr "擁有表單權限群組" @@ -2702,11 +2806,11 @@ msgstr "群組之" msgid "Group:" msgstr "群組:" -#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/Edit/Global/GroupRight/Add.html:15 html/User/Groups/Members.html:66 +#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/Edit/Global/GroupRight/Add.html:16 html/Edit/Groups/Admin:12 html/User/Groups/Members.html:66 msgid "Groups" msgstr "群組" -#: lib/RT/Group_Overlay.pm:970 +#: lib/RT/Group_Overlay.pm:968 msgid "Groups can't be members of their members" msgstr "不能將群組設為群組內成員" @@ -2726,19 +2830,23 @@ msgstr "健保補助身份" msgid "Hello!" msgstr "嗨!" -#: docs/design_docs/string-extraction-guide.txt:40 +#: docs/design_docs/string-extraction-guide.txt:40 lib/RT/StyleGuide.pod:753 #. ($name) msgid "Hello, %1" msgstr "嗨,%1" #: html/Edit/Elements/104Top:28 msgid "Help" -msgstr "輔助說明" +msgstr "說明" #: NOT FOUND IN SOURCE msgid "Help Desks" msgstr "各項業務窗口" +#: html/Edit/Global/CustomField/SelectWritable:9 html/Edit/Queues/Basic/Top:80 +msgid "Hidden" +msgstr "隱藏" + #: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:87 html/Work/Tickets/Elements/ShowHistory:8 msgid "History" msgstr "紀錄" @@ -2755,7 +2863,7 @@ msgstr "主頁" msgid "Hotel Expense" msgstr "住宿費" -#: lib/RT/Base.pm:73 +#: lib/RT/Base.pm:75 #. (6) msgid "I have %quant(%1,concrete mixer)." msgstr "我有 %quant(%1,份固體攪拌器)。" @@ -2768,7 +2876,7 @@ msgstr "身分證號" msgid "ID Type" msgstr "身分類別" -#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1018 +#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1037 msgid "Id" msgstr "編號" @@ -2776,7 +2884,7 @@ msgstr "編號" msgid "Identity" msgstr "身份" -#: etc/initialdata.zh:439 etc/initialdata:411 etc/upgrade/2.1.71:86 html/Edit/Elements/CreateApprovalsQueue:58 +#: etc/initialdata:411 etc/upgrade/2.1.71:86 html/Edit/Elements/CreateApprovalsQueue:58 msgid "If an approval is rejected, reject the original and delete pending approvals" msgstr "若簽核單遭到駁回,則連帶駁回原申請單,並刪除其他相關的待簽核事項" @@ -2788,43 +2896,43 @@ msgstr "如果此工具程式為 setgid,惡意的本地端用戶即能由此 msgid "If you've updated anything above, be sure to" msgstr "若您已更新以上資料,請記得按一下" -#: lib/RT/Interface/Web.pm:896 x:899 +#: lib/RT/Interface/Web.pm:956 msgid "Illegal value for %1" msgstr "%1 的值錯誤" -#: lib/RT/Interface/Web.pm:899 x:902 +#: lib/RT/Interface/Web.pm:959 msgid "Immutable field" msgstr "此欄位值不可更動" -#: html/Edit/Elements/104Buttons:76 html/Edit/Global/Workflow/Import.html:2 +#: html/Edit/Elements/104Buttons:87 html/Edit/Global/Workflow/Import.html:2 msgid "Import" msgstr "匯入" -#: html/Admin/Elements/EditCustomFields:73 +#: html/Admin/Elements/EditCustomFields:72 msgid "Include disabled custom fields in listing." msgstr "列出停用的自訂欄位" -#: html/Admin/Queues/index.html:42 html/Edit/Queues/index.html:38 +#: html/Admin/Queues/index.html:42 html/Edit/Queues/Top:9 msgid "Include disabled queues in listing." msgstr "列出停用的表單" -#: html/Admin/Users/index.html:46 html/Edit/Users/Search.html:62 +#: html/Admin/Users/index.html:46 html/Edit/Users/Search.html:62 html/Edit/Users/Top:9 msgid "Include disabled users in search." msgstr "列出停用的使用者" -#: html/Edit/Users/Info:36 +#: NOT FOUND IN SOURCE msgid "Indirect Employee" msgstr "直接/間接員工" -#: lib/RT/Tickets_Overlay.pm:1067 +#: lib/RT/Tickets_Overlay.pm:1086 msgid "Initial Priority" -msgstr "初始優先權" +msgstr "初始優先順位" -#: lib/RT/Ticket_Overlay.pm:1179 lib/RT/Ticket_Overlay.pm:1181 +#: lib/RT/Ticket_Overlay.pm:1206 lib/RT/Ticket_Overlay.pm:1208 msgid "InitialPriority" -msgstr "初始優先權" +msgstr "初始優先順位" -#: lib/RT/ScripAction_Overlay.pm:104 +#: lib/RT/ScripAction_Overlay.pm:105 msgid "Input error" msgstr "輸入錯誤" @@ -2832,7 +2940,7 @@ msgstr "輸入錯誤" msgid "Interest noted" msgstr "登記成功" -#: lib/RT/Ticket_Overlay.pm:3829 +#: lib/RT/Ticket_Overlay.pm:3913 msgid "Internal Error" msgstr "內部錯誤" @@ -2841,7 +2949,7 @@ msgstr "內部錯誤" msgid "Internal Error: %1" msgstr "內部錯誤:%1" -#: lib/RT/Group_Overlay.pm:643 +#: lib/RT/Group_Overlay.pm:641 msgid "Invalid Group Type" msgstr "錯誤的群組類別" @@ -2853,15 +2961,15 @@ msgstr "錯誤的權限" msgid "Invalid Type" msgstr "錯誤的類型" -#: lib/RT/Interface/Web.pm:901 x:904 +#: lib/RT/Interface/Web.pm:961 msgid "Invalid data" msgstr "錯誤的資料" -#: lib/RT/Ticket_Overlay.pm:439 +#: lib/RT/Ticket_Overlay.pm:463 msgid "Invalid owner. Defaulting to 'nobody'." msgstr "錯誤的承辦人。改為預設承辦人「nobody」。" -#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:250 +#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:251 msgid "Invalid queue" msgstr "錯誤的表單" @@ -2874,11 +2982,11 @@ msgstr "錯誤的權限" msgid "Invalid value for %1" msgstr "%1 的值錯誤" -#: lib/RT/Ticket_Overlay.pm:3461 +#: lib/RT/Ticket_Overlay.pm:3517 msgid "Invalid value for custom field" msgstr "錯誤的自訂欄位值" -#: lib/RT/Ticket_Overlay.pm:346 +#: lib/RT/Ticket_Overlay.pm:365 msgid "Invalid value for status" msgstr "錯誤的狀態值" @@ -2936,7 +3044,7 @@ msgstr "七月" #: lib/RT/Date.pm:417 msgid "Jul." -msgstr "01" +msgstr "07" #: NOT FOUND IN SOURCE msgid "July" @@ -2952,7 +3060,7 @@ msgstr "六月" #: lib/RT/Date.pm:416 msgid "Jun." -msgstr "06." +msgstr "06" #: NOT FOUND IN SOURCE msgid "June" @@ -2982,11 +3090,15 @@ msgstr "鏈結標籤" msgid "Lang" msgstr "使用語言" +#: html/User/Prefs.html:54 html/Work/Preferences/Info:29 +msgid "Language" +msgstr "語言" + #: html/Ticket/Elements/Tabs:72 msgid "Last" msgstr "上次更新" -#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:38 +#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:39 html/Work/Tickets/Elements/EditBasics:44 msgid "Last Contact" msgstr "上次聯絡" @@ -3010,11 +3122,11 @@ msgstr "上次更新" msgid "Left" msgstr "剩餘時間" -#: html/Admin/Users/Modify.html:82 +#: html/Admin/Users/Modify.html:82 html/Edit/Users/Info:62 msgid "Let this user access RT" msgstr "允許這名使用者登入" -#: html/Admin/Users/Modify.html:86 +#: html/Admin/Users/Modify.html:86 html/Edit/Users/Info:68 msgid "Let this user be granted rights" msgstr "內部成員(具有個人權限)" @@ -3030,25 +3142,25 @@ msgstr "限制表單為 %1 到 %2" msgid "Link a Queue" msgstr "申請表單連結" -#: lib/RT/Ticket_Overlay.pm:2717 +#: lib/RT/Ticket_Overlay.pm:2765 msgid "Link already exists" msgstr "此鏈結已存在" -#: lib/RT/Ticket_Overlay.pm:2729 +#: lib/RT/Ticket_Overlay.pm:2777 msgid "Link could not be created" msgstr "無法新增鏈結" -#: lib/RT/Ticket_Overlay.pm:2737 lib/RT/Ticket_Overlay.pm:2747 +#: lib/RT/Ticket_Overlay.pm:2785 lib/RT/Ticket_Overlay.pm:2797 #. ($TransString) msgid "Link created (%1)" msgstr "鏈結(%1)新增完畢" -#: lib/RT/Ticket_Overlay.pm:2658 +#: lib/RT/Ticket_Overlay.pm:2698 #. ($TransString) msgid "Link deleted (%1)" msgstr "鏈結(%1)刪除完畢" -#: lib/RT/Ticket_Overlay.pm:2664 +#: lib/RT/Ticket_Overlay.pm:2704 msgid "Link not found" msgstr "找不到鏈結" @@ -3069,20 +3181,20 @@ msgstr "鏈結" msgid "List All Users" msgstr "列出所有用戶資料" -#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:84 html/Work/Preferences/Info:73 +#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:107 html/Work/Preferences/Info:75 msgid "Location" msgstr "位置" -#: lib/RT.pm:162 +#: lib/RT.pm:174 #. ($RT::LogDir) msgid "Log directory %1 not found or couldn't be written.\\n RT can't run." msgstr "登入目錄 %1 找不到或無法寫入\\n。無法執行 RT。" -#: html/Edit/Global/Basic/Top:52 +#: html/Edit/Global/Basic/Top:57 msgid "LogToFile" msgstr "紀錄等級" -#: html/Edit/Global/Basic/Top:54 +#: html/Edit/Global/Basic/Top:59 msgid "LogToFileNamed" msgstr "紀錄檔名" @@ -3091,7 +3203,7 @@ msgstr "紀錄檔名" msgid "Logged in as %1" msgstr "使用者:%1" -#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 +#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 lib/RT/StyleGuide.pod:777 msgid "Login" msgstr "登入" @@ -3183,6 +3295,10 @@ msgstr "三月" msgid "Marketing Department" msgstr "行銷部" +#: html/Edit/Global/CustomField/Top:63 +msgid "Match Pattern" +msgstr "符合樣式" + #: NOT FOUND IN SOURCE msgid "May" msgstr "五月" @@ -3191,23 +3307,33 @@ msgstr "五月" msgid "May." msgstr "05" -#: lib/RT/Group_Overlay.pm:981 +#: lib/RT/Transaction_Overlay.pm:598 +#. ($value) +msgid "Member %1 added" +msgstr "成員 %1 新增完畢" + +#: lib/RT/Transaction_Overlay.pm:635 +#. ($value) +msgid "Member %1 deleted" +msgstr "成員 %1 刪除完畢" + +#: lib/RT/Group_Overlay.pm:979 msgid "Member added" msgstr "新增成員完畢" -#: lib/RT/Group_Overlay.pm:1139 +#: lib/RT/Group_Overlay.pm:1141 msgid "Member deleted" msgstr "成員已刪除" -#: lib/RT/Group_Overlay.pm:1143 +#: lib/RT/Group_Overlay.pm:1145 msgid "Member not deleted" -msgstr "成員未被刪除" +msgstr "成員未刪除" #: html/Elements/SelectLinkType:25 msgid "Member of" msgstr "隸屬於" -#: html/Work/Preferences/index.html:20 +#: html/Work/Preferences/index.html:19 msgid "Member since" msgstr "註冊日期" @@ -3219,15 +3345,25 @@ msgstr "隸屬於" msgid "Members" msgstr "成員" -#: lib/RT/Ticket_Overlay.pm:2904 +#: lib/RT/Transaction_Overlay.pm:595 +#. ($value) +msgid "Membership in %1 added" +msgstr "所屬群組 %1 加入完畢" + +#: lib/RT/Transaction_Overlay.pm:632 +#. ($value) +msgid "Membership in %1 deleted" +msgstr "所屬群組 %1 移除完畢" + +#: lib/RT/Ticket_Overlay.pm:2954 msgid "Merge Successful" msgstr "整合完畢" -#: lib/RT/Ticket_Overlay.pm:2824 +#: lib/RT/Ticket_Overlay.pm:2874 msgid "Merge failed. Couldn't set EffectiveId" msgstr "整合失敗。無法設定 EffectiveId" -#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:114 html/Work/Search/BulkLinks:2 +#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:97 html/Work/Search/BulkLinks:2 html/Work/Tickets/Elements/EditLinks:101 msgid "Merge into" msgstr "整合進" @@ -3235,15 +3371,19 @@ msgstr "整合進" msgid "Message" msgstr "訊息" +#: html/Ticket/Elements/ShowTransaction:80 +msgid "Message body not shown because it is too large or is not plain text." +msgstr "信件內文不是純文字,因此無法顯示。" + #: NOT FOUND IN SOURCE msgid "Misc. Expense" msgstr "雜費" -#: lib/RT/Interface/Web.pm:903 x:906 +#: lib/RT/Interface/Web.pm:963 msgid "Missing a primary key?: %1" msgstr "缺少主鍵值?(%1)" -#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:53 html/Work/Preferences/Info:36 +#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:71 html/Work/Preferences/Info:38 msgid "Mobile" msgstr "行動電話" @@ -3400,7 +3540,7 @@ msgstr "更改群組 %1" msgid "Modify the queue watchers" msgstr "更改表單視察員" -#: html/Admin/Users/Modify.html:235 +#: html/Admin/Users/Modify.html:237 #. ($UserObj->Name) msgid "Modify the user %1" msgstr "更改使用者 %1" @@ -3508,7 +3648,7 @@ msgstr "上移" msgid "Multiple" msgstr "多重" -#: lib/RT/User_Overlay.pm:238 +#: lib/RT/User_Overlay.pm:242 msgid "Must specify 'Name' attribute" msgstr "必須指定 'Name' 的屬性" @@ -3533,15 +3673,15 @@ msgstr "表單處理" msgid "My approvals" msgstr "表單簽核" -#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Elements/ModifyTemplateAsWorkflow:185 html/Admin/Elements/ModifyUser:29 html/Admin/Groups/Modify.html:43 html/Edit/Users/Add.html:22 html/Edit/Users/Search.html:31 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 html/Work/Tickets/Cc:18 +#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Elements/ModifyTemplateAsWorkflow:185 html/Admin/Elements/ModifyUser:29 html/Admin/Groups/Modify.html:43 html/Edit/Elements/SelectQueues:3 html/Edit/Queues/List:8 html/Edit/Users/Add.html:22 html/Edit/Users/List:5 html/Edit/Users/Search.html:31 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 html/Work/Tickets/Cc:18 msgid "Name" msgstr "名稱" -#: lib/RT/User_Overlay.pm:245 +#: lib/RT/User_Overlay.pm:249 msgid "Name in use" msgstr "帳號已有人使用" -#: html/Edit/Users/Info:27 +#: NOT FOUND IN SOURCE msgid "Nationality" msgstr "國籍" @@ -3549,23 +3689,23 @@ msgstr "國籍" msgid "Need approval from system administrator" msgstr "需先由系統管理員進行批准" -#: html/Ticket/Elements/ShowDates:51 +#: html/Ticket/Elements/ShowDates:52 msgid "Never" msgstr "從未更動" -#: html/Elements/Quicksearch:29 html/Work/Elements/Quicksearch:15 html/Work/Tickets/Create.html:54 +#: html/Elements/Quicksearch:29 html/Work/Elements/Quicksearch:15 html/Work/Tickets/Create.html:53 msgid "New" msgstr "新建立" -#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/User/Prefs.html:64 html/Work/Preferences/Info:47 +#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/Edit/Users/Info:33 html/User/Prefs.html:87 html/Work/Preferences/Info:49 msgid "New Password" msgstr "新的密碼" -#: etc/initialdata.zh:341 etc/initialdata:317 etc/upgrade/2.1.71:16 html/Edit/Elements/CreateApprovalsQueue:21 +#: etc/initialdata:317 etc/upgrade/2.1.71:16 html/Edit/Elements/CreateApprovalsQueue:21 msgid "New Pending Approval" msgstr "新的待簽核事項" -#: html/Ticket/Elements/EditLinks:110 +#: html/Ticket/Elements/EditLinks:93 html/Work/Tickets/Elements/EditLinks:12 msgid "New Relationships" msgstr "新增關係" @@ -3577,7 +3717,11 @@ msgstr "表單申請" msgid "New Search" msgstr "新增查詢" -#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:39 +#: html/Work/Tickets/Elements/EditPeople:7 +msgid "New Watchers" +msgstr "新增視察員" + +#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:40 msgid "New custom field" msgstr "新增自訂欄位" @@ -3589,7 +3733,7 @@ msgstr "新增群組" msgid "New password" msgstr "新的密碼" -#: lib/RT/User_Overlay.pm:764 +#: lib/RT/User_Overlay.pm:769 msgid "New password notification sent" msgstr "送出新密碼通知" @@ -3621,7 +3765,7 @@ msgstr "新增範本" msgid "New ticket" msgstr "提出申請單" -#: lib/RT/Ticket_Overlay.pm:2791 +#: lib/RT/Ticket_Overlay.pm:2841 msgid "New ticket doesn't exist" msgstr "沒有新申請單" @@ -3657,7 +3801,7 @@ msgstr "下一頁" msgid "NickName" msgstr "暱稱" -#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:45 html/Work/Preferences/Info:26 +#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:50 html/Work/Preferences/Info:26 msgid "Nickname" msgstr "暱稱" @@ -3665,11 +3809,11 @@ msgstr "暱稱" msgid "Night Shift" msgstr "小夜班" -#: html/Edit/Global/Basic/Top:27 +#: html/Edit/Global/Basic/Top:27 html/Edit/Queues/Basic/Top:83 msgid "No" msgstr "否" -#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:104 +#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:103 msgid "No CustomField" msgstr "無自訂欄位" @@ -3705,7 +3849,7 @@ msgstr "沒有流程" msgid "No action" msgstr "暫不處理" -#: lib/RT/Interface/Web.pm:898 x:901 +#: lib/RT/Interface/Web.pm:958 msgid "No column specified" msgstr "未指定欄位" @@ -3717,7 +3861,7 @@ msgstr "找不到命令" msgid "No comment entered about this user" msgstr "沒有對這名使用者的評論" -#: lib/RT/Ticket_Overlay.pm:2202 lib/RT/Ticket_Overlay.pm:2270 +#: lib/RT/Ticket_Overlay.pm:2229 lib/RT/Ticket_Overlay.pm:2299 msgid "No correspondence attached" msgstr "沒有附上申請單回覆" @@ -3726,11 +3870,11 @@ msgstr "沒有附上申請單回覆" msgid "No description for %1" msgstr "沒有對 %1 的描述" -#: lib/RT/Users_Overlay.pm:150 +#: lib/RT/Users_Overlay.pm:149 msgid "No group specified" msgstr "未指定群組" -#: lib/RT/User_Overlay.pm:982 +#: lib/RT/User_Overlay.pm:987 msgid "No password set" msgstr "沒有設定密碼" @@ -3738,24 +3882,24 @@ msgstr "沒有設定密碼" msgid "No permission to create queues" msgstr "沒有新增表單的權限" -#: lib/RT/Ticket_Overlay.pm:342 +#: lib/RT/Ticket_Overlay.pm:361 #. ($QueueObj->Name) msgid "No permission to create tickets in the queue '%1'" msgstr "沒有在表單 '%1' 新增申請單的權限" -#: lib/RT/User_Overlay.pm:211 +#: lib/RT/User_Overlay.pm:208 msgid "No permission to create users" msgstr "沒有新增使用者的權限" -#: html/SelfService/Display.html:117 +#: html/SelfService/Display.html:123 msgid "No permission to display that ticket" msgstr "沒有顯示該申請單的權限" -#: html/SelfService/Update.html:51 +#: html/SelfService/Update.html:68 msgid "No permission to view update ticket" msgstr "沒有檢視申請單更新的權限" -#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1487 +#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1514 msgid "No principal specified" msgstr "未指定單位" @@ -3771,7 +3915,7 @@ msgstr "%1 內未指定協定" msgid "No queues matching search criteria found." msgstr "找不到符合查詢條件的表單。" -#: html/Admin/Elements/SelectRights:80 +#: html/Admin/Elements/SelectRights:81 msgid "No rights found" msgstr "找不到權限" @@ -3787,7 +3931,7 @@ msgstr "沒有要進行的查詢" msgid "No ticket id specified" msgstr "未指定申請單編號" -#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516 +#: lib/RT/Transaction_Overlay.pm:427 lib/RT/Transaction_Overlay.pm:465 msgid "No transaction type specified" msgstr "未指定更動報告類別" @@ -3803,7 +3947,7 @@ msgstr "找不到符合查詢條件的使用者。" msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" msgstr "找不到合格的 RT 使用者。RT cvs 處理器已停用。請向 RT 管理者詢問。\\n" -#: lib/RT/Interface/Web.pm:895 x:898 +#: lib/RT/Interface/Web.pm:955 msgid "No value sent to _Set!\\n" msgstr "_Set 沒有收到任何值!\\n" @@ -3811,7 +3955,7 @@ msgstr "_Set 沒有收到任何值!\\n" msgid "Nobody" msgstr "沒有人" -#: lib/RT/Interface/Web.pm:900 x:903 +#: lib/RT/Interface/Web.pm:960 msgid "Nonexistant field?" msgstr "欄位不存在?" @@ -3843,7 +3987,7 @@ msgstr "尚未完工。" msgid "Not yet implemented...." msgstr "尚未完工..." -#: html/Approvals/Elements/Approve:48 html/Work/Tickets/Create.html:143 +#: html/Approvals/Elements/Approve:48 html/Work/Tickets/Elements/AddContent:9 msgid "Notes" msgstr "備註" @@ -3851,67 +3995,67 @@ msgstr "備註" msgid "Notes:" msgstr "備註:" -#: lib/RT/User_Overlay.pm:767 +#: lib/RT/User_Overlay.pm:772 msgid "Notification could not be sent" msgstr "無法送出通知" -#: etc/initialdata.zh:111 etc/initialdata:93 +#: etc/initialdata:93 msgid "Notify AdminCcs" msgstr "通知管理員副本收件人" -#: etc/initialdata.zh:107 etc/initialdata:89 +#: etc/initialdata:89 msgid "Notify AdminCcs as Comment" msgstr "以評論方式通知管理員副本收件人" -#: etc/initialdata.zh:138 etc/initialdata:120 +#: etc/initialdata:120 msgid "Notify Other Recipients" msgstr "通知其他收件人" -#: etc/initialdata.zh:134 etc/initialdata:116 +#: etc/initialdata:116 msgid "Notify Other Recipients as Comment" msgstr "以評論方式通知其他收件人" -#: etc/initialdata.zh:103 etc/initialdata:85 +#: etc/initialdata:85 msgid "Notify Owner" msgstr "通知承辦人" -#: etc/initialdata.zh:99 etc/initialdata:81 +#: etc/initialdata:81 msgid "Notify Owner as Comment" msgstr "以評論方式通知承辦人" -#: etc/initialdata.zh:385 etc/initialdata:361 +#: etc/initialdata:361 msgid "Notify Owner of their rejected ticket" msgstr "通知承辦人申請單已駁回" -#: etc/initialdata.zh:374 etc/initialdata:350 +#: etc/initialdata:350 msgid "Notify Owner of their ticket has been approved by all approvers" msgstr "通知承辦人申請單已完成全部簽核" -#: etc/initialdata.zh:359 etc/initialdata:338 +#: etc/initialdata:338 msgid "Notify Owner of their ticket has been approved by some approver" msgstr "通知承辦人申請單已完成某項簽核" -#: etc/initialdata.zh:343 etc/initialdata:319 etc/upgrade/2.1.71:17 html/Edit/Elements/CreateApprovalsQueue:22 +#: etc/initialdata:319 etc/upgrade/2.1.71:17 html/Edit/Elements/CreateApprovalsQueue:22 msgid "Notify Owners and AdminCcs of new items pending their approval" msgstr "整理待簽核事項,通知承辦人及管理員副本收件人" -#: etc/initialdata.zh:95 etc/initialdata:77 +#: etc/initialdata:77 msgid "Notify Requestors" msgstr "通知申請人" -#: etc/initialdata.zh:121 etc/initialdata:103 +#: etc/initialdata:103 msgid "Notify Requestors and Ccs" msgstr "通知申請人及副本收件人" -#: etc/initialdata.zh:116 etc/initialdata:98 +#: etc/initialdata:98 msgid "Notify Requestors and Ccs as Comment" msgstr "以評論方式通知申請人及副本收件人" -#: etc/initialdata.zh:130 etc/initialdata:112 +#: etc/initialdata:112 msgid "Notify Requestors, Ccs and AdminCcs" msgstr "通知申請人、副本及管理員副本收件人" -#: etc/initialdata.zh:126 etc/initialdata:108 +#: etc/initialdata:108 msgid "Notify Requestors, Ccs and AdminCcs as Comment" msgstr "以評論方式通知申請人、副本及管理員副本收件人" @@ -3931,9 +4075,9 @@ msgstr "11" msgid "November" msgstr "十一月" -#: html/Edit/Global/Basic/Top:74 +#: html/Edit/Global/Basic/Top:83 msgid "OIN104" -msgstr "配合 104eHRMS 介面" +msgstr "104eHRMS 介面" #: html/Edit/Global/Workflow/Export.html:30 html/Work/Copyright.html:23 msgid "OK" @@ -3947,7 +4091,7 @@ msgstr "無法新增物件" msgid "Object created" msgstr "物件新增完畢" -#: html/Edit/Users/Info:35 +#: NOT FOUND IN SOURCE msgid "Occupation Status" msgstr "在職狀態" @@ -3963,7 +4107,7 @@ msgstr "10" msgid "October" msgstr "十月" -#: html/Edit/Users/Info:32 +#: NOT FOUND IN SOURCE msgid "Office Phone" msgstr "辦公室電話" @@ -3971,35 +4115,39 @@ msgstr "辦公室電話" msgid "On" msgstr "等於" -#: etc/initialdata.zh:173 etc/initialdata:155 +#: html/Edit/Global/CustomField/Top:68 +msgid "On Change" +msgstr "更改申請單時" + +#: etc/initialdata:155 msgid "On Comment" msgstr "評論時" -#: etc/initialdata.zh:166 etc/initialdata:148 +#: etc/initialdata:148 msgid "On Correspond" msgstr "回覆申請單時" -#: etc/initialdata.zh:155 etc/initialdata:137 +#: etc/initialdata:137 html/Edit/Global/CustomField/Top:57 msgid "On Create" msgstr "新增申請單時" -#: etc/initialdata.zh:187 etc/initialdata:169 +#: etc/initialdata:169 msgid "On Owner Change" msgstr "承辦人改變時" -#: etc/initialdata.zh:195 etc/initialdata:177 +#: etc/initialdata:177 msgid "On Queue Change" msgstr "表單改變時" -#: etc/initialdata.zh:201 etc/initialdata:183 +#: etc/initialdata:183 msgid "On Resolve" msgstr "解決申請單時" -#: etc/initialdata.zh:179 etc/initialdata:161 +#: etc/initialdata:161 msgid "On Status Change" msgstr "現況改變時" -#: etc/initialdata.zh:160 etc/initialdata:142 +#: etc/initialdata:142 msgid "On Transaction" msgstr "發生更動時" @@ -4013,7 +4161,7 @@ msgstr "僅顯示 %1 之後新增的申請單" msgid "Only show approvals for requests created before %1" msgstr "僅顯示 %1 之前新增的申請單" -#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:18 html/Edit/Queues/Basic/Top:69 html/Edit/Queues/List:13 html/Elements/Quicksearch:30 html/Work/Delegates/Info:48 html/Work/Delegates/Info:51 html/Work/Delegates/List:12 html/Work/Elements/Quicksearch:16 html/Work/Overview/Info:41 html/Work/Tickets/Display.html:28 +#: html/Edit/Global/GroupRight/List:9 html/Edit/Global/GroupRight/Top:16 html/Edit/Groups/List:11 html/Edit/Groups/Top:18 html/Edit/Queues/Basic/Top:68 html/Edit/Queues/List:15 html/Edit/Queues/List:27 html/Elements/Quicksearch:30 html/Work/Delegates/Info:48 html/Work/Delegates/Info:51 html/Work/Delegates/List:12 html/Work/Elements/Quicksearch:16 html/Work/Overview/Info:41 html/Work/Tickets/Display.html:51 msgid "Open" msgstr "開啟" @@ -4033,7 +4181,7 @@ msgstr "在新視窗開啟(列表的)申請單" msgid "Open tickets (from listing) in another window" msgstr "在另一個視窗開啟(列表的)申請單" -#: etc/initialdata.zh:150 etc/initialdata:132 +#: etc/initialdata:132 msgid "Open tickets on correspondence" msgstr "收到回覆時即開啟申請單" @@ -4053,11 +4201,11 @@ msgstr "選項描述" msgid "Option Name" msgstr "選項名稱" -#: html/Search/Elements/PickRestriction:100 html/Work/Search/PickRestriction:81 +#: html/Search/Elements/PickRestriction:100 html/Work/Search/PickRestriction:87 msgid "Ordering and sorting" msgstr "順序與排序方式" -#: html/Admin/Elements/ModifyUser:45 html/Admin/Users/Modify.html:116 html/Edit/Global/Basic/Top:50 html/Elements/SelectUsers:28 html/User/Prefs.html:85 html/Work/Preferences/Info:75 +#: html/Admin/Elements/ModifyUser:45 html/Admin/Users/Modify.html:116 html/Edit/Elements/SelectUsers:7 html/Edit/Global/Basic/Top:55 html/Elements/SelectUsers:28 html/User/Prefs.html:110 html/Work/Preferences/Info:77 msgid "Organization" msgstr "組織名稱" @@ -4070,11 +4218,11 @@ msgstr "組織:" msgid "Originating ticket: #%1" msgstr "原申請單:#%1" -#: html/Edit/Elements/PickUsers:109 html/Edit/Users/Add.html:106 html/Work/Tickets/Cc:80 +#: html/Edit/Elements/PickUsers:111 html/Edit/Users/Add.html:106 html/Work/Tickets/Cc:80 msgid "Other comma-delimited email addresses" msgstr "其他e-mail帳號 (僅e-mail通知;多筆帳號請用逗號','區隔)" -#: html/Admin/Elements/ModifyQueue:54 html/Admin/Queues/Modify.html:68 html/Edit/Queues/Basic/Top:41 +#: html/Admin/Elements/ModifyQueue:54 html/Admin/Queues/Modify.html:68 html/Edit/Queues/Basic/Top:44 msgid "Over time, priority moves toward" msgstr "優先順位隨時間增加調整為" @@ -4086,7 +4234,7 @@ msgstr "以 %1 表單的自訂欄位取代現有欄位" msgid "Override global rights" msgstr "取代全域權限" -#: html/Admin/Elements/CheckOverrideGlobalACL:34 +#: html/Admin/Elements/CheckOverrideGlobalACL:36 #. (loc_fuzzy($msg)) msgid "OverrideGlobalACL status %1" msgstr "取代全域權限 %1" @@ -4103,7 +4251,7 @@ msgstr "承辦申請單" msgid "OwnTicket" msgstr "承辦申請單" -#: etc/initialdata.zh:56 etc/initialdata:38 html/Admin/Elements/ModifyTemplateAsWorkflow:141 html/Edit/Global/Workflow/Owner.html:19 html/Edit/Queues/Basic/Top:47 html/Edit/Queues/Basic/Top:58 html/Elements/MyRequests:31 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:62 html/Work/Elements/MyRequests:19 html/Work/Elements/Quicksearch:18 html/Work/Tickets/Elements/ShowBasics:21 html/Work/Tickets/Update.html:27 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1244 +#: etc/initialdata:38 html/Admin/Elements/ModifyTemplateAsWorkflow:141 html/Edit/Global/Workflow/Owner.html:19 html/Edit/Queues/Basic/Top:51 html/Edit/Queues/Basic/Top:59 html/Elements/MyRequests:31 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:62 html/Work/Elements/MyRequests:19 html/Work/Elements/Quicksearch:18 html/Work/Tickets/Elements/EditPeople:28 html/Work/Tickets/Elements/ShowBasics:21 html/Work/Tickets/Update.html:27 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1263 msgid "Owner" msgstr "承辦人" @@ -4111,7 +4259,7 @@ msgstr "承辦人" msgid "Owner changed from %1 to %2" msgstr "承辦人已從 %1 改為 %2" -#: lib/RT/Transaction_Overlay.pm:582 +#: lib/RT/Transaction_Overlay.pm:539 #. ($Old->Name , $New->Name) msgid "Owner forcibly changed from %1 to %2" msgstr "強制將承辦人從 %1 改為 %2" @@ -4120,15 +4268,15 @@ msgstr "強制將承辦人從 %1 改為 %2" msgid "Owner is" msgstr "承辦人" -#: html/Work/Elements/List:27 html/Work/Queues/List:8 html/Work/Tickets/Create.html:56 html/Work/Tickets/Elements/ShowBasics:60 +#: html/Work/Elements/List:27 html/Work/Queues/List:8 html/Work/Tickets/Create.html:55 html/Work/Tickets/Elements/ShowBasics:60 msgid "Owner's Phone" msgstr "承辦人電話" -#: html/Edit/Elements/Page:39 -msgid "Page" +#: html/Edit/Elements/Page:40 +msgid "Page #" msgstr " " -#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:55 html/Work/Preferences/Info:38 +#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:75 html/Work/Preferences/Info:40 msgid "Pager" msgstr "呼叫器" @@ -4136,7 +4284,7 @@ msgstr "呼叫器" msgid "PagerPhone" msgstr "呼叫器號碼" -#: html/Edit/Global/Workflow/Action:81 html/Edit/Global/Workflow/Condition:66 +#: html/Edit/Global/Workflow/Action:75 html/Edit/Global/Workflow/Condition:65 msgid "Parameter" msgstr "呼叫參數" @@ -4144,7 +4292,7 @@ msgstr "呼叫參數" msgid "Parent" msgstr "上級" -#: html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:38 html/Ticket/Elements/EditLinks:126 html/Ticket/Elements/EditLinks:57 html/Ticket/Elements/ShowLinks:46 html/Work/Search/BulkLinks:14 +#: html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:38 html/Ticket/Elements/EditLinks:109 html/Ticket/Elements/EditLinks:54 html/Ticket/Elements/ShowLinks:46 html/Work/Search/BulkLinks:14 html/Work/Tickets/Elements/EditLinks:113 html/Work/Tickets/Elements/EditLinks:45 html/Work/Tickets/Elements/ShowLinks:26 msgid "Parents" msgstr "母申請單" @@ -4152,7 +4300,7 @@ msgstr "母申請單" msgid "Park Space" msgstr "停車位申請" -#: html/Elements/Login:52 html/User/Prefs.html:60 html/Work/Preferences/Info:44 +#: html/Elements/Login:52 html/User/Prefs.html:83 html/Work/Preferences/Info:46 msgid "Password" msgstr "密碼" @@ -4160,20 +4308,20 @@ msgstr "密碼" msgid "Password Reminder" msgstr "密碼提示" -#: lib/RT/User_Overlay.pm:228 lib/RT/User_Overlay.pm:985 +#: lib/RT/User_Overlay.pm:230 lib/RT/User_Overlay.pm:990 msgid "Password too short" msgstr "密碼太短" -#: html/Admin/Users/Modify.html:290 html/User/Prefs.html:171 html/Work/Preferences/Info:167 +#: html/Admin/Users/Modify.html:292 html/User/Prefs.html:209 html/Work/Preferences/Info:173 #. (loc_fuzzy($msg)) msgid "Password: %1" msgstr "密碼:%1" -#: html/Admin/Users/Modify.html:292 +#: html/Admin/Users/Modify.html:294 msgid "Passwords do not match." msgstr "密碼確認失敗。" -#: html/User/Prefs.html:173 html/Work/Preferences/Info:169 +#: html/User/Prefs.html:211 html/Work/Preferences/Info:175 msgid "Passwords do not match. Your password has not been changed" msgstr "密碼確認失敗。您的密碼並未改變。" @@ -4193,11 +4341,11 @@ msgstr "人員" msgid "People with Queue Rights" msgstr "擁有表單權限人員" -#: etc/initialdata.zh:143 etc/initialdata:125 +#: etc/initialdata:125 msgid "Perform a user-defined action" msgstr "執行使用者自訂的動作" -#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/CurrentUser.pm:82 lib/RT/CurrentUser.pm:91 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:201 lib/RT/CustomField_Overlay.pm:233 lib/RT/CustomField_Overlay.pm:510 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1094 lib/RT/Group_Overlay.pm:1098 lib/RT/Group_Overlay.pm:1107 lib/RT/Group_Overlay.pm:1158 lib/RT/Group_Overlay.pm:1162 lib/RT/Group_Overlay.pm:1168 lib/RT/Group_Overlay.pm:425 lib/RT/Group_Overlay.pm:517 lib/RT/Group_Overlay.pm:595 lib/RT/Group_Overlay.pm:603 lib/RT/Group_Overlay.pm:700 lib/RT/Group_Overlay.pm:704 lib/RT/Group_Overlay.pm:710 lib/RT/Group_Overlay.pm:903 lib/RT/Group_Overlay.pm:907 lib/RT/Group_Overlay.pm:920 lib/RT/Queue_Overlay.pm:540 lib/RT/Queue_Overlay.pm:550 lib/RT/Queue_Overlay.pm:564 lib/RT/Queue_Overlay.pm:699 lib/RT/Queue_Overlay.pm:708 lib/RT/Queue_Overlay.pm:721 lib/RT/Queue_Overlay.pm:931 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:196 lib/RT/Scrip_Overlay.pm:433 lib/RT/Template_Overlay.pm:283 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1359 lib/RT/Ticket_Overlay.pm:1369 lib/RT/Ticket_Overlay.pm:1383 lib/RT/Ticket_Overlay.pm:1517 lib/RT/Ticket_Overlay.pm:1526 lib/RT/Ticket_Overlay.pm:1539 lib/RT/Ticket_Overlay.pm:1888 lib/RT/Ticket_Overlay.pm:2026 lib/RT/Ticket_Overlay.pm:2190 lib/RT/Ticket_Overlay.pm:2257 lib/RT/Ticket_Overlay.pm:2616 lib/RT/Ticket_Overlay.pm:2688 lib/RT/Ticket_Overlay.pm:2782 lib/RT/Ticket_Overlay.pm:2797 lib/RT/Ticket_Overlay.pm:2996 lib/RT/Ticket_Overlay.pm:3006 lib/RT/Ticket_Overlay.pm:3011 lib/RT/Ticket_Overlay.pm:3233 lib/RT/Ticket_Overlay.pm:3431 lib/RT/Ticket_Overlay.pm:3593 lib/RT/Ticket_Overlay.pm:3645 lib/RT/Ticket_Overlay.pm:3823 lib/RT/Transaction_Overlay.pm:466 lib/RT/Transaction_Overlay.pm:473 lib/RT/Transaction_Overlay.pm:502 lib/RT/Transaction_Overlay.pm:509 lib/RT/User_Overlay.pm:1079 lib/RT/User_Overlay.pm:1527 lib/RT/User_Overlay.pm:687 lib/RT/User_Overlay.pm:722 lib/RT/User_Overlay.pm:978 +#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/CurrentUser.pm:82 lib/RT/CurrentUser.pm:91 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:201 lib/RT/CustomField_Overlay.pm:233 lib/RT/CustomField_Overlay.pm:511 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1096 lib/RT/Group_Overlay.pm:1100 lib/RT/Group_Overlay.pm:1109 lib/RT/Group_Overlay.pm:1160 lib/RT/Group_Overlay.pm:1164 lib/RT/Group_Overlay.pm:1170 lib/RT/Group_Overlay.pm:423 lib/RT/Group_Overlay.pm:515 lib/RT/Group_Overlay.pm:593 lib/RT/Group_Overlay.pm:601 lib/RT/Group_Overlay.pm:698 lib/RT/Group_Overlay.pm:702 lib/RT/Group_Overlay.pm:708 lib/RT/Group_Overlay.pm:901 lib/RT/Group_Overlay.pm:905 lib/RT/Group_Overlay.pm:918 lib/RT/Queue_Overlay.pm:540 lib/RT/Queue_Overlay.pm:550 lib/RT/Queue_Overlay.pm:564 lib/RT/Queue_Overlay.pm:699 lib/RT/Queue_Overlay.pm:708 lib/RT/Queue_Overlay.pm:721 lib/RT/Queue_Overlay.pm:934 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:201 lib/RT/Scrip_Overlay.pm:441 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1386 lib/RT/Ticket_Overlay.pm:1396 lib/RT/Ticket_Overlay.pm:1410 lib/RT/Ticket_Overlay.pm:1544 lib/RT/Ticket_Overlay.pm:1553 lib/RT/Ticket_Overlay.pm:1566 lib/RT/Ticket_Overlay.pm:1915 lib/RT/Ticket_Overlay.pm:2053 lib/RT/Ticket_Overlay.pm:2217 lib/RT/Ticket_Overlay.pm:2286 lib/RT/Ticket_Overlay.pm:2647 lib/RT/Ticket_Overlay.pm:2728 lib/RT/Ticket_Overlay.pm:2832 lib/RT/Ticket_Overlay.pm:2847 lib/RT/Ticket_Overlay.pm:3046 lib/RT/Ticket_Overlay.pm:3056 lib/RT/Ticket_Overlay.pm:3061 lib/RT/Ticket_Overlay.pm:3284 lib/RT/Ticket_Overlay.pm:3288 lib/RT/Ticket_Overlay.pm:3487 lib/RT/Ticket_Overlay.pm:3649 lib/RT/Ticket_Overlay.pm:3701 lib/RT/Ticket_Overlay.pm:3907 lib/RT/Transaction_Overlay.pm:415 lib/RT/Transaction_Overlay.pm:422 lib/RT/Transaction_Overlay.pm:451 lib/RT/Transaction_Overlay.pm:458 lib/RT/User_Overlay.pm:1084 lib/RT/User_Overlay.pm:1532 lib/RT/User_Overlay.pm:692 lib/RT/User_Overlay.pm:727 lib/RT/User_Overlay.pm:983 msgid "Permission Denied" msgstr "權限不足" @@ -4234,6 +4382,22 @@ msgid "PersonalHomepage" msgstr "個人首頁" #: NOT FOUND IN SOURCE +msgid "Phase 1: Create/Rename Groups (%1)" +msgstr "第一階段:群組建立及改名 (%1)" + +#: NOT FOUND IN SOURCE +msgid "Phase 2: Disable/Enable Groups (%1)" +msgstr "第二階段:群組停用及啟用 (%1)" + +#: NOT FOUND IN SOURCE +msgid "Phase 3: Create/Rename Users (%1)" +msgstr "第三階段:使用者建立及改名 (%1)" + +#: NOT FOUND IN SOURCE +msgid "Phase 4: Disable/Enable Users (%1)" +msgstr "第四階段:使用者停用及啟用 (%1)" + +#: NOT FOUND IN SOURCE msgid "Phone" msgstr "電話" @@ -4241,11 +4405,11 @@ msgstr "電話" msgid "Phone number" msgstr "電話號碼" -#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:48 html/Work/Preferences/Info:30 +#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:60 html/Work/Preferences/Info:32 msgid "Phone numbers" msgstr "電話號碼" -#: html/Edit/Users/Add.html:3 html/Work/Delegates/Add.html:3 html/Work/Delegates/Info:34 html/Work/Tickets/ModifyPeople.html:2 +#: html/Edit/Queues/Basic/Add.html:3 html/Edit/Queues/Basic/Top:55 html/Edit/Users/Add.html:3 html/Work/Delegates/Add.html:3 html/Work/Delegates/Info:34 html/Work/Tickets/ModifyPeople.html:2 msgid "Pick" msgstr "挑選" @@ -4257,7 +4421,7 @@ msgstr "出發地點" msgid "Placeholder" msgstr "尚未完工" -#: html/Edit/Elements/PickUsers:31 html/Edit/Elements/PickUsers:44 html/Edit/Elements/SelectCustomFieldType:3 html/Work/Elements/SelectOwner:3 html/Work/Tickets/Elements/EditCustomField:183 html/Work/Tickets/Elements/EditCustomField:75 html/Work/Tickets/Elements/EditCustomFieldEntries:81 html/Work/Tickets/Elements/EditCustomFieldEntries:88 +#: html/Edit/Elements/PickUsers:31 html/Edit/Elements/PickUsers:44 html/Edit/Elements/SelectCustomFieldType:3 html/Work/Elements/SelectOwner:3 html/Work/Tickets/Elements/EditCustomField:187 html/Work/Tickets/Elements/EditCustomFieldEntry:24 html/Work/Tickets/Elements/EditCustomFieldEntry:35 msgid "Please Select" msgstr "請選擇" @@ -4274,6 +4438,10 @@ msgid "Please select a queue's workflow" msgstr "請選擇表單流程" #: NOT FOUND IN SOURCE +msgid "Please select one of the category types above." +msgstr "請從上面選擇一項分類。" + +#: NOT FOUND IN SOURCE msgid "Please select role" msgstr "請選擇角色" @@ -4285,19 +4453,19 @@ msgstr "經營規章" msgid "Position" msgstr "職務" -#: html/Edit/Users/Info:42 +#: NOT FOUND IN SOURCE msgid "Position Level" msgstr "職等" -#: html/Edit/Elements/PickUsers:41 html/Edit/Global/UserRight/List:13 html/Edit/Global/UserRight/Top:23 html/Edit/Users/Add.html:41 html/Edit/Users/List:11 html/Edit/Users/Top:22 html/Work/Delegates/Add.html:26 html/Work/Delegates/Info:84 html/Work/Overview/Info:66 +#: html/Edit/Elements/PickUsers:41 html/Edit/Global/UserRight/List:13 html/Edit/Global/UserRight/Top:23 html/Edit/Queues/Basic/Add.html:26 html/Edit/Users/Add.html:41 html/Work/Delegates/Add.html:26 html/Work/Delegates/Info:84 html/Work/Overview/Info:66 msgid "Position Name" msgstr "職務名稱" -#: html/Edit/Global/UserRight/List:14 html/Edit/Global/UserRight/Top:33 html/Edit/Users/List:12 html/Edit/Users/Top:32 +#: html/Edit/Global/UserRight/List:14 html/Edit/Global/UserRight/Top:33 msgid "Position Number" msgstr "職務代碼" -#: html/Edit/Users/Info:43 +#: NOT FOUND IN SOURCE msgid "Position Rank" msgstr "職級" @@ -4334,7 +4502,7 @@ msgstr "優先順位" msgid "Principal %1 not found." msgstr "找不到單位 %1。" -#: html/Search/Elements/PickRestriction:53 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:53 html/Ticket/Elements/ShowBasics:38 html/Work/Search/PickRestriction:34 lib/RT/Tickets_Overlay.pm:1042 +#: html/Search/Elements/PickRestriction:53 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:53 html/Ticket/Elements/ShowBasics:38 html/Work/Search/PickRestriction:34 html/Work/Tickets/Elements/EditBasics:41 lib/RT/Tickets_Overlay.pm:1061 msgid "Priority" msgstr "優先順位" @@ -4342,11 +4510,11 @@ msgstr "優先順位" msgid "Priority starts at" msgstr "優先順位起始值" -#: etc/initialdata.zh:43 etc/initialdata:25 +#: etc/initialdata:25 msgid "Privileged" msgstr "內部成員" -#: html/Admin/Users/Modify.html:270 html/User/Prefs.html:162 html/Work/Preferences/Info:158 +#: html/Admin/Users/Modify.html:272 html/User/Prefs.html:200 html/Work/Preferences/Info:164 #. (loc_fuzzy($msg)) msgid "Privileged status: %1" msgstr "內部成員狀態:%1" @@ -4359,11 +4527,19 @@ msgstr "內部成員" msgid "Process Status" msgstr "處理狀態" -#: etc/initialdata.zh:41 etc/initialdata.zh:47 etc/initialdata.zh:53 etc/initialdata.zh:77 etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59 +#: html/Edit/Queues/List:10 +msgid "Project Name" +msgstr "專案名稱" + +#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59 msgid "Pseudogroup for internal use" msgstr "內部用的虛擬群組" -#: html/Work/Preferences/Info:68 +#: html/Edit/Queues/List:11 +msgid "Public Description" +msgstr "公開說明" + +#: html/Work/Preferences/Info:70 msgid "Public Info" msgstr "公開資訊" @@ -4371,11 +4547,15 @@ msgstr "公開資訊" msgid "Public Service" msgstr "公共事務區" +#: NOT FOUND IN SOURCE +msgid "Purging stale data: %1" +msgstr "移除過期資料: %1" + #: html/Edit/Users/Search.html:4 msgid "Query" msgstr "查詢" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:166 html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Elements/Quicksearch:28 html/Search/Elements/PickRestriction:45 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:63 html/Ticket/Elements/ShowBasics:42 html/User/Elements/DelegateRights:79 html/Work/Elements/MyApprovals:10 html/Work/Elements/MyRequests:17 html/Work/Elements/MyTickets:17 html/Work/Elements/Quicksearch:14 html/Work/Search/PickRestriction:26 lib/RT/Tickets_Overlay.pm:883 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:166 html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Elements/Quicksearch:28 html/Search/Elements/PickRestriction:45 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:63 html/Ticket/Elements/ShowBasics:42 html/User/Elements/DelegateRights:79 html/Work/Elements/MyApprovals:10 html/Work/Elements/MyRequests:17 html/Work/Elements/MyTickets:17 html/Work/Elements/Quicksearch:14 html/Work/Search/PickRestriction:26 html/Work/Tickets/Elements/EditBasics:16 lib/RT/Tickets_Overlay.pm:902 msgid "Queue" msgstr "表單" @@ -4393,19 +4573,19 @@ msgstr "找不到表單 '%1'\\n" msgid "Queue Keyword Selections" msgstr "表單關鍵字選取" -#: html/Admin/Elements/ModifyQueue:30 html/Admin/Queues/Modify.html:42 html/Edit/Queues/Basic/Top:12 html/Edit/Queues/Basic/index.html:36 html/Edit/Queues/Global:21 html/Edit/Queues/List:6 html/Edit/Users/Queue:10 html/Work/Delegates/List:6 html/Work/Elements/List:11 html/Work/Queues/List:5 html/Work/Tickets/Create.html:22 html/Work/Tickets/Elements/ShowBasics:6 +#: html/Admin/Elements/ModifyQueue:30 html/Admin/Queues/Modify.html:42 html/Edit/Queues/Basic/Top:13 html/Edit/Queues/Basic/index.html:36 html/Edit/Queues/Global:21 html/Edit/Queues/List:20 html/Edit/Users/Queue:10 html/Work/Delegates/List:6 html/Work/Elements/List:11 html/Work/Queues/List:5 html/Work/Tickets/Create.html:21 html/Work/Tickets/Elements/ShowBasics:6 msgid "Queue Name" msgstr "表單名稱" -#: html/Edit/Queues/List:8 html/Work/Elements/List:25 html/Work/Queues/List:7 html/Work/Tickets/Create.html:35 html/Work/Tickets/Elements/ShowBasics:19 +#: html/Edit/Queues/List:22 html/Work/Elements/List:25 html/Work/Queues/List:7 html/Work/Tickets/Create.html:34 html/Work/Tickets/Elements/ShowBasics:19 msgid "Queue Owner" msgstr "業務承辦人" -#: html/Edit/Queues/Basic/Top:35 +#: html/Edit/Queues/Basic/Top:38 msgid "Queue Priority" msgstr "優先等級" -#: html/Edit/Global/GroupRight/Top:24 html/Edit/Global/UserRight/Top:43 html/Edit/Users/Queue:11 html/Edit/Users/index.html:124 +#: html/Edit/Global/GroupRight/Top:24 html/Edit/Global/UserRight/Top:43 html/Edit/Users/Queue:11 html/Edit/Users/index.html:97 msgid "Queue Rights" msgstr "表單權限" @@ -4425,11 +4605,11 @@ msgstr "表單已存在" msgid "Queue could not be created" msgstr "無法新增表單" -#: html/Edit/Queues/autohandler:8 html/Ticket/Create.html:204 html/Work/Tickets/Create.html:185 +#: html/Edit/Queues/autohandler:8 html/Ticket/Create.html:208 html/Work/Tickets/Create.html:180 msgid "Queue could not be loaded." msgstr "無法載入表單" -#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283 +#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283 lib/RT/StyleGuide.pod:789 msgid "Queue created" msgstr "表單新增完畢" @@ -4458,7 +4638,7 @@ msgstr "表單一覽" msgid "RT %1" msgstr "RT %1" -#: docs/design_docs/string-extraction-guide.txt:70 +#: docs/design_docs/string-extraction-guide.txt:70 lib/RT/StyleGuide.pod:776 #. ($RT::VERSION, $RT::rtname) msgid "RT %1 for %2" msgstr "%2:RT %1 版" @@ -4574,11 +4754,15 @@ msgstr "系統運行角色" msgid "RT::Ticket-Role" msgstr "申請單運行角色" -#: html/Work/Tickets/Elements/ShowTransaction:11 +#: html/Work/Tickets/Elements/ShowTransaction:14 msgid "RT_System" msgstr "系統訊息" -#: html/Admin/Users/Modify.html:57 html/Admin/Users/Prefs.html:51 html/User/Prefs.html:43 html/Work/Preferences/Info:18 +#: html/Edit/Global/CustomField/SelectWritable:7 +msgid "Read Only" +msgstr "唯讀" + +#: html/Admin/Users/Modify.html:57 html/Admin/Users/Prefs.html:51 html/Edit/Elements/SelectUsers:5 html/Edit/Users/List:6 html/User/Prefs.html:47 html/Work/Preferences/Info:18 msgid "Real Name" msgstr "真實姓名" @@ -4586,15 +4770,35 @@ msgstr "真實姓名" msgid "RealName" msgstr "真實姓名" -#: html/Work/Approvals/Display.html:27 html/Work/Tickets/Update.html:85 +#: html/Work/Approvals/Display.html:30 html/Work/Tickets/Update.html:81 msgid "Really reject this ticket?" msgstr "您確定要駁回這張申請單嗎?" -#: html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:50 html/Ticket/Elements/EditLinks:138 html/Ticket/Elements/EditLinks:93 html/Ticket/Elements/ShowLinks:70 html/Work/Search/BulkLinks:26 +#: lib/RT/Transaction_Overlay.pm:592 +#. ($value) +msgid "Reference by %1 added" +msgstr "已加入 %1 為參考本申請單" + +#: lib/RT/Transaction_Overlay.pm:629 +#. ($value) +msgid "Reference by %1 deleted" +msgstr "已移除 %1 為參考本申請單" + +#: lib/RT/Transaction_Overlay.pm:589 +#. ($value) +msgid "Reference to %1 added" +msgstr "已加入參考申請單 %1" + +#: lib/RT/Transaction_Overlay.pm:626 +#. ($value) +msgid "Reference to %1 deleted" +msgstr "已移除參考申請單 %1" + +#: html/Ticket/Create.html:185 html/Ticket/Elements/BulkLinks:50 html/Ticket/Elements/EditLinks:121 html/Ticket/Elements/EditLinks:81 html/Ticket/Elements/ShowLinks:70 html/Work/Search/BulkLinks:26 html/Work/Tickets/Elements/EditLinks:125 html/Work/Tickets/Elements/EditLinks:81 html/Work/Tickets/Elements/ShowLinks:38 msgid "Referred to by" msgstr "被參考" -#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:46 html/Ticket/Elements/EditLinks:134 html/Ticket/Elements/EditLinks:79 html/Ticket/Elements/ShowLinks:60 html/Work/Search/BulkLinks:22 +#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:46 html/Ticket/Elements/EditLinks:117 html/Ticket/Elements/EditLinks:72 html/Ticket/Elements/ShowLinks:60 html/Work/Search/BulkLinks:22 html/Work/Tickets/Elements/EditLinks:121 html/Work/Tickets/Elements/EditLinks:67 html/Work/Tickets/Elements/ShowLinks:33 msgid "Refers to" msgstr "參考" @@ -4619,7 +4823,7 @@ msgstr "更新" msgid "Refresh this page every %1 minutes." msgstr "每 %1 分鐘更新頁面" -#: html/Ticket/Create.html:173 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56 +#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56 msgid "Relationships" msgstr "關係" @@ -4639,7 +4843,7 @@ msgstr "移除副本" msgid "Remove Requestor" msgstr "移除申請人" -#: html/Ticket/Elements/ShowTransaction:160 html/Ticket/Elements/Tabs:121 html/Work/Tickets/Display.html:31 html/Work/Tickets/Elements/ShowTransaction:108 +#: html/Ticket/Elements/ShowTransaction:172 html/Ticket/Elements/Tabs:121 html/Work/Tickets/Display.html:54 html/Work/Tickets/Elements/ShowTransaction:115 msgid "Reply" msgstr "回覆" @@ -4651,15 +4855,15 @@ msgstr "對申請單進行回覆" msgid "ReplyToTicket" msgstr "回覆申請單" -#: html/Edit/Users/Info:45 +#: NOT FOUND IN SOURCE msgid "Report to Duty" msgstr "上下班刷卡" -#: html/Edit/Users/Info:33 +#: NOT FOUND IN SOURCE msgid "Reported on" msgstr "到職日期" -#: etc/initialdata.zh:62 etc/initialdata:44 html/Ticket/Update.html:39 html/Work/Elements/List:21 html/Work/Elements/MyApprovals:12 html/Work/Elements/MyTickets:20 html/Work/Elements/SelectSearch:30 html/Work/Tickets/Elements/ShowBasics:62 lib/RT/ACE_Overlay.pm:86 +#: etc/initialdata:44 html/Ticket/Update.html:39 html/Work/Elements/List:21 html/Work/Elements/MyApprovals:12 html/Work/Elements/MyTickets:20 html/Work/Elements/SelectSearch:31 html/Work/Tickets/Elements/ShowBasics:62 lib/RT/ACE_Overlay.pm:86 msgid "Requestor" msgstr "申請人" @@ -4687,7 +4891,7 @@ msgstr "申請人" msgid "RequestorAddresses" msgstr "申請人地址" -#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 +#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 html/Work/Tickets/Elements/EditPeople:38 msgid "Requestors" msgstr "申請人" @@ -4699,7 +4903,7 @@ msgstr "申請單處理期限" msgid "Reset" msgstr "重設" -#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:49 html/Work/Preferences/Info:32 +#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:63 html/Work/Preferences/Info:34 msgid "Residence" msgstr "住處" @@ -4707,16 +4911,16 @@ msgstr "住處" msgid "Resolution" msgstr "解決狀態" -#: html/Ticket/Elements/Tabs:131 html/Work/Tickets/Display.html:34 +#: html/Ticket/Elements/Tabs:131 html/Work/Tickets/Display.html:57 msgid "Resolve" msgstr "解決" -#: html/Ticket/Update.html:136 html/Work/Tickets/Update.html:120 +#: html/Ticket/Update.html:137 #. ($Ticket->id, $Ticket->Subject) msgid "Resolve ticket #%1 (%2)" msgstr "解決申請單 #%1 (%2)" -#: etc/initialdata.zh:331 etc/initialdata:308 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1188 +#: etc/initialdata:308 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1215 msgid "Resolved" msgstr "已解決" @@ -4724,7 +4928,7 @@ msgstr "已解決" msgid "Response to requestors" msgstr "回覆申請人" -#: html/Edit/Users/Info:44 +#: NOT FOUND IN SOURCE msgid "Responsibility Type" msgstr "責任區分" @@ -4732,11 +4936,11 @@ msgstr "責任區分" msgid "Results" msgstr "結果" -#: html/Search/Elements/PickRestriction:104 html/Work/Search/PickRestriction:84 +#: html/Search/Elements/PickRestriction:104 html/Work/Search/PickRestriction:90 msgid "Results per page" msgstr "每頁列出幾筆結果" -#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:99 html/User/Prefs.html:71 html/Work/Preferences/Info:54 +#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:99 html/User/Prefs.html:94 html/Work/Preferences/Info:56 msgid "Retype Password" msgstr "再次輸入密碼" @@ -4776,17 +4980,17 @@ msgstr "權限撤消完畢" msgid "Rights" msgstr "權限及代理人" -#: lib/RT/Interface/Web.pm:794 x:797 +#: lib/RT/Interface/Web.pm:857 #. ($object_type) msgid "Rights could not be granted for %1" msgstr "無法將權限賦予 %1" -#: lib/RT/Interface/Web.pm:827 x:830 +#: lib/RT/Interface/Web.pm:887 #. ($object_type) msgid "Rights could not be revoked for %1" msgstr "無法撤消 %1 的權限" -#: html/Edit/Groups/Member:55 html/Edit/Groups/Members/List:10 +#: html/Edit/Groups/Member:54 html/Edit/Groups/Members/List:10 msgid "Role Members" msgstr "角色成員" @@ -4802,19 +5006,19 @@ msgstr "角色" msgid "RootApproval" msgstr "交由系統管理員簽核" -#: html/Edit/Global/Workflow/Action:27 +#: html/Edit/Global/Workflow/Action:23 msgid "Run Approval" msgstr "簽核執行" -#: html/Edit/Global/Basic/Top:72 +#: html/Edit/Global/Basic/Top:81 msgid "SMTPDebug" msgstr "SMTP 偵錯紀錄" -#: html/Edit/Global/Basic/Top:58 +#: html/Edit/Global/Basic/Top:63 msgid "SMTPFrom" msgstr "SMTP 寄件位址" -#: html/Edit/Global/Basic/Top:56 +#: html/Edit/Global/Basic/Top:61 msgid "SMTPServer" msgstr "SMTP 伺服器" @@ -4826,7 +5030,7 @@ msgstr "星期六" msgid "Sat." msgstr "星期六" -#: html/Edit/Elements/104Buttons:72 html/Work/Preferences/index.html:35 +#: html/Edit/Elements/104Buttons:83 html/Work/Preferences/index.html:33 html/Work/Tickets/Elements/EditBasics:63 html/Work/Tickets/Elements/EditLinks:133 html/Work/Tickets/Elements/EditPeople:51 msgid "Save" msgstr "儲存" @@ -4852,7 +5056,7 @@ msgstr "訊息通知動作" msgid "Scrip Condition" msgstr "訊息通知條件" -#: lib/RT/Scrip_Overlay.pm:175 +#: lib/RT/Scrip_Overlay.pm:180 msgid "Scrip Created" msgstr "手續新增完畢" @@ -4860,7 +5064,7 @@ msgstr "手續新增完畢" msgid "Scrip Name" msgstr "訊息名稱" -#: html/Admin/Elements/EditScrips:83 +#: html/Admin/Elements/EditScrips:85 msgid "Scrip deleted" msgstr "手續刪除完畢" @@ -4868,7 +5072,7 @@ msgstr "手續刪除完畢" msgid "Scrips" msgstr "手續" -#: html/Edit/Global/autohandler:9 html/Edit/Queues/autohandler:20 +#: html/Edit/Global/autohandler:9 html/Edit/Queues/autohandler:24 msgid "Scrips " msgstr "訊息通知" @@ -4880,7 +5084,7 @@ msgstr "%1 的手續\\n" msgid "Scrips which apply to all queues" msgstr "適用於所有表單的手續" -#: html/Edit/Elements/104Buttons:75 html/Elements/SimpleSearch:26 html/Search/Elements/PickRestriction:125 html/Ticket/Elements/Tabs:158 html/Work/Elements/Tab:45 html/Work/Search/PickRestriction:102 +#: html/Edit/Elements/104Buttons:86 html/Elements/SimpleSearch:26 html/Search/Elements/PickRestriction:125 html/Ticket/Elements/Tabs:158 html/Work/Elements/Tab:45 html/Work/Search/PickRestriction:108 msgid "Search" msgstr "查詢" @@ -4896,7 +5100,7 @@ msgstr "簽核單查詢" msgid "Second-" msgstr "二" -#: html/Edit/Users/Info:40 +#: NOT FOUND IN SOURCE msgid "Second-level Users" msgstr "二階主管員工" @@ -4976,7 +5180,7 @@ msgstr "多重選項" msgid "SelectSingle" msgstr "單一選項" -#: html/Edit/Elements/PickUsers:85 html/Edit/Users/Add.html:78 +#: html/Edit/Elements/PickUsers:87 html/Edit/Users/Add.html:78 msgid "Selected users:" msgstr "新增對象:" @@ -4984,39 +5188,39 @@ msgstr "新增對象:" msgid "Self Service" msgstr "自助服務" -#: etc/initialdata.zh:131 etc/initialdata:113 +#: etc/initialdata:113 msgid "Send mail to all watchers" msgstr "寄信給所有視察員" -#: etc/initialdata.zh:127 etc/initialdata:109 +#: etc/initialdata:109 msgid "Send mail to all watchers as a \"comment\"" msgstr "以評論方式寄信給所有視察員" -#: etc/initialdata.zh:122 etc/initialdata:104 +#: etc/initialdata:104 msgid "Send mail to requestors and Ccs" msgstr "寄信給申請人及副本收件人" -#: etc/initialdata.zh:117 etc/initialdata:99 +#: etc/initialdata:99 msgid "Send mail to requestors and Ccs as a comment" msgstr "以評論方式寄信給申請人及副本收件人" -#: etc/initialdata.zh:96 etc/initialdata:78 +#: etc/initialdata:78 msgid "Sends a message to the requestors" msgstr "寄信給申請人" -#: etc/initialdata.zh:135 etc/initialdata.zh:139 etc/initialdata:117 etc/initialdata:121 +#: etc/initialdata:117 etc/initialdata:121 msgid "Sends mail to explicitly listed Ccs and Bccs" msgstr "寄信給特定的副本及密件副本收件人" -#: etc/initialdata.zh:112 etc/initialdata:94 +#: etc/initialdata:94 msgid "Sends mail to the administrative Ccs" msgstr "寄信給管理員副本收件人" -#: etc/initialdata.zh:108 etc/initialdata:90 +#: etc/initialdata:90 msgid "Sends mail to the administrative Ccs as a comment" msgstr "以評論寄信給管理員副本收件人" -#: etc/initialdata.zh:100 etc/initialdata.zh:104 etc/initialdata:82 etc/initialdata:86 +#: etc/initialdata:82 etc/initialdata:86 msgid "Sends mail to the owner" msgstr "寄信給申請人" @@ -5032,7 +5236,11 @@ msgstr "09" msgid "September" msgstr "九月" -#: html/Edit/Users/Info:38 +#: NOT FOUND IN SOURCE +msgid "Setting %1's 'Disabled' property to %2" +msgstr "%1 的「停用」屬性已設為 %2" + +#: NOT FOUND IN SOURCE msgid "Shift Type" msgstr "班別屬性" @@ -5100,7 +5308,7 @@ msgstr "登記成為申請人或副本收件人" msgid "Sign up as a ticket or queue AdminCc" msgstr "登記成為管理員副本收件人" -#: html/Admin/Elements/ModifyUser:38 html/Admin/Users/Modify.html:190 html/Admin/Users/Prefs.html:31 html/User/Prefs.html:111 html/Work/Preferences/Info:111 +#: html/Admin/Elements/ModifyUser:38 html/Admin/Users/Modify.html:190 html/Admin/Users/Prefs.html:31 html/Edit/Users/Info:52 html/User/Prefs.html:148 html/Work/Preferences/Info:113 msgid "Signature" msgstr "簽名檔" @@ -5124,7 +5332,7 @@ msgstr "順序" msgid "Sort key" msgstr "排序方式" -#: html/Search/Elements/PickRestriction:108 html/Work/Search/PickRestriction:89 +#: html/Search/Elements/PickRestriction:108 html/Work/Search/PickRestriction:95 msgid "Sort results by" msgstr "結果排序方式" @@ -5132,7 +5340,7 @@ msgstr "結果排序方式" msgid "SortOrder" msgstr "排序順序" -#: html/Work/Elements/List:8 html/Work/Elements/MyApprovals:11 +#: html/Admin/Elements/EditScrip:80 html/Edit/Global/Scrip/Top:75 html/Work/Elements/List:8 html/Work/Elements/MyApprovals:11 msgid "Stage" msgstr "關卡" @@ -5152,7 +5360,7 @@ msgstr "延宕" msgid "Start page" msgstr "首頁" -#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:34 +#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:35 html/Work/Tickets/Elements/EditBasics:35 msgid "Started" msgstr "實際起始日" @@ -5160,7 +5368,7 @@ msgstr "實際起始日" msgid "Started date '%1' could not be parsed" msgstr "無法解讀起始日期 '%1" -#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:30 +#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:31 html/Work/Tickets/Elements/EditBasics:26 msgid "Starts" msgstr "應起始日" @@ -5172,19 +5380,19 @@ msgstr "應起始日" msgid "Starts date '%1' could not be parsed" msgstr "無法解讀起始日期 '%1" -#: html/Admin/Elements/ModifyUser:81 html/Admin/Users/Modify.html:137 html/User/Prefs.html:93 html/Work/Preferences/Info:83 +#: html/Admin/Elements/ModifyUser:81 html/Admin/Users/Modify.html:137 html/User/Prefs.html:126 html/Work/Preferences/Info:85 msgid "State" msgstr "州" -#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Search/Elements/PickRestriction:73 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:37 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:59 html/Work/Elements/List:15 html/Work/Elements/MyRequests:18 html/Work/Elements/MyTickets:18 html/Work/Search/PickRestriction:54 html/Work/Tickets/Update.html:22 lib/RT/Ticket_Overlay.pm:1182 lib/RT/Tickets_Overlay.pm:908 +#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Search/Elements/PickRestriction:73 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:37 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:59 html/Work/Elements/List:15 html/Work/Elements/MyRequests:18 html/Work/Elements/MyTickets:18 html/Work/Search/PickRestriction:54 html/Work/Tickets/Elements/EditBasics:19 html/Work/Tickets/Update.html:22 lib/RT/Ticket_Overlay.pm:1209 lib/RT/Tickets_Overlay.pm:927 msgid "Status" msgstr "現況" -#: etc/initialdata.zh:317 etc/initialdata:294 +#: etc/initialdata:294 msgid "Status Change" msgstr "現況改變時" -#: lib/RT/Transaction_Overlay.pm:528 +#: lib/RT/Transaction_Overlay.pm:477 #. ($self->loc($self->OldValue), $self->loc($self->NewValue)) msgid "Status changed from %1 to %2" msgstr "現況從 %1 改為 %2" @@ -5205,25 +5413,25 @@ msgstr "強制承辦申請單" msgid "StealTicket" msgstr "強制承辦申請單" -#: lib/RT/Transaction_Overlay.pm:587 +#: lib/RT/Transaction_Overlay.pm:545 #. ($Old->Name) msgid "Stolen from %1 " -msgstr "被 %1 強制更換 " +msgstr "承辦人從 %1 強制更換" -#: html/Edit/Groups/Member:69 +#: html/Edit/Groups/Member:68 msgid "Subgroup" msgstr "子群組" -#: html/Elements/MyRequests:28 html/Elements/MyTickets:28 html/Search/Bulk.html:135 html/Search/Elements/PickRestriction:42 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:27 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:75 html/Work/Elements/MyApprovals:9 html/Work/Elements/MyRequests:16 html/Work/Elements/MyTickets:16 html/Work/Search/Bulk.html:87 html/Work/Search/PickRestriction:22 html/Work/Tickets/Create.html:131 html/Work/Tickets/Elements/ShowBasics:36 lib/RT/Ticket_Overlay.pm:1178 lib/RT/Tickets_Overlay.pm:987 +#: html/Elements/MyRequests:28 html/Elements/MyTickets:28 html/Search/Bulk.html:135 html/Search/Elements/PickRestriction:42 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:27 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:75 html/Work/Elements/MyApprovals:9 html/Work/Elements/MyRequests:16 html/Work/Elements/MyTickets:16 html/Work/Search/Bulk.html:87 html/Work/Search/PickRestriction:22 html/Work/Tickets/Elements/AddSubject:8 html/Work/Tickets/Elements/EditBasics:8 html/Work/Tickets/Elements/ShowBasics:36 html/Work/Tickets/Elements/ShowSubject:8 lib/RT/Ticket_Overlay.pm:1205 lib/RT/Tickets_Overlay.pm:1006 msgid "Subject" msgstr "主題" -#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609 +#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:795 lib/RT/Transaction_Overlay.pm:567 #. ($self->Data) msgid "Subject changed to %1" msgstr "標題已改為 %1" -#: html/Elements/Submit:58 html/Work/Search/Bulk.html:103 +#: html/Edit/Users/Info:71 html/Elements/Submit:58 html/Work/Search/Bulk.html:103 msgid "Submit" msgstr "送出" @@ -5231,7 +5439,7 @@ msgstr "送出" msgid "Submit Workflow" msgstr "送出流程" -#: lib/RT/Group_Overlay.pm:748 +#: lib/RT/Group_Overlay.pm:746 msgid "Succeeded" msgstr "設定成功" @@ -5247,6 +5455,18 @@ msgstr "星期日" msgid "SuperUser" msgstr "系統管理員" +#: html/Edit/Global/Basic/Top:29 +msgid "Sync now" +msgstr "執行同步" + +#: html/Edit/Global/Basic/Top:87 +msgid "Sync104HRMS" +msgstr "自動同步104HRMS" + +#: NOT FOUND IN SOURCE +msgid "Synchronizing HRMS data. This may take a while..." +msgstr "正在同步化 HRMS 人事系統資料。請稍待..." + #: html/User/Elements/DelegateRights:76 msgid "System" msgstr "系統" @@ -5255,7 +5475,7 @@ msgstr "系統" msgid "System Defined" msgstr "系統定義" -#: html/Admin/Elements/SelectRights:80 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:793 lib/RT/Interface/Web.pm:826 x:796 x:829 +#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:856 lib/RT/Interface/Web.pm:886 msgid "System Error" msgstr "系統錯誤" @@ -5267,7 +5487,7 @@ msgstr "系統錯誤。設定權限失敗。" msgid "System Error. right not granted" msgstr "系統錯誤。設定權限失敗。" -#: html/Edit/Users/index.html:122 +#: html/Edit/Users/index.html:95 msgid "System Rights" msgstr "系統權限" @@ -5291,11 +5511,11 @@ msgstr "系統群組" msgid "SystemInternal" msgstr "系統內部用" -#: etc/initialdata.zh:59 etc/initialdata.zh:65 etc/initialdata.zh:71 etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 +#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 msgid "SystemRolegroup for internal use" msgstr "內部使用的系統角色群組" -#: lib/RT/CurrentUser.pm:319 +#: lib/RT/CurrentUser.pm:318 msgid "TEST_STRING" msgstr "TEST_STRING" @@ -5315,11 +5535,11 @@ msgstr "自行承辦申請單" msgid "TakeTicket" msgstr "自行承辦申請單" -#: lib/RT/Transaction_Overlay.pm:573 +#: lib/RT/Transaction_Overlay.pm:530 msgid "Taken" msgstr "已受理" -#: html/Admin/Elements/EditScrip:80 +#: html/Admin/Elements/EditScrip:88 msgid "Template" msgstr "範本" @@ -5344,7 +5564,7 @@ msgstr "通知範本名稱" msgid "Template deleted" msgstr "範本已刪除" -#: lib/RT/Scrip_Overlay.pm:152 +#: lib/RT/Scrip_Overlay.pm:156 msgid "Template not found" msgstr "找不到範本" @@ -5352,7 +5572,7 @@ msgstr "找不到範本" msgid "Template not found\\n" msgstr "找不到範本\\n" -#: lib/RT/Template_Overlay.pm:352 +#: lib/RT/Template_Overlay.pm:359 msgid "Template parsed" msgstr "範本剖析完畢" @@ -5360,7 +5580,7 @@ msgstr "範本剖析完畢" msgid "Templates" msgstr "範本" -#: html/Edit/Global/autohandler:8 html/Edit/Queues/autohandler:19 +#: html/Edit/Global/autohandler:8 html/Edit/Queues/autohandler:23 msgid "Templates " msgstr "通知範本" @@ -5368,7 +5588,7 @@ msgstr "通知範本" msgid "Templates for %1\\n" msgstr "找不到 %1 的範本\\n" -#: lib/RT/Interface/Web.pm:894 x:897 +#: lib/RT/Interface/Web.pm:954 msgid "That is already the current value" msgstr "已經是目前欄位的值" @@ -5376,7 +5596,7 @@ msgstr "已經是目前欄位的值" msgid "That is not a value for this custom field" msgstr "這不是該自訂欄位的值" -#: lib/RT/Ticket_Overlay.pm:1899 +#: lib/RT/Ticket_Overlay.pm:1926 msgid "That is the same value" msgstr "同樣的值" @@ -5389,7 +5609,7 @@ msgstr "這項單位已經擁有該權限" msgid "That principal is already a %1 for this queue" msgstr "這項單位已經是這個表單的 %1" -#: lib/RT/Ticket_Overlay.pm:1433 +#: lib/RT/Ticket_Overlay.pm:1460 #. ($self->loc($args{'Type'})) msgid "That principal is already a %1 for this ticket" msgstr "這項單位已經是這份申請單的 %1" @@ -5399,16 +5619,16 @@ msgstr "這項單位已經是這份申請單的 %1" msgid "That principal is not a %1 for this queue" msgstr "這項單位不是這個表單的 %1" -#: lib/RT/Ticket_Overlay.pm:1550 +#: lib/RT/Ticket_Overlay.pm:1577 #. ($args{'Type'}) msgid "That principal is not a %1 for this ticket" msgstr "這項單位不是這份申請單的 %1" -#: lib/RT/Ticket_Overlay.pm:1895 +#: lib/RT/Ticket_Overlay.pm:1922 msgid "That queue does not exist" msgstr "此表單不存在" -#: lib/RT/Ticket_Overlay.pm:3237 +#: lib/RT/Ticket_Overlay.pm:3293 msgid "That ticket has unresolved dependencies" msgstr "這份申請單有尚未解決的附屬申請單" @@ -5416,27 +5636,27 @@ msgstr "這份申請單有尚未解決的附屬申請單" msgid "That user already has that right" msgstr "使用者已具有該項權限" -#: lib/RT/Ticket_Overlay.pm:3047 +#: lib/RT/Ticket_Overlay.pm:3097 msgid "That user already owns that ticket" msgstr "該使用者已經承辦這份申請單" -#: lib/RT/Ticket_Overlay.pm:3019 +#: lib/RT/Ticket_Overlay.pm:3069 msgid "That user does not exist" msgstr "使用者不存在" -#: lib/RT/User_Overlay.pm:376 +#: lib/RT/User_Overlay.pm:381 msgid "That user is already privileged" msgstr "這名使用者已經是內部成員" -#: lib/RT/User_Overlay.pm:397 +#: lib/RT/User_Overlay.pm:402 msgid "That user is already unprivileged" msgstr "這名使用者屬於非內部成員群組" -#: lib/RT/User_Overlay.pm:389 +#: lib/RT/User_Overlay.pm:394 msgid "That user is now privileged" msgstr "使用者加入內部成員群組完畢" -#: lib/RT/User_Overlay.pm:410 +#: lib/RT/User_Overlay.pm:415 msgid "That user is now unprivileged" msgstr "這名使用者已加入非內部成員群組" @@ -5444,7 +5664,7 @@ msgstr "這名使用者已加入非內部成員群組" msgid "That user is now unprivilegedileged" msgstr "這名使用者已加入非內部成員群組" -#: lib/RT/Ticket_Overlay.pm:3040 +#: lib/RT/Ticket_Overlay.pm:3090 msgid "That user may not own tickets in that queue" msgstr "使用者可能沒有承辦表單裡的申請單" @@ -5464,7 +5684,7 @@ msgstr "申請單的副本收件人" msgid "The administrative CC of a ticket" msgstr "申請單的管理員副本收件人" -#: lib/RT/Ticket_Overlay.pm:2226 +#: lib/RT/Ticket_Overlay.pm:2255 msgid "The comment has been recorded" msgstr "評論已被紀錄" @@ -5476,7 +5696,7 @@ msgstr "下列命令會找到 'general' 表單內所有運作中的申請單, msgid "The following commands were not proccessed:\\n\\n" msgstr "以下命令未被執行:\\n\\n" -#: lib/RT/Interface/Web.pm:897 x:900 +#: lib/RT/Interface/Web.pm:957 msgid "The new value has been set." msgstr "新的欄位值設定完成。" @@ -5504,7 +5724,7 @@ msgstr "申請單 %1 %2 (%3)\\n" msgid "This tool allows the user to run arbitrary perl modules from within RT." msgstr "此工具程式會讓使用者經由 RT 執行任意命令。" -#: lib/RT/Transaction_Overlay.pm:251 +#: lib/RT/Transaction_Overlay.pm:200 msgid "This transaction appears to have no content" msgstr "此項更動報告沒有內容" @@ -5525,7 +5745,7 @@ msgstr "星期四" msgid "Thu." msgstr "星期四" -#: html/Admin/Elements/ModifyTemplateAsWorkflow:163 +#: html/Admin/Elements/ModifyTemplateAsWorkflow:163 html/Edit/Global/Workflow/Condition:24 msgid "Ticket" msgstr "申請單" @@ -5547,7 +5767,7 @@ msgstr "更新申請單 #%1 的全部資訊:%2" msgid "Ticket #%1: %2" msgstr "申請單 #%1: %2" -#: lib/RT/Ticket_Overlay.pm:605 lib/RT/Ticket_Overlay.pm:626 +#: lib/RT/Ticket_Overlay.pm:632 lib/RT/Ticket_Overlay.pm:653 #. ($self->Id, $QueueObj->Name) msgid "Ticket %1 created in queue '%2'" msgstr "申請單 #%1 成功新增於 '%2' 表單" @@ -5557,12 +5777,12 @@ msgstr "申請單 #%1 成功新增於 '%2' 表單" msgid "Ticket %1 loaded\\n" msgstr "載入申請單 %1\\n" -#: html/Search/Bulk.html:212 html/Work/Search/Bulk.html:169 +#: html/Search/Bulk.html:213 html/Work/Search/Bulk.html:169 #. ($Ticket->Id,$_) msgid "Ticket %1: %2" msgstr "申請單 %1:%2" -#: html/Edit/Queues/Basic/Top:28 html/Edit/Queues/List:16 html/Work/Queues/List:9 +#: html/Edit/Queues/Basic/Top:30 html/Edit/Queues/List:30 html/Work/Queues/List:9 msgid "Ticket Due" msgstr "表單處理期限" @@ -5583,11 +5803,11 @@ msgstr "申請單編號" msgid "Ticket Processing Due" msgstr "表單運行期限" -#: etc/initialdata.zh:332 etc/initialdata:309 +#: etc/initialdata:309 msgid "Ticket Resolved" msgstr "申請單已解決" -#: html/Edit/Queues/Basic/Top:18 html/Edit/Queues/Category/List:6 html/Edit/Queues/Category/Top:7 html/Edit/Queues/List:7 html/Edit/Queues/index.html:31 html/Work/Delegates/List:7 html/Work/Delegates/index.html:11 html/Work/Elements/List:12 html/Work/Elements/SelectSearch:9 html/Work/Queues/List:6 html/Work/Queues/Select.html:12 html/Work/Queues/index.html:11 html/Work/Tickets/Create.html:44 html/Work/Tickets/Elements/ShowBasics:34 +#: html/Edit/Queues/Basic/Top:20 html/Edit/Queues/Category/List:6 html/Edit/Queues/Category/Top:7 html/Edit/Queues/List:21 html/Work/Delegates/List:7 html/Work/Delegates/index.html:11 html/Work/Elements/List:12 html/Work/Elements/SelectSearch:9 html/Work/Queues/List:6 html/Work/Queues/Select.html:12 html/Work/Queues/index.html:11 html/Work/Tickets/Create.html:43 html/Work/Tickets/Elements/ShowBasics:34 msgid "Ticket Type" msgstr "表單種類" @@ -5595,19 +5815,19 @@ msgstr "表單種類" msgid "Ticket attachment" msgstr "申請單附件" -#: lib/RT/Tickets_Overlay.pm:1166 +#: lib/RT/Tickets_Overlay.pm:1185 msgid "Ticket content" msgstr "申請單內容" -#: lib/RT/Tickets_Overlay.pm:1212 +#: lib/RT/Tickets_Overlay.pm:1231 msgid "Ticket content type" msgstr "申請單內容類別" -#: lib/RT/Ticket_Overlay.pm:496 lib/RT/Ticket_Overlay.pm:505 lib/RT/Ticket_Overlay.pm:515 lib/RT/Ticket_Overlay.pm:615 +#: lib/RT/Ticket_Overlay.pm:520 lib/RT/Ticket_Overlay.pm:529 lib/RT/Ticket_Overlay.pm:539 lib/RT/Ticket_Overlay.pm:642 msgid "Ticket could not be created due to an internal error" msgstr "內部錯誤,無法新增申請單" -#: lib/RT/Transaction_Overlay.pm:520 +#: lib/RT/Transaction_Overlay.pm:469 msgid "Ticket created" msgstr "申請單新增完畢" @@ -5615,7 +5835,7 @@ msgstr "申請單新增完畢" msgid "Ticket creation failed" msgstr "申請單新增失敗" -#: lib/RT/Transaction_Overlay.pm:525 +#: lib/RT/Transaction_Overlay.pm:474 msgid "Ticket deleted" msgstr "申請單刪除完畢" @@ -5631,7 +5851,7 @@ msgstr "申請單刪除完畢" msgid "Ticket not found" msgstr "找不到申請單" -#: etc/initialdata.zh:318 etc/initialdata:295 +#: etc/initialdata:295 msgid "Ticket status changed" msgstr "申請單現況已改變" @@ -5643,12 +5863,12 @@ msgstr "申請單視察員" msgid "Tickets" msgstr "申請單" -#: lib/RT/Tickets_Overlay.pm:1383 +#: lib/RT/Tickets_Overlay.pm:1402 #. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) msgid "Tickets %1 %2" msgstr "申請單 %1 %2" -#: lib/RT/Tickets_Overlay.pm:1348 +#: lib/RT/Tickets_Overlay.pm:1367 #. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})) msgid "Tickets %1 by %2" msgstr "申請單 %1 (%2)" @@ -5670,15 +5890,15 @@ msgstr "%1 的申請單" msgid "Tickets which depend on this approval:" msgstr "批准之後,可接續處理:" -#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 +#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 html/Work/Tickets/Elements/EditBasics:32 msgid "Time Left" msgstr "剩餘時間" -#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42 +#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42 html/Work/Tickets/Elements/EditBasics:24 msgid "Time Worked" msgstr "處理時間" -#: lib/RT/Tickets_Overlay.pm:1139 +#: lib/RT/Tickets_Overlay.pm:1158 msgid "Time left" msgstr "剩餘時間" @@ -5686,7 +5906,7 @@ msgstr "剩餘時間" msgid "Time to display" msgstr "顯示時間" -#: lib/RT/Tickets_Overlay.pm:1115 +#: lib/RT/Tickets_Overlay.pm:1134 msgid "Time worked" msgstr "已處理時間" @@ -5694,7 +5914,7 @@ msgstr "已處理時間" msgid "TimeLeft" msgstr "剩餘時間" -#: lib/RT/Ticket_Overlay.pm:1183 +#: lib/RT/Ticket_Overlay.pm:1210 msgid "TimeWorked" msgstr "已處理時間" @@ -5706,32 +5926,40 @@ msgstr "產生這次更動的差異檔:" msgid "To generate a diff of this commit:\\n" msgstr "產生這次更動的差異檔:\\n" -#: lib/RT/Ticket_Overlay.pm:1186 +#: lib/RT/Ticket_Overlay.pm:1213 msgid "Told" msgstr "告知日期" -#: html/Edit/Elements/Page:46 +#: html/Edit/Elements/Page:47 msgid "Total" msgstr "頁" -#: etc/initialdata.zh:239 etc/initialdata:237 +#: etc/initialdata:237 msgid "Transaction" msgstr "更動" -#: lib/RT/Transaction_Overlay.pm:640 +#: lib/RT/Transaction_Overlay.pm:666 #. ($self->Data) msgid "Transaction %1 purged" msgstr "清除更動報告 %1" -#: lib/RT/Transaction_Overlay.pm:177 +#: lib/RT/Transaction_Overlay.pm:126 msgid "Transaction Created" msgstr "更動報告已新增" -#: lib/RT/Transaction_Overlay.pm:88 +#: lib/RT/Transaction_Overlay.pm:90 msgid "Transaction->Create couldn't, as you didn't specify a ticket id" msgstr "未指定申請單編號,無法新增更動" -#: lib/RT/Transaction_Overlay.pm:699 +#: NOT FOUND IN SOURCE +msgid "TransactionBatch" +msgstr "批次更動時" + +#: NOT FOUND IN SOURCE +msgid "TransactionCreate" +msgstr "新增更動時" + +#: lib/RT/Transaction_Overlay.pm:721 msgid "Transactions are immutable" msgstr "不可更改更動報告" @@ -5747,7 +5975,7 @@ msgstr "星期二" msgid "Tue." msgstr "星期二" -#: html/Admin/Elements/EditCustomField:43 html/Admin/Elements/ModifyTemplateAsWorkflow:135 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1184 lib/RT/Tickets_Overlay.pm:959 +#: html/Admin/Elements/EditCustomField:43 html/Admin/Elements/ModifyTemplateAsWorkflow:135 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1211 lib/RT/Tickets_Overlay.pm:978 msgid "Type" msgstr "類別" @@ -5763,7 +5991,7 @@ msgstr "外部系統登入帳號" msgid "UnixUsername" msgstr "外部系統登入帳號" -#: lib/RT/Attachment_Overlay.pm:266 lib/RT/Attachment_Overlay.pm:298 +#: lib/RT/Attachment_Overlay.pm:281 lib/RT/Attachment_Overlay.pm:313 #. ($self->ContentEncoding) msgid "Unknown ContentEncoding %1" msgstr "不可解的內容文字編碼方式 %1" @@ -5772,11 +6000,11 @@ msgstr "不可解的內容文字編碼方式 %1" msgid "Unlimited" msgstr "全數顯示" -#: etc/initialdata.zh:50 etc/initialdata:32 +#: etc/initialdata:32 msgid "Unprivileged" msgstr "非內部成員" -#: lib/RT/Transaction_Overlay.pm:569 +#: lib/RT/Transaction_Overlay.pm:526 msgid "Untaken" msgstr "未被受理" @@ -5784,7 +6012,7 @@ msgstr "未被受理" msgid "Up" msgstr "上一頁" -#: html/Elements/MyTickets:63 html/Search/Bulk.html:32 html/Work/Elements/MyTickets:82 html/Work/Search/Bulk.html:10 html/Work/Tickets/Elements/EditCustomFieldEntries:97 +#: html/Elements/MyTickets:63 html/Search/Bulk.html:32 html/Work/Elements/MyTickets:83 html/Work/Search/Bulk.html:10 html/Work/Tickets/Elements/EditCustomFieldEntries:63 msgid "Update" msgstr "處理" @@ -5808,7 +6036,7 @@ msgstr "更新電子郵件信箱" msgid "Update name" msgstr "更新帳號" -#: lib/RT/Interface/Web.pm:409 x:412 +#: lib/RT/Interface/Web.pm:467 msgid "Update not recorded." msgstr "更新未被記錄" @@ -5828,21 +6056,21 @@ msgstr "更新申請單" msgid "Update ticket # %1" msgstr "更新申請單 # %1" -#: html/SelfService/Update.html:24 html/SelfService/Update.html:46 +#: html/SelfService/Update.html:24 html/SelfService/Update.html:63 #. ($Ticket->id) msgid "Update ticket #%1" msgstr "更新申請單 #%1" -#: html/Ticket/Update.html:138 html/Work/Tickets/Update.html:122 +#: html/Ticket/Update.html:139 #. ($Ticket->id, $Ticket->Subject) msgid "Update ticket #%1 (%2)" msgstr "更新申請單 #%1 (%2)" -#: lib/RT/Interface/Web.pm:407 x:410 +#: lib/RT/Interface/Web.pm:465 msgid "Update type was neither correspondence nor comment." msgstr "更新的內容並非申請單回覆也不是評論" -#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:50 lib/RT/Ticket_Overlay.pm:1187 +#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1214 msgid "Updated" msgstr "前次更新" @@ -5866,23 +6094,23 @@ msgstr "找不到使用者 '%1'" msgid "User '%1' not found\\n" msgstr "找不到使用者 '%1'\\n" -#: etc/initialdata.zh:142 etc/initialdata.zh:209 etc/initialdata:124 etc/initialdata:191 +#: etc/initialdata:124 etc/initialdata:191 msgid "User Defined" msgstr "使用者自訂" -#: html/Admin/Users/Prefs.html:58 html/Edit/Users/List:13 html/Edit/Users/Top:42 +#: html/Admin/Users/Prefs.html:58 msgid "User ID" msgstr "使用者 ID" -#: html/Elements/SelectUsers:25 +#: html/Edit/Elements/SelectUsers:3 html/Elements/SelectUsers:25 msgid "User Id" msgstr "使用者 ID" -#: html/Edit/Elements/PickUsers:12 html/Edit/Global/UserRight/List:7 html/Edit/Global/UserRight/Top:9 html/Edit/Users/Add.html:13 html/Edit/Users/List:5 html/Edit/Users/Search.html:23 html/Edit/Users/Top:8 html/Work/Delegates/Info:60 html/Work/Tickets/Cc:10 +#: html/Edit/Elements/PickUsers:12 html/Edit/Global/UserRight/List:7 html/Edit/Global/UserRight/Top:9 html/Edit/Users/Add.html:13 html/Edit/Users/Search.html:23 html/Work/Delegates/Info:60 html/Work/Tickets/Cc:10 msgid "User Number" msgstr "員工編號" -#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 html/Edit/Global/autohandler:11 html/Edit/Queues/autohandler:22 +#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 html/Edit/Global/autohandler:11 html/Edit/Queues/autohandler:26 msgid "User Rights" msgstr "使用者權限" @@ -5890,7 +6118,7 @@ msgstr "使用者權限" msgid "User Setup" msgstr "使用者設定" -#: html/Edit/Users/Info:37 +#: NOT FOUND IN SOURCE msgid "User Shift" msgstr "員工班別" @@ -5899,15 +6127,23 @@ msgstr "員工班別" msgid "User could not be created: %1" msgstr "無法新增使用者:%1" -#: lib/RT/User_Overlay.pm:321 +#: lib/RT/User_Overlay.pm:326 msgid "User created" msgstr "使用者新增完畢" +#: NOT FOUND IN SOURCE +msgid "User created: %1" +msgstr "使用者 %1 新增完畢" + +#: NOT FOUND IN SOURCE +msgid "User created: %1 (%2)" +msgstr "使用者 %1 (%2) 新增完畢" + #: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68 msgid "User defined groups" msgstr "使用者定義的群組" -#: lib/RT/User_Overlay.pm:575 lib/RT/User_Overlay.pm:592 +#: lib/RT/User_Overlay.pm:580 lib/RT/User_Overlay.pm:597 msgid "User loaded" msgstr "已載入使用者" @@ -5915,6 +6151,10 @@ msgstr "已載入使用者" msgid "User notified" msgstr "已通知使用者" +#: NOT FOUND IN SOURCE +msgid "User renamed from %1 to %2" +msgstr "使用者 %1 已改名為 %2" + #: html/Admin/Users/Prefs.html:24 html/Admin/Users/Prefs.html:28 msgid "User view" msgstr "使用者私人資料" @@ -5927,7 +6167,7 @@ msgstr "使用者自定" msgid "Username" msgstr "帳號" -#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/User/Groups/Members.html:57 html/Work/Tickets/Elements/ShowTransaction:8 +#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/Edit/Groups/Admin:9 html/User/Groups/Members.html:57 html/Work/Tickets/Elements/ShowTransaction:11 msgid "Users" msgstr "使用者" @@ -5935,7 +6175,7 @@ msgstr "使用者" msgid "Users matching search criteria" msgstr "符合查詢條件的使用者" -#: html/Search/Elements/PickRestriction:50 html/Work/Search/PickRestriction:31 +#: NOT FOUND IN SOURCE msgid "ValueOfQueue" msgstr "選擇表單" @@ -5955,7 +6195,7 @@ msgstr "以管理員副本收件人身份視察" msgid "Watcher loaded" msgstr "成功載入視察員資訊" -#: html/Admin/Elements/QueueTabs:41 +#: html/Admin/Elements/QueueTabs:41 html/Edit/Elements/SelectQueues:5 msgid "Watchers" msgstr "視察員" @@ -5971,55 +6211,55 @@ msgstr "星期三" msgid "Wed." msgstr "星期三" -#: etc/initialdata.zh:533 etc/initialdata:503 etc/upgrade/2.1.71:161 html/Edit/Elements/CreateApprovalsQueue:135 +#: etc/initialdata:503 etc/upgrade/2.1.71:161 html/Edit/Elements/CreateApprovalsQueue:135 msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket" msgstr "當申請單通過所有簽核後,將此訊息回覆到原申請單" -#: etc/initialdata.zh:497 etc/initialdata:467 etc/upgrade/2.1.71:135 html/Edit/Elements/CreateApprovalsQueue:107 +#: etc/initialdata:467 etc/upgrade/2.1.71:135 html/Edit/Elements/CreateApprovalsQueue:107 msgid "When a ticket has been approved by any approver, add correspondence to the original ticket" msgstr "當申請單通過某項簽核後,將此訊息回覆到原申請單" -#: etc/initialdata.zh:156 etc/initialdata:138 +#: etc/initialdata:138 msgid "When a ticket is created" msgstr "新增申請單時" -#: etc/initialdata.zh:428 etc/initialdata:400 etc/upgrade/2.1.71:79 html/Edit/Elements/CreateApprovalsQueue:51 +#: etc/initialdata:400 etc/upgrade/2.1.71:79 html/Edit/Elements/CreateApprovalsQueue:51 msgid "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" msgstr "簽核單新增之後,通知應受理的承辦人及管理員副本收件人" -#: etc/initialdata.zh:161 etc/initialdata:143 +#: etc/initialdata:143 msgid "When anything happens" msgstr "當任何事情發生時" -#: etc/initialdata.zh:202 etc/initialdata:184 +#: etc/initialdata:184 msgid "Whenever a ticket is resolved" msgstr "當申請單解決時" -#: etc/initialdata.zh:188 etc/initialdata:170 +#: etc/initialdata:170 msgid "Whenever a ticket's owner changes" msgstr "當申請單更換承辦人時" -#: etc/initialdata.zh:196 etc/initialdata:178 +#: etc/initialdata:178 msgid "Whenever a ticket's queue changes" msgstr "當申請單更換表單時" -#: etc/initialdata.zh:180 etc/initialdata:162 +#: etc/initialdata:162 msgid "Whenever a ticket's status changes" msgstr "當申請單更新現況時" -#: etc/initialdata.zh:210 etc/initialdata:192 +#: etc/initialdata:192 msgid "Whenever a user-defined condition occurs" msgstr "當使用者自訂的情況發生時" -#: etc/initialdata.zh:174 etc/initialdata:156 +#: etc/initialdata:156 msgid "Whenever comments come in" msgstr "當評論送達時" -#: etc/initialdata.zh:167 etc/initialdata:149 +#: etc/initialdata:149 msgid "Whenever correspondence comes in" msgstr "當回覆送達時" -#: html/Admin/Users/Modify.html:163 html/User/Prefs.html:51 html/Work/Preferences/Info:34 +#: html/Admin/Users/Modify.html:163 html/User/Prefs.html:67 html/Work/Preferences/Info:36 msgid "Work" msgstr "公司" @@ -6048,23 +6288,35 @@ msgstr "流程結束" msgid "Workflow deleted" msgstr "流程已刪除" -#: html/Edit/Global/autohandler:10 html/Edit/Queues/autohandler:21 +#: html/Edit/Global/autohandler:10 html/Edit/Queues/autohandler:25 msgid "Workflows" msgstr "流程" -#: html/Edit/Global/Basic/Top:25 +#: html/Edit/Global/CustomField/SelectWritable:5 +msgid "Writable" +msgstr "可讀寫" + +#: html/autohandler:144 +msgid "XXX CHANGEME You are not an authorized user" +msgstr "XXX CHANGEME 您是未經授權的使用者" + +#: html/Edit/Global/Basic/Top:25 html/Edit/Queues/Basic/Top:82 msgid "Yes" msgstr "是" -#: lib/RT/Ticket_Overlay.pm:3150 +#: lib/RT/Ticket_Overlay.pm:3200 msgid "You already own this ticket" msgstr "您已是這份申請單的承辦人" -#: html/autohandler:122 +#: html/autohandler:136 msgid "You are not an authorized user" msgstr "您不是被授權的使用者" -#: lib/RT/Ticket_Overlay.pm:3032 +#: html/Ticket/Elements/ShowTransaction:81 +msgid "You can access it with the Download button on the right." +msgstr "您可以按右方的「下載」鍵來取得。" + +#: lib/RT/Ticket_Overlay.pm:3082 msgid "You can only reassign tickets that you own or that are unowned" msgstr "祇能重新指派您所承辦或是沒有承辦人的申請單" @@ -6072,7 +6324,7 @@ msgstr "祇能重新指派您所承辦或是沒有承辦人的申請單" msgid "You don't have permission to view that ticket.\\n" msgstr "您沒有看那份申請單的權限。\\n" -#: docs/design_docs/string-extraction-guide.txt:47 +#: docs/design_docs/string-extraction-guide.txt:47 lib/RT/StyleGuide.pod:760 #. ($num, $queue) msgid "You found %1 tickets in queue %2" msgstr "您會在表單 %2 找到 %1 的申請單" @@ -6085,11 +6337,11 @@ msgstr "您已登出 RT。" msgid "You have no permission to create tickets in that queue." msgstr "您沒有在該表單新增申請單的權限。" -#: lib/RT/Ticket_Overlay.pm:1908 +#: lib/RT/Ticket_Overlay.pm:1935 msgid "You may not create requests in that queue." msgstr "您不能在該表單中提出申請。" -#: html/Edit/Global/Basic/Top:38 +#: html/Edit/Global/Basic/Top:42 msgid "You need to restart the Request Tracker service for saved changes to take effect." msgstr "您必須重新啟動 Request Tracker 服務,儲存的更動纔會生效。" @@ -6105,11 +6357,11 @@ msgstr "您提出的 %1 申請單" msgid "Your RT administrator has misconfigured the mail aliases which invoke RT" msgstr "RT 管理員可能設錯了由 RT 寄出的郵件收件人標頭檔" -#: etc/initialdata.zh:514 etc/initialdata:484 etc/upgrade/2.1.71:146 html/Edit/Elements/CreateApprovalsQueue:119 +#: etc/initialdata:484 etc/upgrade/2.1.71:146 html/Edit/Elements/CreateApprovalsQueue:119 msgid "Your request has been approved by %1. Other approvals may still be pending." msgstr "申請單已由 %1 批准。可能還有其他待簽核的步驟。" -#: etc/initialdata.zh:552 etc/initialdata:522 etc/upgrade/2.1.71:180 html/Edit/Elements/CreateApprovalsQueue:154 +#: etc/initialdata:522 etc/upgrade/2.1.71:180 html/Edit/Elements/CreateApprovalsQueue:154 msgid "Your request has been approved." msgstr "您的申請單已完成簽核程序。" @@ -6117,7 +6369,7 @@ msgstr "您的申請單已完成簽核程序。" msgid "Your request was rejected" msgstr "您的申請單已被駁回" -#: etc/initialdata.zh:455 +#: NOT FOUND IN SOURCE msgid "Your request was rejected by %1." msgstr "您的申請單已被 %1 駁回。" @@ -6125,11 +6377,11 @@ msgstr "您的申請單已被 %1 駁回。" msgid "Your request was rejected." msgstr "您的申請單已被駁回。" -#: html/autohandler:144 +#: html/autohandler:170 msgid "Your username or password is incorrect" msgstr "您的帳號或密碼有誤" -#: html/Admin/Elements/ModifyUser:83 html/Admin/Users/Modify.html:143 html/User/Prefs.html:95 html/Work/Preferences/Info:85 +#: html/Admin/Elements/ModifyUser:83 html/Admin/Users/Modify.html:143 html/User/Prefs.html:130 html/Work/Preferences/Info:87 msgid "Zip" msgstr "郵遞區號" @@ -6145,6 +6397,10 @@ msgstr "過期" msgid "alert" msgstr "急訊" +#: NOT FOUND IN SOURCE +msgid "approving" +msgstr "待簽核" + #: html/User/Elements/DelegateRights:58 #. ($right->PrincipalObj->Object->SelfDescription) msgid "as granted to %1" @@ -6166,11 +6422,11 @@ msgstr "內容" msgid "content-type" msgstr "類型" -#: lib/RT/Ticket_Overlay.pm:2295 +#: lib/RT/Ticket_Overlay.pm:2326 msgid "correspondence (probably) not sent" msgstr "申請單回覆(可能)未送出" -#: lib/RT/Ticket_Overlay.pm:2305 +#: lib/RT/Ticket_Overlay.pm:2336 msgid "correspondence sent" msgstr "申請單回覆已送出" @@ -6178,7 +6434,7 @@ msgstr "申請單回覆已送出" msgid "critical" msgstr "嚴重" -#: html/Admin/Elements/ModifyQueue:62 html/Admin/Queues/Modify.html:76 html/Edit/Queues/Basic/Top:31 html/Edit/Queues/List:18 html/Work/Queues/List:11 lib/RT/Date.pm:319 +#: html/Admin/Elements/ModifyQueue:62 html/Admin/Queues/Modify.html:76 html/Edit/Queues/Basic/Top:34 html/Edit/Queues/List:32 html/Work/Queues/List:11 lib/RT/Date.pm:319 msgid "days" msgstr "天" @@ -6247,11 +6503,11 @@ msgstr "編號" msgid "info" msgstr "資訊" -#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickRestriction:46 html/Search/Elements/PickRestriction:75 html/Search/Elements/PickRestriction:87 html/Work/Search/PickRestriction:27 html/Work/Search/PickRestriction:56 html/Work/Search/PickRestriction:69 +#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickRestriction:46 html/Search/Elements/PickRestriction:75 html/Search/Elements/PickRestriction:87 html/Work/Search/PickRestriction:27 html/Work/Search/PickRestriction:56 html/Work/Search/PickRestriction:75 msgid "is" msgstr "是" -#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88 html/Work/Search/PickRestriction:28 html/Work/Search/PickRestriction:57 html/Work/Search/PickRestriction:70 +#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88 html/Work/Search/PickRestriction:28 html/Work/Search/PickRestriction:57 html/Work/Search/PickRestriction:76 msgid "isn't" msgstr "不是" @@ -6287,11 +6543,15 @@ msgstr "月" msgid "new" msgstr "新建立" +#: html/Admin/Elements/EditCustomFields:42 +msgid "no name" +msgstr "沒有名稱" + #: html/Admin/Elements/EditScrips:42 msgid "no value" msgstr "沒有值" -#: html/Admin/Elements/EditQueueWatchers:26 html/Edit/Groups/Member:40 html/Edit/Groups/Members/Add.html:17 html/Edit/Groups/Members/List:8 html/Edit/Queues/Basic/Top:50 html/Edit/Queues/List:18 html/Ticket/Elements/EditWatchers:27 html/Work/Delegates/Info:37 html/Work/Delegates/Info:48 html/Work/Overview/Info:31 html/Work/Queues/List:11 html/Work/Tickets/Elements/ShowBasics:27 +#: html/Admin/Elements/EditQueueWatchers:26 html/Edit/Groups/Member:40 html/Edit/Groups/Members/Add.html:17 html/Edit/Groups/Members/List:8 html/Edit/Queues/List:32 html/Ticket/Elements/EditWatchers:27 html/Work/Delegates/Info:37 html/Work/Delegates/Info:48 html/Work/Overview/Info:31 html/Work/Queues/List:11 html/Work/Tickets/Elements/EditWatchers:5 html/Work/Tickets/Elements/ShowAttachments:30 html/Work/Tickets/Elements/ShowBasics:27 msgid "none" msgstr "無" @@ -6333,11 +6593,11 @@ msgstr "表單 %1 %2" msgid "rejected" msgstr "已駁回" -#: html/Work/Elements/SelectSearch:21 lib/RT/Queue_Overlay.pm:60 +#: lib/RT/Queue_Overlay.pm:60 msgid "resolved" msgstr "已處理" -#: html/Edit/Global/Basic/Top:48 +#: html/Edit/Global/Basic/Top:53 msgid "rtname" msgstr "伺服器名稱" @@ -6363,16 +6623,21 @@ msgstr "系統群組 '%1'" msgid "the calling component did not specify why" msgstr "呼叫元件未指明原因" +#: lib/RT/URI/fsck_com_rt.pm:234 +#. ($self->Object->Id) +msgid "ticket #%1" +msgstr "申請單 #%1" + #: lib/RT/Group_Overlay.pm:209 #. ($self->Instance, $self->Type) msgid "ticket #%1 %2" msgstr "申請單 #%1 %2" -#: html/Work/Elements/SelectSearch:27 +#: html/Work/Elements/SelectSearch:28 msgid "till" msgstr "至" -#: html/Edit/Elements/PickUsers:15 html/Edit/Global/Workflow/Condition:30 html/Edit/Users/Add.html:16 html/Edit/Users/Search.html:26 html/Work/Tickets/Cc:13 +#: html/Edit/Elements/PickUsers:15 html/Edit/Global/Workflow/Condition:31 html/Edit/Users/Add.html:16 html/Edit/Users/Search.html:26 html/Work/Tickets/Cc:13 msgid "to" msgstr "到" @@ -6385,7 +6650,7 @@ msgstr "真" msgid "undescribed group %1" msgstr "沒有描述的群組 %1" -#: html/Work/Elements/SelectSearch:19 +#: NOT FOUND IN SOURCE msgid "unresolved" msgstr "未處理" @@ -6410,7 +6675,3 @@ msgstr "範本:%1" msgid "years" msgstr "å¹´" -#: lib/RT/Date.pm:331 -msgid "approving" -msgstr "待簽核" - diff --git a/rt/lib/RT/Interface/Email.pm b/rt/lib/RT/Interface/Email.pm index bc1a55da2..241f5f35c 100755 --- a/rt/lib/RT/Interface/Email.pm +++ b/rt/lib/RT/Interface/Email.pm @@ -27,14 +27,14 @@ use strict; use Mail::Address; use MIME::Entity; use RT::EmailParser; - +use File::Temp; BEGIN { use Exporter (); use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); # set the version for version checking - $VERSION = do { my @r = (q$Revision: 1.1.1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker + $VERSION = do { my @r = (q$Revision: 1.1.1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker @ISA = qw(Exporter); @@ -153,6 +153,7 @@ sub MailError { Subject => 'There has been an error', Explanation => 'Unexplained error', MIMEObj => undef, + Attach => undef, LogLevel => 'crit', @_); @@ -175,7 +176,13 @@ sub MailError { $mimeobj->sync_headers(); $entity->add_part($mimeobj); } - + + if ($args{'Attach'}) { + $entity->attach(Data => $args{'Attach'}, Type => 'message/rfc822'); + + } + + if ($RT::MailCommand eq 'sendmailpipe') { open (MAIL, "|$RT::SendmailPath $RT::SendmailArguments") || return(0); print MAIL $entity->as_string; @@ -194,12 +201,6 @@ sub CreateUser { my ($Username, $Address, $Name, $ErrorsTo, $entity) = @_; my $NewUser = RT::User->new($RT::SystemUser); - # This data is tainted by some Very Broken mailers. - # (Sometimes they send raw ISO 8859-1 data here. fear that. - require Encode; - $Username = Encode::encode(utf8 => $Username, Encode::FB_PERLQQ()) if defined $Username; - $Name = Encode::encode(utf8 => $Name, Encode::FB_PERLQQ()) if defined $Name; - my ($Val, $Message) = $NewUser->Create(Name => ($Username || $Address), EmailAddress => $Address, @@ -361,36 +362,108 @@ sub ParseAddressFromHeader{ -=head2 Gateway +=head2 Gateway ARGSREF + + +Takes parameters: + + action + queue + message + This performs all the "guts" of the mail rt-mailgate program, and is designed to be called from the web interface with a message, user object, and so on. +Returns: + + An array of: + + (status code, message, optional ticket object) + + status code is a numeric value. + + for temporary failures, status code should be -75 + + for permanent failures which are handled by RT, status code should be 0 + + for succces, the status code should be 1 + + + =cut sub Gateway { - my %args = ( message => undef, - queue => 1, - action => 'correspond', - ticket => undef, - @_ ); + my $argsref = shift; + + my %args = %$argsref; + + # Set some reasonable defaults + $args{'action'} = 'correspond' unless ( $args{'action'} ); + $args{'queue'} = '1' unless ( $args{'queue'} ); # Validate the action unless ( $args{'action'} =~ /^(comment|correspond|action)$/ ) { # Can't safely loc this. What object do we loc around? - return ( 0, "Invalid 'action' parameter", undef ); + $RT::Logger->crit("Mail gateway called with an invalid action paramenter '".$args{'action'}."' for queue '".$args{'queue'}."'"); + + return ( -75, "Invalid 'action' parameter", undef ); } my $parser = RT::EmailParser->new(); - $parser->ParseMIMEEntityFromScalar( $args{'message'} ); + my ( $fh, $temp_file ); + for ( 1 .. 10 ) { + + # on NFS and NTFS, it is possible that tempfile() conflicts + # with other processes, causing a race condition. we try to + # accommodate this by pausing and retrying. + last if ( $fh, $temp_file ) = eval { File::Temp::tempfile(undef, UNLINK => 0) }; + sleep 1; + } + if ($fh) { + binmode $fh; #thank you, windows + $fh->autoflush(1); + print $fh $args{'message'}; + close($fh); + + if ( -f $temp_file ) { + $parser->ParseMIMEEntityFromFile($temp_file); + File::Temp::unlink0( $fh, $temp_file ); + if ($parser->Entity) { + delete $args{'message'}; + } + } + + } + + #If for some reason we weren't able to parse the message using a temp file + # try it with a scalar + if ($args{'message'}) { + $parser->ParseMIMEEntityFromScalar($args{'message'}); + + } + + if (!$parser->Entity()) { + MailError( + To => $RT::OwnerEmail, + Subject => "RT Bounce: Unparseable message", + Explanation => "RT couldn't process the message below", + Attach => $args{'message'} + ); + + return(0,"Failed to parse this message. Something is likely badly wrong with the message"); + } my $Message = $parser->Entity(); - my $head = $Message->head; + my $head = $Message->head; my ( $CurrentUser, $AuthStat, $status, $error ); + # Initalize AuthStat so comparisons work correctly + $AuthStat = -9999999; + my $ErrorsTo = ParseErrorsToAddressFromHead($head); my $MessageId = $head->get('Message-Id') @@ -400,37 +473,31 @@ sub Gateway { my $Subject = $head->get('Subject') || ''; chomp $Subject; - $args{'ticket'} ||= $parser->ParseTicketId($Subject); my $SystemTicket; - if ($args{'ticket'} ) { + if ( $args{'ticket'} ) { $SystemTicket = RT::Ticket->new($RT::SystemUser); - $SystemTicket->Load($args{'ticket'}); + $SystemTicket->Load( $args{'ticket'} ); } #Set up a queue object my $SystemQueueObj = RT::Queue->new($RT::SystemUser); $SystemQueueObj->Load( $args{'queue'} ); - # We can safely have no queue of we have a known-good ticket unless ( $args{'ticket'} || $SystemQueueObj->id ) { - MailError( - To => $RT::OwnerEmail, - Subject => "RT Bounce: $Subject", - Explanation => "RT couldn't find the queue: " . $args{'queue'}, - MIMEObj => $Message ); - return ( 0, "RT couldn't find the queue: " . $args{'queue'}, undef ); + return ( -75, "RT couldn't find the queue: " . $args{'queue'}, undef ); } # Authentication Level - # -1 - Get out. this user has been explicitly declined + # -1 - Get out. this user has been explicitly declined # 0 - User may not do anything (Not used at the moment) # 1 - Normal user # 2 - User is allowed to specify status updates etc. a la enhanced-mailgate - push @RT::MailPlugins, "Auth::MailFrom" unless @RT::MailPlugins; + push @RT::MailPlugins, "Auth::MailFrom" unless @RT::MailPlugins; + # Since this needs loading, no matter what for (@RT::MailPlugins) { @@ -453,35 +520,59 @@ sub Gateway { } } - ( $CurrentUser, $NewAuthStat ) = $Code->( Message => $Message, - CurrentUser => $CurrentUser, - AuthLevel => $AuthStat, - Action => $args{'action'}, - Ticket => $SystemTicket, - Queue => $SystemQueueObj ); + ( $CurrentUser, $NewAuthStat ) = $Code->( + Message => $Message, + CurrentUser => $CurrentUser, + AuthLevel => $AuthStat, + Action => $args{'action'}, + Ticket => $SystemTicket, + Queue => $SystemQueueObj + ); + + # If a module returns a "-1" then we discard the ticket, so. + $AuthStat = -1 if $NewAuthStat == -1; # You get the highest level of authentication you were assigned. - last if $AuthStat == -1; $AuthStat = $NewAuthStat if $NewAuthStat > $AuthStat; + last if $AuthStat == -1; } # {{{ If authentication fails and no new user was created, get out. if ( !$CurrentUser or !$CurrentUser->Id or $AuthStat == -1 ) { # If the plugins refused to create one, they lose. - MailError( - Subject => "Could not load a valid user", - Explanation => < $RT::OwnerEmail, + Subject => "Could not load a valid user", + Explanation => < $Message, - LogLevel => 'error' ) - unless $AuthStat == -1; + MIMEObj => $Message, + LogLevel => 'error' + ); + + # Also notify the requestor that his request has been dropped. + MailError( + To => $ErrorsTo, + Subject => "Could not load a valid user", + Explanation => < $Message, + LogLevel => 'error' + ); + } return ( 0, "Could not load a valid user", undef ); } @@ -508,10 +599,11 @@ EOT # {{{ Drop it if it's disallowed if ( $AuthStat == 0 ) { MailError( - To => $ErrorsTo, - Subject => "Permission Denied", - Explanation => "You do not have permission to communicate with RT", - MIMEObj => $Message ); + To => $ErrorsTo, + Subject => "Permission Denied", + Explanation => "You do not have permission to communicate with RT", + MIMEObj => $Message + ); } # }}} @@ -523,10 +615,12 @@ EOT #Should we mail it to RTOwner? if ($RT::LoopsToRTOwner) { - MailError( To => $RT::OwnerEmail, - Subject => "RT Bounce: $Subject", - Explanation => "RT thinks this message may be a bounce", - MIMEObj => $Message ); + MailError( + To => $RT::OwnerEmail, + Subject => "RT Bounce: $Subject", + Explanation => "RT thinks this message may be a bounce", + MIMEObj => $Message + ); #Do we actually want to store it? return ( 0, "Message Bounced", undef ) unless ($RT::StoreLoops); @@ -538,8 +632,10 @@ EOT # {{{ Squelch replies if necessary # Don't let the user stuff the RT-Squelch-Replies-To header. if ( $head->get('RT-Squelch-Replies-To') ) { - $head->add( 'RT-Relocated-Squelch-Replies-To', - $head->get('RT-Squelch-Replies-To') ); + $head->add( + 'RT-Relocated-Squelch-Replies-To', + $head->get('RT-Squelch-Replies-To') + ); $head->delete('RT-Squelch-Replies-To'); } @@ -564,22 +660,27 @@ EOT my @Requestors = ( $CurrentUser->id ); if ($RT::ParseNewMessageForTicketCcs) { - @Cc = ParseCcAddressesFromHead( Head => $head, - CurrentUser => $CurrentUser, - QueueObj => $SystemQueueObj ); + @Cc = ParseCcAddressesFromHead( + Head => $head, + CurrentUser => $CurrentUser, + QueueObj => $SystemQueueObj + ); } my ( $id, $Transaction, $ErrStr ) = $Ticket->Create( - Queue => $SystemQueueObj->Id, - Subject => $Subject, - Requestor => \@Requestors, - Cc => \@Cc, - MIMEObj => $Message ); + Queue => $SystemQueueObj->Id, + Subject => $Subject, + Requestor => \@Requestors, + Cc => \@Cc, + MIMEObj => $Message + ); if ( $id == 0 ) { - MailError( To => $ErrorsTo, - Subject => "Ticket creation failed", - Explanation => $ErrStr, - MIMEObj => $Message ); + MailError( + To => $ErrorsTo, + Subject => "Ticket creation failed", + Explanation => $ErrStr, + MIMEObj => $Message + ); $RT::Logger->error("Create failed: $id / $Transaction / $ErrStr "); return ( 0, "Ticket creation failed", $Ticket ); } @@ -591,15 +692,17 @@ EOT # If the action is comment, add a comment. elsif ( $args{'action'} =~ /^(comment|correspond)$/i ) { - $Ticket->Load($args{'ticket'}); + $Ticket->Load( $args{'ticket'} ); unless ( $Ticket->Id ) { - my $message = "Could not find a ticket with id ".$args{'ticket'}; - MailError( To => $ErrorsTo, - Subject => "Message not recorded", - Explanation => $message, - MIMEObj => $Message ); - - return ( 0, $message); + my $message = "Could not find a ticket with id " . $args{'ticket'}; + MailError( + To => $ErrorsTo, + Subject => "Message not recorded", + Explanation => $message, + MIMEObj => $Message + ); + + return ( 0, $message ); } my ( $status, $msg ); @@ -612,10 +715,12 @@ EOT unless ($status) { #Warn the sender that we couldn't actually submit the comment. - MailError( To => $ErrorsTo, - Subject => "Message not recorded", - Explanation => $msg, - MIMEObj => $Message ); + MailError( + To => $ErrorsTo, + Subject => "Message not recorded", + Explanation => $msg, + MIMEObj => $Message + ); return ( 0, "Message not recorded", $Ticket ); } } @@ -623,21 +728,28 @@ EOT else { #Return mail to the sender with an error - MailError( To => $ErrorsTo, - Subject => "RT Configuration error", - Explanation => "'" - . $args{'action'} - . "' not a recognized action." - . " Your RT administrator has misconfigured " - . "the mail aliases which invoke RT", - MIMEObj => $Message ); + MailError( + To => $ErrorsTo, + Subject => "RT Configuration error", + Explanation => "'" + . $args{'action'} + . "' not a recognized action." + . " Your RT administrator has misconfigured " + . "the mail aliases which invoke RT", + MIMEObj => $Message + ); $RT::Logger->crit( $args{'action'} . " type unknown for $MessageId" ); - return ( 0, "Configuration error: " . $args{'action'} . " not a recognized action", $Ticket ); + return ( + -75, + "Configuration error: " + . $args{'action'} + . " not a recognized action", + $Ticket + ); } - -return ( 1, "Success", $Ticket ); + return ( 1, "Success", $Ticket ); } eval "require RT::Interface::Email_Vendor"; diff --git a/rt/lib/RT/Interface/REST.pm b/rt/lib/RT/Interface/REST.pm new file mode 100644 index 000000000..1ec4f21f9 --- /dev/null +++ b/rt/lib/RT/Interface/REST.pm @@ -0,0 +1,252 @@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work 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. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK +# lib/RT/Interface/REST.pm +# + +package RT::Interface::REST; +use strict; +use RT; + +BEGIN { + use Exporter (); + use vars qw($VERSION @ISA @EXPORT); + + $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d"x$#r, @r }; + + @ISA = qw(Exporter); + @EXPORT = qw(expand_list form_parse form_compose vpush vsplit); +} + +my $field = '[a-zA-Z][a-zA-Z0-9_-]*'; + +sub expand_list { + my ($list) = @_; + my ($elt, @elts, %elts); + + foreach $elt (split /,/, $list) { + if ($elt =~ /^(\d+)-(\d+)$/) { push @elts, ($1..$2) } + else { push @elts, $elt } + } + + @elts{@elts}=(); + return sort {$a<=>$b} keys %elts; +} + +# Returns a reference to an array of parsed forms. +sub form_parse { + my $state = 0; + my @forms = (); + my @lines = split /\n/, $_[0]; + my ($c, $o, $k, $e) = ("", [], {}, ""); + + LINE: + while (@lines) { + my $line = shift @lines; + + next LINE if $line eq ''; + + if ($line eq '--') { + # We reached the end of one form. We'll ignore it if it was + # empty, and store it otherwise, errors and all. + if ($e || $c || @$o) { + push @forms, [ $c, $o, $k, $e ]; + $c = ""; $o = []; $k = {}; $e = ""; + } + $state = 0; + } + elsif ($state != -1) { + if ($state == 0 && $line =~ /^#/) { + # Read an optional block of comments (only) at the start + # of the form. + $state = 1; + $c = $line; + while (@lines && $lines[0] =~ /^#/) { + $c .= "\n".shift @lines; + } + $c .= "\n"; + } + elsif ($state <= 1 && $line =~ /^($field):(?:\s+(.*))?$/) { + # Read a field: value specification. + my $f = $1; + my @v = ($2 || ()); + + # Read continuation lines, if any. + while (@lines && ($lines[0] eq '' || $lines[0] =~ /^\s+/)) { + push @v, shift @lines; + } + pop @v while (@v && $v[-1] eq ''); + + # Strip longest common leading indent from text. + my ($ws, $ls) = (""); + foreach $ls (map {/^(\s+)/} @v[1..$#v]) { + $ws = $ls if (!$ws || length($ls) < length($ws)); + } + s/^$ws// foreach @v; + + push(@$o, $f) unless exists $k->{$f}; + vpush($k, $f, join("\n", @v)); + + $state = 1; + } + elsif ($line !~ /^#/) { + # We've found a syntax error, so we'll reconstruct the + # form parsed thus far, and add an error marker. (>>) + $state = -1; + $e = form_compose([[ "", $o, $k, "" ]]); + $e.= $line =~ /^>>/ ? "$line\n" : ">> $line\n"; + } + } + else { + # We saw a syntax error earlier, so we'll accumulate the + # contents of this form until the end. + $e .= "$line\n"; + } + } + push(@forms, [ $c, $o, $k, $e ]) if ($e || $c || @$o); + + my $l; + foreach $l (keys %$k) { + $k->{$l} = vsplit($k->{$l}) if (ref $k->{$l} eq 'ARRAY'); + } + + return \@forms; +} + +# Returns text representing a set of forms. +sub form_compose { + my ($forms) = @_; + my (@text, $form); + + foreach $form (@$forms) { + my ($c, $o, $k, $e) = @$form; + my $text = ""; + + if ($c) { + $c =~ s/\n*$/\n/; + $text = "$c\n"; + } + if ($e) { + $text .= $e; + } + elsif ($o) { + my (@lines, $key); + + foreach $key (@$o) { + my ($line, $sp, $v); + my @values = (ref $k->{$key} eq 'ARRAY') ? + @{ $k->{$key} } : + $k->{$key}; + + $sp = " "x(length("$key: ")); + $sp = " "x4 if length($sp) > 16; + + foreach $v (@values) { + if ($v =~ /\n/) { + $v =~ s/^/$sp/gm; + $v =~ s/^$sp//; + + if ($line) { + push @lines, "$line\n\n"; + $line = ""; + } + elsif (@lines && $lines[-1] !~ /\n\n$/) { + $lines[-1] .= "\n"; + } + push @lines, "$key: $v\n\n"; + } + elsif ($line && + length($line)+length($v)-rindex($line, "\n") >= 70) + { + $line .= ",\n$sp$v"; + } + else { + $line = $line ? "$line, $v" : "$key: $v"; + } + } + + $line = "$key:" unless @values; + if ($line) { + if ($line =~ /\n/) { + if (@lines && $lines[-1] !~ /\n\n$/) { + $lines[-1] .= "\n"; + } + $line .= "\n"; + } + push @lines, "$line\n"; + } + } + + $text .= join "", @lines; + } + else { + chomp $text; + } + push @text, $text; + } + + return join "\n--\n\n", @text; +} + +# Add a value to a (possibly multi-valued) hash key. +sub vpush { + my ($hash, $key, $val) = @_; + my @val = ref $val eq 'ARRAY' ? @$val : $val; + + if (exists $hash->{$key}) { + unless (ref $hash->{$key} eq 'ARRAY') { + my @v = $hash->{$key} ne '' ? $hash->{$key} : (); + $hash->{$key} = \@v; + } + push @{ $hash->{$key} }, @val; + } + else { + $hash->{$key} = $val; + } +} + +# "Normalise" a hash key that's known to be multi-valued. +sub vsplit { + my ($val) = @_; + my ($line, $word, @words); + + foreach $line (map {split /\n/} (ref $val eq 'ARRAY') ? @$val : $val) + { + # XXX: This should become a real parser, à la Text::ParseWords. + $line =~ s/^\s+//; + $line =~ s/\s+$//; + push @words, split /\s*,\s*/, $line; + } + + return \@words; +} + +1; + +=head1 NAME + + RT::Interface::REST - helper functions for the REST interface. + +=head1 SYNOPSIS + + Only the REST should use this module. diff --git a/rt/lib/RT/Interface/Web.pm b/rt/lib/RT/Interface/Web.pm index 5097f54a4..8d66239be 100644 --- a/rt/lib/RT/Interface/Web.pm +++ b/rt/lib/RT/Interface/Web.pm @@ -68,6 +68,7 @@ sub NewApacheHandler { default_escape_flags => 'h', allow_globals => [qw(%session)], data_dir => "$RT::MasonDataDir", + autoflush => 1, @_ ); @@ -98,7 +99,8 @@ sub NewCGIHandler { ], data_dir => "$RT::MasonDataDir", default_escape_flags => 'h', - allow_globals => [qw(%session)] + allow_globals => [qw(%session)], + autoflush => 1, ); @@ -137,6 +139,60 @@ sub EscapeUTF8 { # }}} +# {{{ WebCanonicalizeInfo + +=head2 WebCanonicalizeInfo(); + +Different web servers set different environmental varibles. This +function must return something suitable for REMOTE_USER. By default, +just downcase $ENV{'REMOTE_USER'} + +=cut + +sub WebCanonicalizeInfo { + my $user; + + if ( defined $ENV{'REMOTE_USER'} ) { + $user = lc ( $ENV{'REMOTE_USER'} ) if( length($ENV{'REMOTE_USER'}) ); + } + + return $user; +} + +# }}} + +# {{{ WebExternalAutoInfo + +=head2 WebExternalAutoInfo($user); + +Returns a hash of user attributes, used when WebExternalAuto is set. + +=cut + +sub WebExternalAutoInfo { + my $user = shift; + + my %user_info; + + $user_info{'Privileged'} = 1; + + if ($^O !~ /^(?:riscos|MacOS|MSWin32|dos|os2)$/) { + # Populate fields with information from Unix /etc/passwd + + my ($comments, $realname) = (getpwnam($user))[5, 6]; + $user_info{'Comments'} = $comments if defined $comments; + $user_info{'RealName'} = $realname if defined $realname; + } + elsif ($^O eq 'MSWin32' and eval 'use Net::AdminMisc; 1') { + # Populate fields with information from NT domain controller + } + + # and return the wad of stuff + return {%user_info}; +} + +# }}} + package HTML::Mason::Commands; use strict; @@ -160,10 +216,13 @@ sub loc { UNIVERSAL::can($session{'CurrentUser'}, 'loc')){ return($session{'CurrentUser'}->loc(@_)); } - else { - my $u = RT::CurrentUser->new($RT::SystemUser); + elsif ( my $u = eval { RT::CurrentUser->new($RT::SystemUser->Id) } ) { return ($u->loc(@_)); } + else { + # pathetic case -- SystemUser is gone. + return $_[0]; + } } # }}} @@ -189,7 +248,7 @@ sub loc_fuzzy { return($session{'CurrentUser'}->loc_fuzzy($msg)); } else { - my $u = RT::CurrentUser->new($RT::SystemUser); + my $u = RT::CurrentUser->new($RT::SystemUser->Id); return ($u->loc_fuzzy($msg)); } } @@ -365,7 +424,8 @@ sub ProcessUpdateMessage { ); #Make the update content have no 'weird' newlines in it - if ( $args{ARGSRef}->{'UpdateContent'} ) { + if ( $args{ARGSRef}->{'UpdateContent'} || + $args{ARGSRef}->{'UpdateAttachments'}) { if ( $args{ARGSRef}->{'UpdateSubject'} eq $args{'TicketObj'}->Subject() ) @@ -433,7 +493,8 @@ sub MakeMIMEEntity { Cc => undef, Body => undef, AttachmentFieldName => undef, - map Encode::encode_utf8($_), @_, +# map Encode::encode_utf8($_), @_, + @_, ); #Make the update content have no 'weird' newlines in it @@ -449,6 +510,7 @@ sub MakeMIMEEntity { Subject => $args{'Subject'} || "", From => $args{'From'}, Cc => $args{'Cc'}, + Charset => 'utf8', Data => [ $args{'Body'} ] ); } @@ -463,7 +525,14 @@ sub MakeMIMEEntity { #foreach my $filehandle (@filenames) { - my ( $fh, $temp_file ) = tempfile(); + my ( $fh, $temp_file ); + for ( 1 .. 10 ) { + # on NFS and NTFS, it is possible that tempfile() conflicts + # with other processes, causing a race condition. we try to + # accommodate this by pausing and retrying. + last if ($fh, $temp_file) = eval { tempfile() }; + sleep 1; + } binmode $fh; #thank you, windows my ($buffer); @@ -481,7 +550,7 @@ sub MakeMIMEEntity { $Message->attach( Path => $temp_file, - Filename => $filename, + Filename => Encode::decode_utf8($filename), Type => $uploadinfo->{'Content-Type'}, ); close($fh); @@ -594,13 +663,13 @@ sub ProcessSearchQuery { # }}} # {{{ Limit requestor email + if ( $args{ARGS}->{'ValueOfWatcherRole'} ne '' ) { + $session{'tickets'}->LimitWatcher( + TYPE => $args{ARGS}->{'WatcherRole'}, + VALUE => $args{ARGS}->{'ValueOfWatcherRole'}, + OPERATOR => $args{ARGS}->{'WatcherRoleOp'}, - if ( $args{ARGS}->{'ValueOfRequestor'} ne '' ) { - my $alias = $session{'tickets'}->LimitRequestor( - VALUE => $args{ARGS}->{'ValueOfRequestor'}, - OPERATOR => $args{ARGS}->{'RequestorOp'}, ); - } # }}} @@ -780,17 +849,13 @@ sub ProcessACLChanges { my $obj; - if ($object_type eq 'RT::Queue') { - $obj = RT::Queue->new($session{'CurrentUser'}); - $obj->Load($object_id); - } elsif ($object_type eq 'RT::Group') { - $obj = RT::Group->new($session{'CurrentUser'}); - $obj->Load($object_id); - - } elsif ($object_type eq 'RT::System') { + if ($object_type eq 'RT::System') { $obj = $RT::System; + } elsif ($RT::ACE::OBJECT_TYPES{$object_type}) { + $obj = $object_type->new($session{'CurrentUser'}); + $obj->Load($object_id); } else { - push (@results, loc("System Error"). + push (@results, loc("System Error"). ': '. loc("Rights could not be granted for [_1]", $object_type)); next; } @@ -813,17 +878,14 @@ sub ProcessACLChanges { next unless ($right); my $obj; - if ($object_type eq 'RT::Queue') { - $obj = RT::Queue->new($session{'CurrentUser'}); - $obj->Load($object_id); - } elsif ($object_type eq 'RT::Group') { - $obj = RT::Group->new($session{'CurrentUser'}); - $obj->Load($object_id); - - } elsif ($object_type eq 'RT::System') { + if ($object_type eq 'RT::System') { $obj = $RT::System; + } elsif ($RT::ACE::OBJECT_TYPES{$object_type}) { + $obj = $object_type->new($session{'CurrentUser'}); + $obj->Load($object_id); } else { - push (@results, loc("System Error"). + die; + push (@results, loc("System Error"). ': '. loc("Rights could not be revoked for [_1]", $object_type)); next; } @@ -953,6 +1015,17 @@ sub ProcessCustomFieldUpdates { my ( $err, $msg ) = $Object->DeleteValue($id); push ( @results, $msg ); } + + my $vals = $Object->Values(); + while (my $cfv = $vals->Next()) { + if (my $so = $ARGSRef->{ 'CustomField-' . $Object->Id . '-SortOrder' . $cfv->Id }) { + if ($cfv->SortOrder != $so) { + my ( $err, $msg ) = $cfv->SetSortOrder($so); + push ( @results, $msg ); + } + } + } + return (@results); } @@ -1050,8 +1123,11 @@ sub ProcessTicketCustomFieldUpdates { # For each of those tickets foreach my $tick ( keys %custom_fields_to_mod ) { - my $Ticket = RT::Ticket->new( $session{'CurrentUser'} ); - $Ticket->Load($tick); + my $Ticket = $args{'TicketObj'}; + if (!$Ticket or $Ticket->id != $tick) { + $Ticket = RT::Ticket->new( $session{'CurrentUser'} ); + $Ticket->Load($tick); + } # For each custom field foreach my $cf ( keys %{ $custom_fields_to_mod{$tick} } ) { @@ -1074,10 +1150,10 @@ sub ProcessTicketCustomFieldUpdates { my @values = ( ref( $ARGSRef->{$arg} ) eq 'ARRAY' ) ? @{ $ARGSRef->{$arg} } - : ( $ARGSRef->{$arg} ); + : split /\n/, $ARGSRef->{$arg} ; if ( ( $arg =~ /-AddValue$/ ) || ( $arg =~ /-Value$/ ) ) { foreach my $value (@values) { - next unless ($value); + next unless length($value); my ( $val, $msg ) = $Ticket->AddCustomFieldValue( Field => $cf, Value => $value @@ -1087,7 +1163,7 @@ sub ProcessTicketCustomFieldUpdates { } elsif ( $arg =~ /-DeleteValues$/ ) { foreach my $value (@values) { - next unless ($value); + next unless length($value); my ( $val, $msg ) = $Ticket->DeleteCustomFieldValue( Field => $cf, Value => $value @@ -1100,7 +1176,7 @@ sub ProcessTicketCustomFieldUpdates { my %values_hash; foreach my $value (@values) { - next unless ($value); + next unless length($value); # build up a hash of values that the new set has $values_hash{$value} = 1; diff --git a/rt/lib/RT/Principal_Overlay.pm b/rt/lib/RT/Principal_Overlay.pm index d2782b730..b788e36c4 100644 --- a/rt/lib/RT/Principal_Overlay.pm +++ b/rt/lib/RT/Principal_Overlay.pm @@ -348,6 +348,12 @@ sub HasRight { next unless (UNIVERSAL::can($obj, 'id')); my $type = ref($obj); my $id = $obj->id; + + unless ($id) { + use Carp; + Carp::cluck("Trying to check $type rights for an unspecified $type"); + $RT::Logger->crit("Trying to check $type rights for an unspecified $type"); + } push @look_at_objects, "(ACL.ObjectType = '$type' AND ACL.ObjectId = '$id')"; } @@ -385,7 +391,8 @@ sub HasRight { "AND ( ( ACL.PrincipalId = Principals.id AND ACL.PrincipalType = 'Group' AND ". "(Groups.Domain = 'SystemInternal' OR Groups.Domain = 'UserDefined' OR Groups.Domain = 'ACLEquivalence' OR Groups.Domain = 'Personal'))". - " ) LIMIT 1"; + " ) "; + $self->_Handle->ApplyLimits(\$groups_query, 1); #only return one result my @roles; foreach my $object (@{$args{'EquivObjects'}}) { @@ -397,7 +404,8 @@ sub HasRight { if (@roles) { $roles_query = $query_base . "AND ". " ( (".join (' OR ', @roles)." ) ". - " AND Groups.Type = ACL.PrincipalType AND Groups.Id = Principals.id AND Principals.PrincipalType = 'Group') LIMIT 1"; + " AND Groups.Type = ACL.PrincipalType AND Groups.Id = Principals.id AND Principals.PrincipalType = 'Group') "; + $self->_Handle->ApplyLimits(\$roles_query, 1); #only return one result } @@ -461,7 +469,18 @@ sub _RolesForObject { my $self = shift; my $type = shift; my $id = shift; - my $clause = "(Groups.Domain = '".$type."-Role' AND Groups.Instance = '" . $id. "') "; + + unless ($id) { + $id = '0'; + } + + # This should never be true. + unless ($id =~ /^\d+$/) { + $RT::Logger->crit("RT::Prinicipal::_RolesForObject called with type $type and a non-integer id: '$id'"); + $id = "'$id'"; + } + + my $clause = "(Groups.Domain = '".$type."-Role' AND Groups.Instance = $id) "; return($clause); } diff --git a/rt/lib/RT/Queue_Overlay.pm b/rt/lib/RT/Queue_Overlay.pm index 4eb265f2a..fcc185b10 100644 --- a/rt/lib/RT/Queue_Overlay.pm +++ b/rt/lib/RT/Queue_Overlay.pm @@ -327,7 +327,7 @@ sub Load { $self->SUPER::LoadById($identifier); } else { - $self->LoadByCol( "Name", $identifier ); + $self->LoadByCols( Name => $identifier ); } return ( $self->Id ); @@ -866,8 +866,11 @@ sub IsWatcher { my $principal = RT::Principal->new($self->CurrentUser); $principal->Load($args{'PrincipalId'}); + unless ($principal->Id) { + return (undef); + } - return ($group->HasMember($principal)); + return ($group->HasMemberRecursively($principal)); } # }}} diff --git a/rt/lib/RT/Record.pm b/rt/lib/RT/Record.pm index 6962221ea..7a8690618 100755 --- a/rt/lib/RT/Record.pm +++ b/rt/lib/RT/Record.pm @@ -211,7 +211,10 @@ sub LoadByCols { $newhash{$key} = $hash{$key}; } else { - $newhash{ "lower(" . $key . ")" } = lc( $hash{$key} ); + my ($op, $val); + ($key, $op, $val) = $self->_Handle->_MakeClauseCaseInsensitive($key, '=', $hash{$key}); + $newhash{$key}->{operator} = $op; + $newhash{$key}->{value} = $val; } } diff --git a/rt/lib/RT/ScripAction_Overlay.pm b/rt/lib/RT/ScripAction_Overlay.pm index e2b018aaf..e75987135 100644 --- a/rt/lib/RT/ScripAction_Overlay.pm +++ b/rt/lib/RT/ScripAction_Overlay.pm @@ -48,6 +48,7 @@ ok (require RT::ScripAction); use strict; no warnings qw(redefine); +use RT::Template; # {{{ sub _Init sub _Init { @@ -135,6 +136,8 @@ sub LoadAction { my %args = ( TransactionObj => undef, TicketObj => undef, @_ ); + + $self->{_TicketObj} = $args{TicketObj}; #TODO: Put this in an eval $self->ExecModule =~ /^(\w+)$/; @@ -164,14 +167,26 @@ Return this action\'s template object sub TemplateObj { my $self = shift; return undef unless $self->{Template}; - if (!$self->{'TemplateObj'}) { - require RT::Template; - $self->{'TemplateObj'} = RT::Template->new($self->CurrentUser); - $self->{'TemplateObj'}->LoadById($self->{'Template'}); - + if ( !$self->{'TemplateObj'} ) { + $self->{'TemplateObj'} = RT::Template->new( $self->CurrentUser ); + $self->{'TemplateObj'}->LoadById( $self->{'Template'} ); + + if ( ( $self->{'TemplateObj'}->__Value('Queue') == 0 ) + && $self->{'_TicketObj'} ) { + my $tmptemplate = RT::Template->new( $self->CurrentUser ); + my ( $ok, $err ) = $tmptemplate->LoadQueueTemplate( + Queue => $self->{'_TicketObj'}->QueueObj->id, + Name => $self->{'TemplateObj'}->Name); + + if ( $tmptemplate->id ) { + # found the queue-specific template with the same name + $self->{'TemplateObj'} = $tmptemplate; + } + } + } - - return ($self->{'TemplateObj'}); + + return ( $self->{'TemplateObj'} ); } # }}} @@ -206,6 +221,7 @@ sub Describe { # {{{ sub DESTROY sub DESTROY { my $self=shift; + $self->{'_TicketObj'} = undef; $self->{'Action'} = undef; $self->{'TemplateObj'} = undef; } diff --git a/rt/lib/RT/Scrip_Overlay.pm b/rt/lib/RT/Scrip_Overlay.pm index 06462a9ac..4f6c735cc 100644 --- a/rt/lib/RT/Scrip_Overlay.pm +++ b/rt/lib/RT/Scrip_Overlay.pm @@ -142,19 +142,24 @@ sub Create { require RT::ScripAction; my $action = new RT::ScripAction( $self->CurrentUser ); - $action->Load( $args{'ScripAction'} || '0' ); + if ($args{'ScripAction'}) { + $action->Load( $args{'ScripAction'}); + } return ( 0, $self->loc( "Action [_1] not found", $args{'ScripAction'} ) ) unless $action->Id; require RT::Template; my $template = new RT::Template( $self->CurrentUser ); - $template->Load( $args{'Template'}||'0' ); + if ($args{'Template'} ) { + $template->Load( $args{'Template'}); + } return ( 0, $self->loc('Template not found') ) unless $template->Id; require RT::ScripCondition; my $condition = new RT::ScripCondition( $self->CurrentUser ); - $condition->Load( $args{'ScripCondition'}||'0' ); - + if ($args{'ScripCondition'} ) { + $condition->Load( $args{'ScripCondition'} ); + } unless ( $condition->Id ) { return ( 0, $self->loc('Condition not found') ); } @@ -256,13 +261,16 @@ Retuns an RT::ScripCondition object with this Scrip's IsApplicable sub ConditionObj { my $self = shift; - - unless (defined $self->{'ScripConditionObj'}) { - require RT::ScripCondition; - $self->{'ScripConditionObj'} = RT::ScripCondition->new($self->CurrentUser); - $self->{'ScripConditionObj'}->Load($self->ScripCondition); + + unless ( defined $self->{'ScripConditionObj'} ) { + require RT::ScripCondition; + $self->{'ScripConditionObj'} = + RT::ScripCondition->new( $self->CurrentUser ); + if ( $self->ScripCondition ) { + $self->{'ScripConditionObj'}->Load( $self->ScripCondition ); + } } - return ($self->{'ScripConditionObj'}); + return ( $self->{'ScripConditionObj'} ); } # }}} diff --git a/rt/lib/RT/Scrips_Overlay.pm b/rt/lib/RT/Scrips_Overlay.pm index 46e31c2a8..d20148084 100644 --- a/rt/lib/RT/Scrips_Overlay.pm +++ b/rt/lib/RT/Scrips_Overlay.pm @@ -129,5 +129,80 @@ sub Next { } # }}} +sub Apply { + my ($self, %args) = @_; + + #We're really going to need a non-acled ticket for the scrips to work + my ($TicketObj, $TransactionObj); + + if ( ($TicketObj = $args{'TicketObj'}) ) { + $TicketObj->CurrentUser($self->CurrentUser); + } + else { + $TicketObj = RT::Ticket->new($self->CurrentUser); + $TicketObj->Load( $args{'Ticket'} ) + || $RT::Logger->err("$self couldn't load ticket $args{'Ticket'}\n"); + } + + if ( ($TransactionObj = $args{'TransactionObj'}) ) { + $TransactionObj->CurrentUser($self->CurrentUser); + } + else { + $TransactionObj = RT::Transaction->new($self->CurrentUser); + $TransactionObj->Load( $args{'Transaction'} ) + || $RT::Logger->err("$self couldn't load transaction $args{'Transaction'}\n"); + } + + # {{{ Deal with Scrips + + $self->LimitToQueue( $TicketObj->QueueObj->Id ) + ; #Limit it to $Ticket->QueueObj->Id + $self->LimitToGlobal() + unless $TicketObj->QueueObj->Disabled; # or to "global" + + + $self->Limit(FIELD => "Stage", VALUE => $args{'Stage'}); + + + my $ConditionsAlias = $self->NewAlias('ScripConditions'); + + $self->Join( + ALIAS1 => 'main', + FIELD1 => 'ScripCondition', + ALIAS2 => $ConditionsAlias, + FIELD2 => 'id' + ); + + #We only want things where the scrip applies to this sort of transaction + $self->Limit( + ALIAS => $ConditionsAlias, + FIELD => 'ApplicableTransTypes', + OPERATOR => 'LIKE', + VALUE => $args{'Type'}, + ENTRYAGGREGATOR => 'OR', + ) if $args{'Type'}; + + # Or where the scrip applies to any transaction + $self->Limit( + ALIAS => $ConditionsAlias, + FIELD => 'ApplicableTransTypes', + OPERATOR => 'LIKE', + VALUE => "Any", + ENTRYAGGREGATOR => 'OR', + ); + + #Iterate through each script and check it's applicability. + while ( my $Scrip = $self->Next() ) { + $Scrip->Apply (TicketObj => $TicketObj, + TransactionObj => $TransactionObj); + } + + $TicketObj->CurrentUser( $TicketObj->OriginalUser ); + $TransactionObj->CurrentUser( $TransactionObj->OriginalUser ); + + # }}} +} + + 1; diff --git a/rt/lib/RT/StyleGuide.pod b/rt/lib/RT/StyleGuide.pod new file mode 100644 index 000000000..95b2e3a15 --- /dev/null +++ b/rt/lib/RT/StyleGuide.pod @@ -0,0 +1,891 @@ +=head1 NAME + +RT::StyleGuide - RT Style Guide + +=head1 INTRODUCTION + +All code and documentation that is submitted to be included in the RT +distribution should follow the style in this document. This is not to +try to stifle your creativity, but to make life easier for everybody who +has to work with your code, and to aid those who are not quite sure how +to do something. + +These conventions below apply to perl modules, web programs, and +command-line programs, specifically, but also might apply to some +degree to any Perl code written for use in RT. + +Note that these are all guidelines, not unbreakable rules. If you have +a really good need to break one of the rules herein, however, then it is +best to ask on the B mailing list first. + +Note that with much of this document, it is not so much the Right Way as +it is Our Way. We need to have conventions in order to make life easier +for everyone. So don't gripe, and just follow it, because you didn't +get a good grade in "Plays Well With Others" in kindergarten and you +want to make up for it now. + +If you have any questions, please ask us on the B mailing list: + + http://www.bestpractical.com/rt/lists.html + +We don't always follow this guide. We are making changes throughout +our code to be in line with it. But just because we didn't do +it yet, that is no excuse. Do it anyway. :-) + +This document is subject to change at the whims of the core RT team. +We hope to add any significant changes at the bottom of the document. + + +=head1 CODING PRINCIPLES + +=head2 Perl Version + +We code everything to perl 5.6.1. Some features require advanced unicode +features in perl 5.8.0. It is acceptable that unicode features work only for +US-ASCII on perl 5.6.1. + + +=head2 Documentation + +All modules will be documented using the POD examples in the module +boilerplate. The function, purpose, use of the module will be +explained, and each public API will be documented with name, +description, inputs, outputs, side effects, etc. + +If an array or hash reference is returned, document the size of the +array (including what each element is, as appropriate) and name each key +in the hash. For complex data structures, map out the structure as +appropriate (e.g., name each field returned for each column from a DB +call; yes, this means you shouldn't use "SELECT *", which you shouldn't +use anyway). + +Also document what kind of data returned values are. Is it an integer, +a block of HTML, a boolean? + +All command-line program options will be documented using the +boilerplate code for command-line programs, which doesn't yet exist. +Each available function, switch, etc. should be documented, along +with a statement of function, purpose, use of the program. Do not +use the same options as another program, for a different purpose. + +All web templates should be documented with a statement of function, +purpose, and use in a mason comment block. + +Any external documents, and documentation for command-line programs and +modules, should be written in POD, where appropriate. From there, they +can be translated to many formats with the various pod2* translators. +Read the perlpod manpage before writing any POD, because although POD is +not difficult, it is not what most people are used to. It is not a +regular markup language; it is just a way to make easy documentation +for translating to other formats. Read, and understand, the perlpod +manpage, and ask us or someone else who knows if you have any questions. + + +=head2 Version + +Our distribution versions use tuples, where the first number is the +major revision, the second number is the version, and third +number is the subversion. Odd-numbered versions are development +versions. Examples: + + 1.0.0 First release of RT 1 + 1.0.1 Second release of RT 1.0 + 1.0.10 etc. + 1.1.0 First development release of RT 1.2 (or 2.0) + 2.0.0 First release of RT 2 + +Versions can be modified with a hyphen followed by some text, for +special versions, or to give extra information. Examples: + + 2.0.0-pre1 Notes that this is not final, but preview + +In perl 5.6.0, you can have versions like C, but this is not +allowed in previous versions of perl. So to convert a tuple version +string to a string to use with $VERSION, use a regular integer for +the revision, and three digits for version and subversion. Examples: + + 1.1.6 -> 1.001006 + 2.0.0 -> 2.000000 + +This way, perl can use the version strings in greater-than and +less-than comparisons. + + +=head2 Comments + +All code should be self-documenting as much as possible. Only include +necessary comments. Use names like "$ticket_count", so you don't need to +do something like: + + # ticket count + my $tc = 0; + +Include any comments that are, or might be, necessary in order for +someone else to understand the code. Sometimes a simple one-line +comment is good to explain what the purpose of the following code is +for. Sometimes each line needs to be commented because of a complex +algorithm. Read Kernighan & Pike's I about +commenting. Good stuff, Maynard. + + +=head2 Warnings and Strict + +All code must compile and run cleanly with "use strict" enabled and the +perl "-w" (warnings) option on. If you must do something that -w or +strict complains about, there are workarounds, but the chances that you +really need to do it that way are remote. + +=head2 Lexical Variables + +Use only lexical variables, except for special global variables +($VERSION, %ENV, @ISA, $!, etc.) or very special circumstances (see +%HTML::Mason::Commands::session ). Global variables +for regular use are never appropriate. When necessary, "declare" +globals with "use vars" or "our()". + +A lexical variable is created with my(). A global variable is +pre-existing (if it is a special variable), or it pops into existence +when it is used. local() is used to tell perl to assign a temporary +value to a variable. This should only be used with special variables, +like $/, or in special circumstances. If you must assign to any global +variable, consider whether or not you should use local(). + +local() may also be used on elements of arrays and hashes, though there +is seldom a need to do it, and you shouldn't. + + +=head2 Exporting + +Do not export anything from a module by default. Feel free to put +anything you want to in @EXPORT_OK, so users of your modules can +explicitly ask for symbols (e.g., "use Something::Something qw(getFoo +setFoo)"), but do not export them by default. + + +=head2 Pass by Reference + +Arrays and hashes should be passed to and from functions by reference +only. Note that a list and an array are NOT the same thing. This +is perfectly fine: + + return($user, $form, $constants); + +An exception might be a temporary array of discrete arguments: + + my @return = ($user, $form); + push @return, $constants if $flag; + return @return; + +Although, usually, this is better (faster, easier to read, etc.): + + if ($flag) { + return($user, $form, $constants); + } else { + return($user, $form); + } + +We need to talk about Class::ReturnValue here. + + +=head2 Garbage Collection + +Perl does pretty good garbage collection for you. It will automatically +clean up lexical variables that have gone out of scope and objects whose +references have gone away. Normally you don't need to worry about +cleaning up after yourself, if using lexicals. + +However, some glue code, code compiled in C and linked to Perl, might +not automatically clean up for you. In such cases, clean up for +yourself. If there is a method in that glue to dispose or destruct, +then use it as appropriate. + +Also, if you have a long-running function that has a large data +structure in it, it is polite to free up the memory as soon as you are +done with it, if possible. + + my $huge_data_structure = get_huge_data_structure(); + do_something_with($huge_data_structure); + undef $huge_data_structure; + +=head2 DESTROY + +All object classes must provide a DESTROY method. If it won't do +anything, provide it anyway: + + sub DESTROY { } + + + +=head2 die() and exit() + +Don't do it. Do not die() or exit() from a web template or module. Do +not call C. Don't do it. + +In command-line programs, do as you please. + + +=head2 shift and @_ + +Do not use @_. Use shift. shift may take more lines, but Jesse thinks it +leads to cleaner code. + + my $var = shift; # right + my($var) = @_; # ick. no + sub foo { uc $_[0] } # icky. sometimes ok. + + + my($var1, $var2) = (shift, shift); # Um, no. + + my $var1 = shift; # right + my $var2 = shift; + + + +=head2 Tests + +Modules should provide test code, with documentation on how to use +it. Test::Inline allows tests to be embedded in code. Test::More makes it +easy to create tests. Any code you write should have a testsuite. +Any code you alter should have a test suite. If a patch comes in without +tests, there is something wrong. + +When altering code, you must run the test harness before submitting a patch +or committing code to the repository. + +"make regression" will extract inline tests, blow away the system database +and run the test suite. + +"make regression-quiet" will do all that and not print the "ok" lines. + + + +=head2 STDIN/STDOUT + +Always report errors using $RT::Logger. It's a Log::Dispatch object. +Unlike message meant for the user, log messages are not to be +internationalized. + +There are several different levels ($RT::Logger methods) of logging: + +=over 4 + +=item debug + +Used for messages only needed during system debugging. + +=item info + +Should be used to describe "system-critical" events which aren't errors. +Examples: creating users, deleting users, creating tickets, creating queues, +sending email (message id, time, recipients), recieving mail, changing +passwords, changing access control, superuser logins) + +=item error + +Used for RT-generated failures during execution. + +=item crit + +Should be used for messages when an action can not be completed due to some +error condition beyond our control. + +=back + +In the web UI and modules, never print directly to STDERR. Do not print +directly to STDOUT, unless you need to print directly to the user's console. + +In command-line programs, feel free to print to STDERR and STDOUT as +needed for direct console communication. But for actual error reporting, +use the logging API. + + +=head2 System Calls + +Always check return values from system calls, including open(), +close(), mkdir(), or anything else that talks directly to the system. +Perl built-in system calls return the error in $!; some functions in +modules might return an error in $@ or some other way, so read the module's +documentation if you don't know. Always do something, even if it is +just calling $RT::Logger->warning(), when the return value is not what you'd expect. + + + +=head1 STYLE + +Much of the style section is taken from the perlsyle manpage. We make +some changes to it here, but it wouldn't be a bad idea to read that +document, too. + +=head2 Terminology + +=over 4 + +=item RT the name + +"RT" is the name of the project. "RT" is, optionally, the +specific name for the actual file distribution. That's it. + +While we sometimes use "RT2" or "RT3", that's shortand that's really +not recommended. The name of the project is "RT". + +To specify a major version, use "RT 3.0". +To specify a specific release, use "RT 3.0.12" + +=item function vs. sub(routine) vs. method + +Just because it is the Perl Way (not necessarily right for all +languages, but the documented terminology in the perl documentation), +"method" should be used only to refer to a subroutine that are object +methods or class methods; that is, these are functions that are used +with OOP that always take either an object or a class as the first +argument. Regular subroutines, ones that are not object or class +methods, are functions. Class methods that create and return an object +are optionally called constructors. + +=item Users + +"users" are normally users of RT, the ones hitting the site; if using +it in any other context, specify. +"system users" are user +names on the operating system. "database users" are the user names in +the database server. None of these needs to be capitalized. + +=back + + +=head2 Names + +Don't use single-character variables, except as iterator variables. + +Don't use two-character variables just to spite us over the above rule. + +Constants are in all caps; these are variables whose value will I +change during the course of the program. + + $Minimum = 10; # wrong + $MAXIMUM = 50; # right + +Other variables are lowercase, with underscores separating the words. +They words used should, in general, form a noun (usually singular), +unless the variable is a flag used to denote some action that should be +taken, in which case they should be verbs (or gerunds, as appropriate) +describing that action. + + $thisVar = 'foo'; # wrong + $this_var = 'foo'; # right + $work_hard = 1; # right, verb, boolean flag + $running_fast = 0; # right, gerund, boolean flag + +Arrays and hashes should be plural nouns, whether as regular arrays and +hashes or array and hash references. Do not name references with "ref" +or the data type in the name. + + @stories = (1, 2, 3); # right + $comment_ref = [4, 5, 6]; # wrong + $comments = [4, 5, 6]; # right + $comment = $comments->[0]; # right + +Make the name descriptive. Don't use variables like "$sc" when you +could call it "$story_count". See L<"Comments">. + +There are several variables in RT that are used throughout the code, +that you should use in your code. Do not use these variable names for +anything other than how they are normally used, and do not use any +other variable names in their place. Some of these are: + + $self # first named argument in object method + +Subroutines (except for special cases, like AUTOLOAD and simple accessors) +begin with a verb, with words following to complete the action. Accessors +don't start with "Get" if they're just the name of the attribute. + +Accessors which return an object should end with the suffix Obj. + +This section needs clarification for RT. + +Words begin with a capital letter. They +should as clearly as possible describe the activity to be peformed, and +the data to be returned. + + + + Load(); # good + LoadByName(); # good + LoadById(); # good + +Subroutines beginning with C<_> are special: they are not to be used +outside the current object. There is not to be enforced by the code +itself, but by someone very big and very scary. + +For large for() loops, do not use $_, but name the variable. +Do not use $_ (or assume it) except for when it is absolutely +clear what is going on, or when it is required (such as with +map() and grep()). + + for (@list) { + print; # OK; everyone knows this one + print uc; # wrong; few people know this + print uc $_; # better + } + +Note that the special variable C<_> I be used when possible. +It is a placeholder that can be passed to stat() and the file test +operators, that saves perl a trip to re-stat the file. In the +example below, using C<$file> over for each file test, instead of +C<_> for subsequent uses, is a performance hit. You should be +careful that the last-tested file is what you think it is, though. + + if (-d $file) { # $file is a directory + # ... + } elsif (-l _) { # $file is a symlink + # ... + } + +Package names begin with a capital letter in each word, followed by +lower case letters (for the most part). Multiple words should be StudlyCapped. + + RT::User # good + RT::Database::MySQL # proper name + RT::Display::Provider # good + RT::CustomField # not so good, but OK + +Plugin modules should begin with "RTx::", followed by the name +of the plugin. + +=head1 Code formatting + +Use perltidy. Anything we say here is wrong if it conflicts with what +perltidy does. Your perltidyrc should read: + +-lp -vt=2 -vtc=2 -nsfs -bar + +=head2 Indents and Blank Space + +All indents should be tabs. Set your tab stops whatever you want them +to be; I use 8 spaces per tabs. + +No space before a semicolon that closes a statement. + + foo(@bar) ; # wrong + foo(@bar); # right + +Line up corresponding items vertically. + + my $foo = 1; + my $bar = 2; + my $xyzzy = 3; + + open(FILE, $fh) or die $!; + open(FILE2, $fh2) or die $!; + + $rot13 =~ tr[abcedfghijklmnopqrstuvwxyz] + [nopqrstuvwxyzabcdefghijklm]; + + # note we use a-mn-z instead of a-z, + # for readability + $rot13 =~ tr[a-mn-z] + [n-za-m]; + +Put blank lines between groups of code that do different things. Put +blank lines after your variable declarations. Put a blank line before a +final return() statement. Put a blank line following a block (and +before, with the exception of comment lines). + +An example: + + # this is my function! + sub foo { + my $val = shift; + my $obj = new Constructor; + my($var1, $var2); + + $obj->SetFoo($val); + $var1 = $obj->Foo(); + + + return($val); + } + + print 1; + + +=head2 Parentheses + +For control structures, there is a space between the keyword and opening +parenthesis. For functions, there is not. + + for(@list) # wrong + for (@list) # right + + my ($ref) # wrong + my($ref) # right + +Be careful about list vs. scalar context with parentheses! + + my @array = ('a', 'b', 'c'); + my($first_element) = @array; # a + my($first_element) = ('a', 'b', 'c'); # a + my $element_count = @array; # 3 + my $last_element = ('a', 'b', 'c'); # c + +Always include parentheses after functions, even if there are no arguments. +There are some exceptions, such as list operators (like print) and unary +operators (like undef, delete, uc). + +There is no space inside the parentheses, unless it is needed for +readability. + + for ( map { [ $_, 1 ] } @list ) # OK + for ( @list ) # not really OK, not horrible + +On multi-line expressions, match up the closing parenthesis with either +the opening statement, or the opening parenthesis, whichever works best. +Examples: + + @list = qw( + bar + baz + ); # right + + if ($foo && $bar && $baz + && $buz && $xyzzy + ) { + print $foo; + } + +Whether or not there is space following a closing parenthesis is +dependent on what it is that follows. + + print foo(@bar), baz(@buz) if $xyzzy; + +Note also that parentheses around single-statement control expressions, +as in C, are optional (and discouraged) C it is I +clear -- to a programmer -- what is going on. There is absolutely no +need for parentheses around C<$xyzzy> above, so leaving them out enhances +readability. Use your best discretion. Better to include them, if +there is any question. + +The same essentially goes for perl's built-in functions, when there is +nothing confusing about what is going on (for example, there is only one +function call in the statement, or the function call is separated by a +flow control operator). User-supplied functions must always include +parentheses. + + print 1, 2, 3; # good + delete $hash{key} if isAnon($uid); # good + + +However, if there is any possible confusion at all, then include the +parentheses. Remember the words of Larry Wall in the perlstyle manpage: + + When in doubt, parenthesize. At the very least it will + let some poor schmuck bounce on the % key in vi. + + Even if you aren't in doubt, consider the mental welfare + of the person who has to maintain the code after you, and + who will probably put parens in the wrong place. + +So leave them out when it is absoutely clear to a programmer, but if +there is any question, leave them in. + + +=head2 Braces + +(This is about control braces, not hash/data structure braces.) + +There is always a space befor the opening brace. + + while (<$fh>){ # wrong + while (<$fh>) { # right + +A one-line block may be put on one line, and the semicolon may be +omitted. + + for (@list) { print } + +Otherwise, finish each statement with a semicolon, put the keyword and +opening curly on the first line, and the ending curly lined up with the +keyword at the end. + + for (@list) { + print; + smell(); + } + +Generally, we prefer "uncuddled elses": + + if ($foo) { + print; + } + else { + die; + } + +_If_ the if statement is very brief, sometimes "cuddling" the else makes code more readable. Feel free to cuddle them in that case: + + + if ($foo) { + print; + } else { + die; + } + +=head2 Operators + +Put space around most operators. The primary exception is the for +aesthetics; e.g., sometimes the space around "**" is ommitted, +and there is never a space before a ",", but always after. + + print $x , $y; # wrong + print $x, $y; # right + + $x = 2 >> 1; # good + $y = 2**2; # ok + +Note that "&&" and "||" have a higher precedence than "and" and "or". +Other than that, they are exactly the same. It is best to use the lower +precedence version for control, and the higher for testing/returning +values. Examples: + + $bool = $flag1 or $flag2; # WRONG (doesn't work) + $value = $foo || $bar; # right + open(FILE, $file) or die $!; + + $true = foo($bar) && baz($buz); + foo($bar) and baz($buz); + +Note that "and" is seldom ever used, because the statement above is +better written using "if": + + baz($buz) if foo($bar); + +Most of the time, the confusion between and/&&, or/|| can be alleviated +by using parentheses. If you want to leave off the parentheses then you +I use the proper operator. But if you use parentheses -- and +normally, you should, if there is any question at all -- then it doesn't +matter which you use. Use whichever is most readable and aesthetically +pleasing to you at the time, and be consistent within your block of code. + +Break long lines AFTER operators, except for "and", "or", "&&", "||". +Try to keep the two parts to a binary operator (an operator that +has two operands) together when possible. + + print "foo" . "bar" . "baz" + . "buz"; # wrong + + print "foo" . "bar" . "baz" . + "buz"; # right + + print $foo unless $x == 3 && $y == + 4 && $z == 5; # wrong + + print $foo unless $x == 3 && $y == 4 + && $z == 5; # right + + +=head2 Other + +Put space around a complex subscript inside the brackets or braces. + + $foo{$bar{baz}{buz}}; # OK + $foo{ $bar{baz}{buz} }; # better + +In general, use single-quotes around literals, and double-quotes +when the text needs to be interpolated. + +It is OK to omit quotes around names in braces and when using +the => operator, but be careful not to use a name that doubles as +a function; in that case, quote. + + $what{'time'}{it}{is} = time(); + +When making compound statements, put the primary action first. + + open(FILE, $fh) or die $!; # right + die $! unless open(FILE, $fh); # wrong + + print "Starting\n" if $verbose; # right + $verbose && print "Starting\n"; # wrong + + +Use here-docs instead of repeated print statements. + + print <Foo! + +All newlines should be removed from localized strings, to make it easy to +grep the codebase for strings to be localized + +The string Foo + Bar + Baz + +Should become <&|/l&>Foo Bar Baz + + +Variable subsititutions should be moved to Locale::MakeText format + +The string Hello, <%$name %> + +should become <&|/l, $name &>Hello, [_1] + + +Multiple variables work just like single variables + +The string You found <%$num%> tickets in queue <%$queue%> + +should become <&|/l, $num, $queue &>You found [_1] tickets in queue [_2] + +When subcomponents are called in the middle of a phrase, they need to be escaped +too: + +The string  <& /Elements/SelectNewTicketQueue&> + +should become <&|/l, $m->scomp('/Elements/SelectNewTicketQueue')&> [_1] + + + + +The string <& /Elements/TitleBoxStart, width=> "40%", titleright => "RT $RT::VERSION for $RT::rtname", title => 'Login' &> + +should become <& /Elements/TitleBoxStart, + width=> "40%", + titleright => loc("RT [_1] for [_2]",$RT::VERSION, $RT::rtname), + title => loc('Login'), + &> + + +=item Library code + + + +Within RT's core code, every module has a localization handle available through the 'loc' method: + +The code return ( $id, "Queue created" ); + +should become return ( $id, $self->loc("Queue created") ); + +When returning or localizing a single string, the "extra" set of parenthesis () should be omitted. + +The code return ("Subject changed to ". $self->Data ); + +should become return $self->loc( "Subject changed to [_1]", $self->Data ); + + +It is important not to localize the names of rights or statuses within RT's core, as there is logic that depends on them as string identifiers. The proper place to localize these values is when they're presented for display in the web or commandline interfaces. + + +=back 4 + +=head1 CODING PRCEDURE + +This is for new programs, modules, specific APIs, or anything else. + +Contact for core team is the slashcode-development mailing list. + +=over 4 + +=item Present idea to core team + +We may know of a better way to approach the problem, or know of an +existing way to deal with it, or know someone else is working on it. +This is mostly informal, but a fairly complete explanation for the need +and use of the code should be provided. + + +=item Present complete specs to core team + +The complete proposed API to the core team should be submitted for +approval and discussion. For web and command-line programs, present the +functionality and interface (op codes, command-lin switches, etc.). + +The best way to do this is to take the documentation portion of the +boilerplate and fill it in. You can make changes later if necessary, +but fill it in as much as you can. + + +=item Announce any changes to interface + +If the way it works or how it is called is going to change, notify the core +team. + + +=item Prepare for core review + +When you are done, the code will undergo a code review by a member of +the core team, or someone picked by the core team. This is not to +belittle you (that's just a nice side effect), it is to make sure that +you understand your code, that we understand your code, that it won't +break other code, that it follows the documentation and existing +proposal. It is to check for possible optimizations or better ways of +doing it. + +For members of the core team, one or more other members of the team will +perform the review. + +Note that all code is expected to follow the coding principles and style +guide contained in this document. + + +=item Finish it up + +After the code is done (possibly going through multiple code reviews), +if you do not have repository access, submit it to rt--bugs@fsck.com as a unified diff. From that point on, it'll be handled by someone with repository access. + +=back + + +=head1 BUG REPORTS, PATCHES + +Use rt--bugs@fsck.com for I bug that is not +being fixed immediately. If it is not in RT, there +is a good chance it will not be dealt with. + +Send patches to rt--bugs@fsck.com, too. Use C for patches. + + + +=head1 TO DO + +Talk about DBIx::SearchBuilder + +Talk about mason + component style + cascading style sheets + +Talk about adding a new translation + +Talk more about logging + +=head1 CHANGES + + Adapted from Slash Styleguide by jesse - 20 Dec, 2002 + + +=head1 VERSION + +0.1 diff --git a/rt/lib/RT/Template_Overlay.pm b/rt/lib/RT/Template_Overlay.pm index 0b5e67d0f..5950aa3ea 100644 --- a/rt/lib/RT/Template_Overlay.pm +++ b/rt/lib/RT/Template_Overlay.pm @@ -203,10 +203,11 @@ sub LoadQueueTemplate { my $self = shift; my %args = ( Queue => undef, - Name => undef + Name => undef, + @_ ); - return ( $self->LoadByCols( Name => $args{'Name'}, Queue => {'Queue'} ) ); + return ( $self->LoadByCols( Name => $args{'Name'}, Queue => $args{'Queue'} ) ); } @@ -318,24 +319,30 @@ sub Parse { my $parser = MIME::Parser->new(); # Setup output directory for files. from RT::EmailParser::_SetupMIMEParser - if (my $AttachmentDir = eval { File::Temp::tempdir( TMPDIR => 1, CLEANUP => 1 ) }) { - # Set up output directory for files: - $parser->output_dir("$AttachmentDir"); + if ( my $AttachmentDir = + eval { File::Temp::tempdir( TMPDIR => 1, CLEANUP => 1 ) } ) + { + + # Set up output directory for files: + $parser->output_dir("$AttachmentDir"); } else { - # On some situations TMPDIR is non-writable. sad but true. - $parser->output_to_core(1); - $parser->tmp_to_core(1); + $RT::Logger->error("Couldn't write attachments to temp dir on disk. using more memory and processor."); + # On some situations TMPDIR is non-writable. sad but true. + $parser->output_to_core(1); + $parser->tmp_to_core(1); } + #If someone includes a message, don't extract it $parser->extract_nested_messages(1); + # Set up the prefix for files with auto-generated names: $parser->output_prefix("part"); + # If content length is <= 50000 bytes, store each msg as in-core scalar; # Else, write to a disk file (the default action): $parser->output_to_core(50000); - ### Should we forgive normally-fatal errors? $parser->ignore_errors(1); $self->{'MIMEObj'} = eval { $parser->parse_data($content) }; @@ -350,7 +357,6 @@ sub Parse { $self->{'MIMEObj'}->head->unfold(); return ( 1, $self->loc("Template parsed") ); - } @@ -369,12 +375,13 @@ sub _ParseContent { @_ ); - + no warnings 'redefine'; $T::Ticket = $args{'TicketObj'}; $T::Transaction = $args{'TransactionObj'}; $T::Argument = $args{'Argument'}; $T::Requestor = eval { $T::Ticket->Requestors->UserMembersObj->First->Name }; $T::rtname = $RT::rtname; + *T::loc = sub { $T::Ticket->loc(@_) }; # We need to untaint the content of the template, since we'll be working # with it diff --git a/rt/lib/RT/Ticket_Overlay.pm b/rt/lib/RT/Ticket_Overlay.pm index c88bbc90f..981df4125 100644 --- a/rt/lib/RT/Ticket_Overlay.pm +++ b/rt/lib/RT/Ticket_Overlay.pm @@ -305,6 +305,7 @@ sub Create { my $self = shift; my %args = ( id => undef, + EffectiveId => undef, Queue => undef, Requestor => undef, Cc => undef, @@ -314,6 +315,7 @@ sub Create { Subject => '', InitialPriority => undef, FinalPriority => undef, + Priority => undef, Status => 'new', TimeWorked => "0", TimeLeft => 0, @@ -378,6 +380,11 @@ sub Create { $args{'FinalPriority'} = ( $QueueObj->FinalPriority || 0 ) unless ( defined $args{'FinalPriority'} ); + # Priority may have changed from InitialPriority, for the case + # where we're importing tickets (eg, from an older RT version.) + my $priority = $args{'Priority'} || $args{'InitialPriority'}; + + # {{{ Dates #TODO we should see what sort of due date we're getting, rather + # than assuming it's in ISO format. @@ -473,7 +480,7 @@ sub Create { next unless (defined $args{$type}); foreach my $watcher ( ref( $args{$type} ) ? @{ $args{$type} } : ( $args{$type} ) ) { my $user = RT::User->new($RT::SystemUser); - $user->LoadOrCreateByEmail($watcher) if ($watcher !~ /^\d+$/); + $user->LoadOrCreateByEmail($watcher) if ($watcher && $watcher !~ /^\d+$/); } } @@ -485,7 +492,7 @@ sub Create { Subject => $args{'Subject'}, InitialPriority => $args{'InitialPriority'}, FinalPriority => $args{'FinalPriority'}, - Priority => $args{'InitialPriority'}, + Priority => $priority, Status => $args{'Status'}, TimeWorked => $args{'TimeWorked'}, TimeEstimated => $args{'TimeEstimated'}, @@ -515,7 +522,7 @@ sub Create { } #Set the ticket's effective ID now that we've created it. - my ( $val, $msg ) = $self->__Set( Field => 'EffectiveId', Value => $id ); + my ( $val, $msg ) = $self->__Set( Field => 'EffectiveId', Value => ($args{'EffectiveId'} || $id ) ); unless ($val) { $RT::Logger->crit("$self ->Create couldn't set EffectiveId: $msg\n"); @@ -546,6 +553,9 @@ sub Create { next unless (defined $args{$type}); foreach my $watcher ( ref( $args{$type} ) ? @{ $args{$type} } : ( $args{$type} ) ) { + # If there is an empty entry in the list, let's get out of here. + next unless $watcher; + # we reason that all-digits number must be a principal id, not email # this is the only way to can add my $field = 'Email'; @@ -601,7 +611,7 @@ sub Create { my $cfid = $1; foreach my $value ( ref( $args{$arg} ) ? @{ $args{$arg} } : ( $args{$arg} ) ) { - next unless ($value); + next unless (length($value)); $self->_AddCustomFieldValue( Field => $cfid, Value => $value, RecordTransaction => 0 @@ -832,8 +842,8 @@ AddRequestor: jesse\@example.com EOF my $ticket = RT::Ticket->new($RT::SystemUser); -$ticket->Create(Subject => 'first', Queue => 'general'); -ok($ticket->Id, "Created the test ticket"); +my ($id,$msg) =$ticket->Create(Subject => 'first', Queue => 'general'); +ok($ticket->Id, "Created the test ticket - ".$id ." - ".$msg); $ticket->UpdateFrom822($simple_update); is($ticket->Subject, 'target', "changed the subject"); my $jesse = RT::User->new($RT::SystemUser); @@ -970,7 +980,7 @@ sub UpdateFrom822 { # If we've been given a number of delresses to del, do it. foreach my $address (@{$ticketargs{'Del'.$type}}) { - my ($id, $msg) = $self->DelWatcher( Type => $type, Email => $address); + my ($id, $msg) = $self->DeleteWatcher( Type => $type, Email => $address); push (@results, $msg) ; } @@ -2228,9 +2238,11 @@ sub Comment { # The "NotifyOtherRecipients" scripAction will look for RT--Send-Cc: and # RT-Send-Bcc: headers - $args{'MIMEObj'}->head->add( 'RT-Send-Cc', $args{'CcMessageTo'} ) + $args{'MIMEObj'}->head->add( 'RT-Send-Cc', + RT::User::CanonicalizeEmailAddress(undef, $args{'CcMessageTo'}) ) if defined $args{'CcMessageTo'}; - $args{'MIMEObj'}->head->add( 'RT-Send-Bcc', $args{'BccMessageTo'} ) + $args{'MIMEObj'}->head->add( 'RT-Send-Bcc', + RT::User::CanonicalizeEmailAddress(undef, $args{'BccMessageTo'}) ) if defined $args{'BccMessageTo'}; #Record the correspondence (write the transaction) @@ -2296,9 +2308,11 @@ sub Correspond { # The "NotifyOtherRecipients" scripAction will look for RT-Send-Cc: and RT-Send-Bcc: # headers - $args{'MIMEObj'}->head->add( 'RT-Send-Cc', $args{'CcMessageTo'} ) + $args{'MIMEObj'}->head->add( 'RT-Send-Cc', + RT::User::CanonicalizeEmailAddress(undef, $args{'CcMessageTo'}) ) if defined $args{'CcMessageTo'}; - $args{'MIMEObj'}->head->add( 'RT-Send-Bcc', $args{'BccMessageTo'} ) + $args{'MIMEObj'}->head->add( 'RT-Send-Bcc', + RT::User::CanonicalizeEmailAddress(undef, $args{'BccMessageTo'}) ) if defined $args{'BccMessageTo'}; #Record the correspondence (write the transaction) @@ -2894,9 +2908,6 @@ sub MergeInto { } - #make a new link: this ticket is merged into that other ticket. - $self->AddLink( Type => 'MergedInto', Target => $NewTicket->Id()); - #add all of this ticket's watchers to that ticket. my $requestors = $self->Requestors->MembersObj; while (my $watcher = $requestors->Next) { @@ -2936,6 +2947,9 @@ sub MergeInto { ); } + #make a new link: this ticket is merged into that other ticket. + $self->AddLink( Type => 'MergedInto', Target => $NewTicket->Id()); + $NewTicket->_SetLastUpdated; return ( 1, $self->loc("Merge Successful") ); @@ -3266,8 +3280,14 @@ sub SetStatus { } #Check ACL - unless ( $self->CurrentUserHasRight('ModifyTicket') ) { - return ( 0, $self->loc('Permission Denied') ); + if ( $args{Status} eq 'deleted') { + unless ($self->CurrentUserHasRight('DeleteTicket')) { + return ( 0, $self->loc('Permission Denied') ); + } + } else { + unless ($self->CurrentUserHasRight('ModifyTicket')) { + return ( 0, $self->loc('Permission Denied') ); + } } if (!$args{Force} && ($args{'Status'} eq 'resolved') && $self->HasUnresolvedDependencies) { @@ -3440,6 +3460,7 @@ sub CustomFieldValues { my $cf_values = RT::TicketCustomFieldValues->new( $self->CurrentUser ); $cf_values->LimitToCustomField($cf->id); $cf_values->LimitToTicket($self->Id()); + $cf_values->OrderBy( FIELD => 'id' ); # @values is a CustomFieldValues object; return ($cf_values); @@ -3451,7 +3472,7 @@ sub CustomFieldValues { =item AddCustomFieldValue { Field => FIELD, Value => VALUE } -VALUE can either be a CustomFieldValue object or a string. +VALUE should be a string. FIELD can be a CustomField object OR a CustomField ID. @@ -3798,11 +3819,45 @@ sub _NewTransaction { if ( defined $args{'TimeTaken'} ) { $self->_UpdateTimeTaken( $args{'TimeTaken'} ); } + if ( $RT::UseTransactionBatch and $transaction ) { + push @{$self->{_TransactionBatch}}, $trans; + } return ( $transaction, $msg, $trans ); } # }}} +=head2 TransactionBatch + + Returns an array reference of all transactions created on this ticket during + this ticket object's lifetime, or undef if there were none. + + Only works when the $RT::UseTransactionBatch config variable is set to true. + +=cut + +sub TransactionBatch { + my $self = shift; + return $self->{_TransactionBatch}; +} + +sub DESTROY { + my $self = shift; + + # The following line eliminates reentrancy. + # It protects against the fact that perl doesn't deal gracefully + # when an object's refcount is changed in its destructor. + return if $self->{_Destroyed}++; + + my $batch = $self->TransactionBatch or return; + require RT::Scrips; + RT::Scrips->new($RT::SystemUser)->Apply( + Stage => 'TransactionBatch', + TicketObj => $self, + TransactionObj => $batch->[0], + ); +} + # }}} # {{{ PRIVATE UTILITY METHODS. Mostly needed so Ticket can be a DBIx::Record diff --git a/rt/lib/RT/Tickets_Overlay.pm b/rt/lib/RT/Tickets_Overlay.pm index d8a1ac803..55777b0fb 100644 --- a/rt/lib/RT/Tickets_Overlay.pm +++ b/rt/lib/RT/Tickets_Overlay.pm @@ -84,7 +84,7 @@ my %FIELDS = RefersTo => ['LINK' => To => 'RefersTo',], HasMember => ['LINK' => From => 'MemberOf',], DependentOn => ['LINK' => From => 'DependsOn',], - ReferredTo => ['LINK' => From => 'RefersTo',], + ReferredToBy => ['LINK' => From => 'RefersTo',], # HasDepender => ['LINK',], # RelatedTo => ['LINK',], Told => ['DATE' => 'Told',], @@ -122,14 +122,23 @@ my %dispatch = LINKFIELD => \&_LinkFieldLimit, CUSTOMFIELD => \&_CustomFieldLimit, ); +my %can_bundle = + ( WATCHERFIELD => "yeps", + ); # Default EntryAggregator per type +# if you specify OP, you must specify all valid OPs my %DefaultEA = ( INT => 'AND', ENUM => { '=' => 'OR', '!='=> 'AND' }, - DATE => 'AND', + DATE => { '=' => 'OR', + '>='=> 'AND', + '<='=> 'AND', + '>' => 'AND', + '<' => 'AND' + }, STRING => { '=' => 'OR', '!='=> 'AND', 'LIKE'=> 'AND', @@ -137,6 +146,7 @@ my %DefaultEA = ( }, TRANSFIELD => 'AND', TRANSDATE => 'AND', + LINK => 'OR', LINKFIELD => 'AND', TARGET => 'AND', BASE => 'AND', @@ -154,6 +164,7 @@ my %DefaultEA = ( # into Tickets_Overlay_SQL. sub FIELDS { return \%FIELDS } sub dispatch { return \%dispatch } +sub can_bundle { return \%can_bundle } # Bring in the clowns. require RT::Tickets_Overlay_SQL; @@ -345,7 +356,7 @@ sub _DateLimit { my ($sb,$field,$op,$value,@rest) = @_; die "Invalid Date Op: $op" - unless $op =~ /^(=|!=|>|<|>=|<=)$/; + unless $op =~ /^(=|>|<|>=|<=)$/; my $meta = $FIELDS{$field}; die "Incorrect Meta Data for $field" @@ -354,18 +365,52 @@ sub _DateLimit { require Time::ParseDate; use POSIX 'strftime'; + # FIXME: Replace me with RT::Date( Type => 'unknown' ...) my $time = Time::ParseDate::parsedate( $value, UK => $RT::DateDayBeforeMonth, PREFER_PAST => $RT::AmbiguousDayInPast, - PREFER_FUTURE => !($RT::AmbiguousDayInPast)); - $value = strftime("%Y-%m-%d %H:%M",localtime($time)); + PREFER_FUTURE => !($RT::AmbiguousDayInPast), + FUZZY => 1 + ); - $sb->_SQLLimit( - FIELD => $meta->[1], - OPERATOR => $op, - VALUE => $value, - @rest, - ); + if ($op eq "=") { + # if we're specifying =, that means we want everything on a + # particular single day. in the database, we need to check for > + # and < the edges of that day. + + my $daystart = strftime("%Y-%m-%d %H:%M", + gmtime($time - ( $time % 86400 ))); + my $dayend = strftime("%Y-%m-%d %H:%M", + gmtime($time + ( 86399 - $time % 86400 ))); + + $sb-> _OpenParen; + + $sb->_SQLLimit( + FIELD => $meta->[1], + OPERATOR => ">=", + VALUE => $daystart, + @rest, + ); + + $sb->_SQLLimit( + FIELD => $meta->[1], + OPERATOR => "<=", + VALUE => $dayend, + @rest, + ENTRYAGGREGATOR => 'AND', + ); + + $sb-> _CloseParen; + + } else { + $value = strftime("%Y-%m-%d %H:%M", gmtime($time)); + $sb->_SQLLimit( + FIELD => $meta->[1], + OPERATOR => $op, + VALUE => $value, + @rest, + ); + } } =head2 _StringLimit @@ -425,8 +470,8 @@ sub _TransDateLimit { ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'Ticket'); my $d = new RT::Date( $sb->CurrentUser ); - $d->Set($value); - $value = $d->ISO; + $d->Set( Format => 'ISO', Value => $value); + $value = $d->ISO; #Search for the right field $sb->_SQLLimit(ALIAS => $sb->{_sql_trattachalias}, @@ -528,9 +573,7 @@ sub _WatcherLimit { $self->_OpenParen; my $groups = $self->NewAlias('Groups'); - my $group_princs = $self->NewAlias('Principals'); my $groupmembers = $self->NewAlias('CachedGroupMembers'); - my $member_princs = $self->NewAlias('Principals'); my $users = $self->NewAlias('Users'); @@ -542,14 +585,29 @@ sub _WatcherLimit { # $aggregator = 'AND'; # } - - $self->_SQLLimit(ALIAS => $users, - FIELD => $rest{SUBKEY} || 'EmailAddress', - VALUE => $value, - OPERATOR => $op, - CASESENSITIVE => 0, - @rest, - ); + if (ref $field) { # gross hack + my @bundle = @$field; + $self->_OpenParen; + for my $chunk (@bundle) { + ($field,$op,$value,@rest) = @$chunk; + $self->_SQLLimit(ALIAS => $users, + FIELD => $rest{SUBKEY} || 'EmailAddress', + VALUE => $value, + OPERATOR => $op, + CASESENSITIVE => 0, + @rest, + ); + } + $self->_CloseParen; + } else { + $self->_SQLLimit(ALIAS => $users, + FIELD => $rest{SUBKEY} || 'EmailAddress', + VALUE => $value, + OPERATOR => $op, + CASESENSITIVE => 0, + @rest, + ); + } # {{{ Tie to groups for tickets we care about $self->_SQLLimit(ALIAS => $groups, @@ -573,17 +631,9 @@ sub _WatcherLimit { } $self->Join (ALIAS1 => $groups, FIELD1 => 'id', - ALIAS2 => $group_princs, FIELD2 => 'ObjectId'); - $self->_SQLLimit(ALIAS => $group_princs, - FIELD => 'PrincipalType', - VALUE => 'Group', - ENTRYAGGREGATOR => 'AND'); - $self->Join( ALIAS1 => $group_princs, FIELD1 => 'id', ALIAS2 => $groupmembers, FIELD2 => 'GroupId'); $self->Join( ALIAS1 => $groupmembers, FIELD1 => 'MemberId', - ALIAS2 => $member_princs, FIELD2 => 'id'); - $self->Join (ALIAS1 => $member_princs, FIELD1 => 'ObjectId', ALIAS2 => $users, FIELD2 => 'id'); $self->_CloseParen; @@ -679,6 +729,7 @@ sub _CustomFieldLimit { $CF->LimitToQueue( $q->Id ); $queue = $q->Id; } else { + $field = $1 if $field =~ /^{(.+)}$/; # trim { } $CF->LimitToGlobal; } $CF->FindAllRows; @@ -700,11 +751,19 @@ sub _CustomFieldLimit { my $null_columns_ok; - my $TicketCFs = $self->Join( TYPE => 'left', - ALIAS1 => 'main', - FIELD1 => 'id', - TABLE2 => 'TicketCustomFieldValues', - FIELD2 => 'Ticket' ); + + my $TicketCFs; + # Perform one Join per CustomField + if ($self->{_sql_keywordalias}{$cfid}) { + $TicketCFs = $self->{_sql_keywordalias}{$cfid}; + } else { + $TicketCFs = $self->{_sql_keywordalias}{$cfid} = + $self->Join( TYPE => 'left', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'TicketCustomFieldValues', + FIELD2 => 'Ticket' ); + } $self->_OpenParen; @@ -1373,11 +1432,18 @@ sub LimitLinkedFrom { TYPE => undef, @_); + # translate RT2 From/To naming to RT3 TicketSQL naming + my %fromToMap = qw(DependsOn DependentOn + MemberOf HasMember + RefersTo ReferredToBy); + + my $type = $args{'TYPE'}; + $type = $fromToMap{$type} if exists($fromToMap{$type}); $self->Limit( FIELD => 'LinkedTo', TARGET => undef, BASE => ($args{'BASE'} || $args{'TICKET'}), - TYPE => $args{'TYPE'}, + TYPE => $type, DESCRIPTION => $self->loc( "Tickets [_1] [_2]", $self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}) ), @@ -1581,11 +1647,12 @@ Takes a paramhash of key/value pairs with the following keys: =over 4 -=item KEYWORDSELECT - KeywordSelect id +=item CUSTOMFIELD - CustomField name or id. If a name is passed, an additional +parameter QUEUE may also be passed to distinguish the custom field. -=item OPERATOR - (for KEYWORD only - KEYWORDSELECT operator is always `=') +=item OPERATOR - The usual Limit operators -=item KEYWORD - Keyword id +=item VALUE - The value to compare against =back @@ -1603,7 +1670,13 @@ sub LimitCustomField { use RT::CustomFields; my $CF = RT::CustomField->new( $self->CurrentUser ); - $CF->Load( $args{CUSTOMFIELD} ); + if ( $args{CUSTOMFIELD} =~ /^\d+$/) { + $CF->Load( $args{CUSTOMFIELD} ); + } + else { + $CF->LoadByNameAndQueue( Name => $args{CUSTOMFIELD}, Queue => $args{QUEUE} ); + $args{CUSTOMFIELD} = $CF->Id; + } #If we are looking to compare with a null value. if ( $args{'OPERATOR'} =~ /^is$/i ) { @@ -1618,10 +1691,6 @@ sub LimitCustomField { $args{'DESCRIPTION'} ||= $self->loc("Custom field [_1] [_2] [_3]", $CF->Name , $args{OPERATOR} , $args{VALUE}); } -# my $index = $self->_NextIndex; -# %{ $self->{'TicketRestrictions'}{$index} } = %args; - - my $q = ""; if ($CF->Queue) { my $qo = new RT::Queue( $self->CurrentUser ); @@ -1629,6 +1698,10 @@ sub LimitCustomField { $q = $qo->Name; } + my @rest; + @rest = ( ENTRYAGGREGATOR => 'AND' ) + if ($CF->Type eq 'SelectMultiple'); + $self->Limit( VALUE => $args{VALUE}, FIELD => "CF.".( $q ? $q . ".{" . $CF->Name . "}" @@ -1636,11 +1709,11 @@ sub LimitCustomField { ), OPERATOR => $args{OPERATOR}, CUSTOMFIELD => 1, + @rest, ); $self->{'RecalcTicketLimits'} = 1; - # return ($index); } # }}} @@ -1924,12 +1997,19 @@ sub _RestrictionsToClauses { # defined $restriction->{'TARGET'} ? # $restriction->{TARGET} ) - my $ea = $DefaultEA{$type}; + my $ea = $restriction->{ENTRYAGGREGATOR} || $DefaultEA{$type} || "AND"; if ( ref $ea ) { die "Invalid operator $op for $field ($type)" unless exists $ea->{$op}; $ea = $ea->{$op}; } + + # Each CustomField should be put into a different Clause so they + # are ANDed together. + if ($restriction->{CUSTOMFIELD}) { + $realfield = $field; + } + exists $clause{$realfield} or $clause{$realfield} = []; # Escape Quotes $field =~ s!(['"])!\\$1!g; @@ -1963,6 +2043,11 @@ sub _ProcessRestrictions { #a new search delete $self->{'TicketAliases'}; delete $self->{'items_array'}; + delete $self->{'item_map'}; + delete $self->{'raw_rows'}; + delete $self->{'rows'}; + delete $self->{'count_all'}; + my $sql = $self->{_sql_query}; # Violating the _SQL namespace if (!$sql||$self->{'RecalcTicketLimits'}) { # "Restrictions to Clauses Branch\n"; @@ -1995,12 +2080,12 @@ sub _BuildItemMap { delete $self->{'item_map'}; if ($items->[0]) { - $self->{'item_map'}->{'first'} = $items->[0]->Id; + $self->{'item_map'}->{'first'} = $items->[0]->EffectiveId; while (my $item = shift @$items ) { - my $id = $item->Id; + my $id = $item->EffectiveId; $self->{'item_map'}->{$id}->{'defined'} = 1; $self->{'item_map'}->{$id}->{prev} = $prev; - $self->{'item_map'}->{$id}->{next} = $items->[0]->Id if ($items->[0]); + $self->{'item_map'}->{$id}->{next} = $items->[0]->EffectiveId if ($items->[0]); $prev = $id; } $self->{'item_map'}->{'last'} = $prev; diff --git a/rt/lib/RT/Tickets_Overlay_SQL.pm b/rt/lib/RT/Tickets_Overlay_SQL.pm index d78a56db3..629e6da2d 100644 --- a/rt/lib/RT/Tickets_Overlay_SQL.pm +++ b/rt/lib/RT/Tickets_Overlay_SQL.pm @@ -29,6 +29,10 @@ use warnings; my %FIELDS = %{FIELDS()}; my %dispatch = %{dispatch()}; +my %can_bundle = %{can_bundle()}; + +# Lower Case version of FIELDS, for case insensitivity +my %lcfields = map { ( lc($_) => $_ ) } (keys %FIELDS); sub _InitSQL { my $self = shift; @@ -119,20 +123,57 @@ my $re_keyword = qr[$RE{delimited}{-delim=>qq{\'\"}}|(?:\{|\}|\w|\.)+]; my $re_op = qr[=|!=|>=|<=|>|<|(?i:IS NOT)|(?i:IS)|(?i:NOT LIKE)|(?i:LIKE)]; # long to short my $re_paren = qr'\(|\)'; +sub _close_bundle +{ + my ($self, @bundle) = @_; + return unless @bundle; + if (@bundle == 1) { + $bundle[0]->{dispatch}->( + $self, + $bundle[0]->{key}, + $bundle[0]->{op}, + $bundle[0]->{val}, + SUBCLAUSE => "", + ENTRYAGGREGATOR => $bundle[0]->{ea}, + SUBKEY => $bundle[0]->{subkey}, + ); + } else { + my @args; + for my $chunk (@bundle) { + push @args, [ + $chunk->{key}, + $chunk->{op}, + $chunk->{val}, + SUBCLAUSE => "", + ENTRYAGGREGATOR => $chunk->{ea}, + SUBKEY => $chunk->{subkey}, + ]; + } + $bundle[0]->{dispatch}->( + $self, \@args, + ); + } +} + sub _parser { my ($self,$string) = @_; my $want = KEYWORD | PAREN; my $last = undef; my $depth = 0; + my @bundle; my ($ea,$key,$op,$value) = ("","","",""); + # order of matches in the RE is important.. op should come early, + # because it has spaces in it. otherwise "NOT LIKE" might be parsed + # as a keyword or value. + while ($string =~ /( $re_aggreg + |$re_op |$re_keyword |$re_value - |$re_op |$re_paren )/igx ) { my $val = $1; @@ -156,10 +197,12 @@ sub _parser { # Parens are highest priority if ($current & PAREN) { if ($val eq "(") { + $self->_close_bundle(@bundle); @bundle = (); $depth++; $self->_OpenParen; } else { + $self->_close_bundle(@bundle); @bundle = (); $depth--; $self->_CloseParen; } @@ -204,10 +247,9 @@ sub _parser { } my $class; - my ($stdkey) = grep { /^$key$/i } (keys %FIELDS); - if ($stdkey && exists $FIELDS{$stdkey}) { + if (exists $lcfields{lc $key}) { + $key = $lcfields{lc $key}; $class = $FIELDS{$key}->[0]; - $key = $stdkey; } # no longer have a default, since CF's are now a real class, not fallthrough # fixme: "default class" is not Generic. @@ -219,20 +261,37 @@ sub _parser { die "No such dispatch method: $class" unless exists $dispatch{$class}; my $sub = $dispatch{$class} || die;; - $sub->( - $self, - $key, - $op, - $val, - SUBCLAUSE => "", # don't need anymore - ENTRYAGGREGATOR => $ea || "", - SUBKEY => $subkey, - ); + if ($can_bundle{$class} && + (!@bundle || + ($bundle[-1]->{dispatch} == $sub && + $bundle[-1]->{key} eq $key && + $bundle[-1]->{subkey} eq $subkey))) + { + push @bundle, { + dispatch => $sub, + key => $key, + op => $op, + val => $val, + ea => $ea || "", + subkey => $subkey, + }; + } else { + $self->_close_bundle(@bundle); @bundle = (); + $sub->( + $self, + $key, + $op, + $val, + SUBCLAUSE => "", # don't need anymore + ENTRYAGGREGATOR => $ea || "", + SUBKEY => $subkey, + ); + } $self->{_sql_looking_at}{lc $key} = 1; - + ($ea,$key,$op,$value) = ("","","",""); - + $want = PAREN | AGGREG; } else { die "I'm lost"; @@ -241,6 +300,8 @@ sub _parser { $last = $current; } # while + $self->_close_bundle(@bundle); @bundle = (); + die "Incomplete query" unless (($want | PAREN) || ($want | KEYWORD)); @@ -330,6 +391,10 @@ sub FromSQL { VALUE => 'ticket'); } + # We never ever want to show deleted tickets + $self->SUPER::Limit(FIELD => 'Status' , OPERATOR => '!=', VALUE => 'deleted'); + + # set SB's dirty flag $self->{'must_redo_search'} = 1; $self->{'RecalcTicketLimits'} = 0; diff --git a/rt/lib/RT/Transaction_Overlay.pm b/rt/lib/RT/Transaction_Overlay.pm index 54bb326a9..9c9a2fd14 100644 --- a/rt/lib/RT/Transaction_Overlay.pm +++ b/rt/lib/RT/Transaction_Overlay.pm @@ -51,6 +51,8 @@ ok(require RT::Transaction); use strict; no warnings qw(redefine); +use vars qw( %_BriefDescriptions ); + use RT::Attachments; # {{{ sub Create @@ -112,66 +114,13 @@ sub Create { #Provide a way to turn off scrips if we need to if ( $args{'ActivateScrips'} ) { - - #We're really going to need a non-acled ticket for the scrips to work - my $TicketAsSystem = RT::Ticket->new($RT::SystemUser); - $TicketAsSystem->Load( $args{'Ticket'} ) - || $RT::Logger->err("$self couldn't load ticket $args{'Ticket'}\n"); - - my $TransAsSystem = RT::Transaction->new($RT::SystemUser); - $TransAsSystem->Load( $self->id ) - || $RT::Logger->err( - "$self couldn't load a copy of itself as superuser\n"); - # {{{ Deal with Scrips - - use RT::Scrips; - my $PossibleScrips = RT::Scrips->new($RT::SystemUser); - - $PossibleScrips->LimitToQueue( $TicketAsSystem->QueueObj->Id ) - ; #Limit it to $Ticket->QueueObj->Id - $PossibleScrips->LimitToGlobal() - unless $TicketAsSystem->QueueObj->Disabled; # or to "global" - - - $PossibleScrips->Limit(FIELD => "Stage", VALUE => "TransactionCreate"); - - - my $ConditionsAlias = $PossibleScrips->NewAlias('ScripConditions'); - - $PossibleScrips->Join( - ALIAS1 => 'main', - FIELD1 => 'ScripCondition', - ALIAS2 => $ConditionsAlias, - FIELD2 => 'id' + require RT::Scrips; + RT::Scrips->new($RT::SystemUser)->Apply( + Stage => 'TransactionCreate', + Type => $args{'Type'}, + Ticket => $args{'Ticket'}, + Transaction => $self->id, ); - - #We only want things where the scrip applies to this sort of transaction - $PossibleScrips->Limit( - ALIAS => $ConditionsAlias, - FIELD => 'ApplicableTransTypes', - OPERATOR => 'LIKE', - VALUE => $args{'Type'}, - ENTRYAGGREGATOR => 'OR', - ); - - # Or where the scrip applies to any transaction - $PossibleScrips->Limit( - ALIAS => $ConditionsAlias, - FIELD => 'ApplicableTransTypes', - OPERATOR => 'LIKE', - VALUE => "Any", - ENTRYAGGREGATOR => 'OR', - ); - - #Iterate through each script and check it's applicability. - - while ( my $Scrip = $PossibleScrips->Next() ) { - $Scrip->Apply (TicketObj => $TicketAsSystem, - TransactionObj => $TransAsSystem); - } - - # }}} - } return ( $id, $self->loc("Transaction Created") ); @@ -535,16 +484,24 @@ sub BriefDescription { return ( $self->loc( "[_1] changed from [_2] to [_3]", $self->Field , ( $self->OldValue || $no_value ) , $self->NewValue )); } - if ( $type eq 'Correspond' ) { - return $self->loc("Correspondence added"); - } - - elsif ( $type eq 'Comment' ) { - return $self->loc("Comments added"); + if (my $code = $_BriefDescriptions{$type}) { + return $code->($self); } - elsif ( $type eq 'CustomField' ) { + return $self->loc( "Default: [_1]/[_2] changed from [_3] to [_4]", $type, $self->Field, $self->OldValue, $self->NewValue ); +} +%_BriefDescriptions = ( + Correspond => sub { + my $self = shift; + return $self->loc("Correspondence added"); + }, + Comment => sub { + my $self = shift; + return $self->loc("Comments added"); + }, + CustomField => sub { + my $self = shift; my $field = $self->loc('CustomField'); if ( $self->Field ) { @@ -563,110 +520,127 @@ sub BriefDescription { else { return $self->loc("[_1] [_2] changed to [_3]", $field, $self->OldValue, $self->NewValue ); } - } - - elsif ( $type eq 'Untake' ) { + }, + Untake => sub { + my $self = shift; return $self->loc("Untaken"); - } - - elsif ( $type eq "Take" ) { + }, + Take => sub { + my $self = shift; return $self->loc("Taken"); - } - - elsif ( $type eq "Force" ) { + }, + Force => sub { + my $self = shift; my $Old = RT::User->new( $self->CurrentUser ); $Old->Load( $self->OldValue ); my $New = RT::User->new( $self->CurrentUser ); $New->Load( $self->NewValue ); return $self->loc("Owner forcibly changed from [_1] to [_2]" , $Old->Name , $New->Name); - } - elsif ( $type eq "Steal" ) { + }, + Steal => sub { + my $self = shift; my $Old = RT::User->new( $self->CurrentUser ); $Old->Load( $self->OldValue ); return $self->loc("Stolen from [_1] ", $Old->Name); - } - - elsif ( $type eq "Give" ) { + }, + Give => sub { + my $self = shift; my $New = RT::User->new( $self->CurrentUser ); $New->Load( $self->NewValue ); return $self->loc( "Given to [_1]", $New->Name ); - } - - elsif ( $type eq 'AddWatcher' ) { + }, + AddWatcher => sub { + my $self = shift; my $principal = RT::Principal->new($self->CurrentUser); $principal->Load($self->NewValue); return $self->loc( "[_1] [_2] added", $self->Field, $principal->Object->Name); - } - - elsif ( $type eq 'DelWatcher' ) { + }, + DelWatcher => sub { + my $self = shift; my $principal = RT::Principal->new($self->CurrentUser); $principal->Load($self->OldValue); return $self->loc( "[_1] [_2] deleted", $self->Field, $principal->Object->Name); - } - - elsif ( $type eq 'Subject' ) { + }, + Subject => sub { + my $self = shift; return $self->loc( "Subject changed to [_1]", $self->Data ); - } + }, + AddLink => sub { + my $self = shift; + my $value; + if ( $self->NewValue ) { + my $URI = RT::URI->new( $self->CurrentUser ); + $URI->FromURI( $self->NewValue ); + if ( $URI->Resolver ) { + $value = $URI->Resolver->AsString; + } + else { + $value = $self->NewValue; + } + if ( $self->Field eq 'DependsOn' ) { + return $self->loc( "Dependency on [_1] added", $value ); + } + elsif ( $self->Field eq 'DependedOnBy' ) { + return $self->loc( "Dependency by [_1] added", $value ); - elsif ( $type eq 'AddLink' ) { + } + elsif ( $self->Field eq 'RefersTo' ) { + return $self->loc( "Reference to [_1] added", $value ); + } + elsif ( $self->Field eq 'ReferredToBy' ) { + return $self->loc( "Reference by [_1] added", $value ); + } + elsif ( $self->Field eq 'MemberOf' ) { + return $self->loc( "Membership in [_1] added", $value ); + } + elsif ( $self->Field eq 'HasMember' ) { + return $self->loc( "Member [_1] added", $value ); + } + } + else { + return ( $self->Data ); + } + }, + DeleteLink => sub { + my $self = shift; my $value; - if ($self->NewValue) { - my $URI = RT::URI->new($self->CurrentUser); - $URI->FromURI($self->NewValue); - if ($URI->Resolver) { - $value = $URI->Resolver->AsString; - } else { - $value = $self->NewValue; - } - } - if ($self->Field eq 'DependsOn') { - return $self->loc("Dependency on [_1] added",$value); - } elsif ($self->Field eq 'DependedOnBy') { - return $self->loc("Dependency by [_1] added",$value); - - } elsif ($self->Field eq 'RefersTo') { - return $self->loc("Reference to [_1] added",$value); - } elsif ($self->Field eq 'ReferredToBy') { - return $self->loc("Reference by [_1] added",$value); - } elsif ($self->Field eq 'MemberOf') { - return $self->loc("Membership in [_1] added",$value); - } elsif ($self->Field eq 'HasMember') { - return $self->loc("Member [_1] added",$value); - } else { - return ( $self->Data ); - } - } - elsif ( $type eq 'DeleteLink' ) { - my $value; - if ($self->OldValue) { - my $URI = RT::URI->new($self->CurrentUser); - $URI->FromURI($self->OldValue); - if ($URI->Resolver) { - $value = $URI->Resolver->AsString; - } else { - $value = $self->OldValue; - } - } - - if ($self->Field eq 'DependsOn') { - return $self->loc("Dependency on [_1] deleted",$value); - } elsif ($self->Field eq 'DependedOnBy') { - return $self->loc("Dependency by [_1] deleted",$value); - - } elsif ($self->Field eq 'RefersTo') { - return $self->loc("Reference to [_1] deleted",$value); - } elsif ($self->Field eq 'ReferredToBy') { - return $self->loc("Reference by [_1] deleted",$value); - } elsif ($self->Field eq 'MemberOf') { - return $self->loc("Membership in [_1] deleted",$value); - } elsif ($self->Field eq 'HasMember') { - return $self->loc("Member [_1] deleted",$value); - } else { - return ( $self->Data ); - } - } - elsif ( $type eq 'Set' ) { + if ( $self->OldValue ) { + my $URI = RT::URI->new( $self->CurrentUser ); + $URI->FromURI( $self->OldValue ); + if ( $URI->Resolver ) { + $value = $URI->Resolver->AsString; + } + else { + $value = $self->OldValue; + } + + if ( $self->Field eq 'DependsOn' ) { + return $self->loc( "Dependency on [_1] deleted", $value ); + } + elsif ( $self->Field eq 'DependedOnBy' ) { + return $self->loc( "Dependency by [_1] deleted", $value ); + + } + elsif ( $self->Field eq 'RefersTo' ) { + return $self->loc( "Reference to [_1] deleted", $value ); + } + elsif ( $self->Field eq 'ReferredToBy' ) { + return $self->loc( "Reference by [_1] deleted", $value ); + } + elsif ( $self->Field eq 'MemberOf' ) { + return $self->loc( "Membership in [_1] deleted", $value ); + } + elsif ( $self->Field eq 'HasMember' ) { + return $self->loc( "Member [_1] deleted", $value ); + } + } + else { + return ( $self->Data ); + } + }, + Set => sub { + my $self = shift; if ( $self->Field eq 'Queue' ) { my $q1 = new RT::Queue( $self->CurrentUser ); $q1->Load( $self->OldValue ); @@ -676,25 +650,22 @@ sub BriefDescription { } # Write the date/time change at local time: - elsif ($self->Field =~ /Due|Starts|Started|Told/) { - my $t1 = new RT::Date($self->CurrentUser); - $t1->Set(Format => 'ISO', Value => $self->NewValue); - my $t2 = new RT::Date($self->CurrentUser); - $t2->Set(Format => 'ISO', Value => $self->OldValue); - return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, $t2->AsString, $t1->AsString ); - } + elsif ($self->Field =~ /Due|Starts|Started|Told/) { + my $t1 = new RT::Date($self->CurrentUser); + $t1->Set(Format => 'ISO', Value => $self->NewValue); + my $t2 = new RT::Date($self->CurrentUser); + $t2->Set(Format => 'ISO', Value => $self->OldValue); + return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, $t2->AsString, $t1->AsString ); + } else { return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, $self->OldValue, $self->NewValue ); } - } - elsif ( $type eq 'PurgeTransaction' ) { + }, + PurgeTransaction => sub { + my $self = shift; return $self->loc("Transaction [_1] purged", $self->Data); - } - else { - return $self->loc( "Default: [_1]/[_2] changed from [_3] to [_4]", $type, $self->Field, $self->OldValue, $self->NewValue ); - - } -} + }, +); # }}} @@ -814,4 +785,12 @@ sub CurrentUserHasRight { # }}} +# Transactions don't change. by adding this cache congif directiove, we don't lose pathalogically on long tickets. +sub _CacheConfig { + { + 'cache_p' => 1, + 'fast_update_p' => 1, + 'cache_for_sec' => 180, + } +} 1; diff --git a/rt/lib/RT/URI.pm b/rt/lib/RT/URI.pm index 7acc1dc98..337a356aa 100644 --- a/rt/lib/RT/URI.pm +++ b/rt/lib/RT/URI.pm @@ -91,8 +91,10 @@ sub FromObject { =head2 FromURI -Returns a local object id for this content. You are expected to know what sort of object this is the Id -of +Returns a local object id for this content. You are expected to know +what sort of object this is the Id of + +Returns true if everything is ok, otherwise false =cut @@ -119,9 +121,12 @@ sub FromURI { unless ($self->Resolver->ParseURI($uri)) { $RT::Logger->warning("Resolver ".ref($self->Resolver)." could not parse $uri"); + $self->{resolver} = undef; # clear resolver return (undef); } +return(1); + } # }}} diff --git a/rt/lib/RT/URI/fsck_com_rt.pm b/rt/lib/RT/URI/fsck_com_rt.pm index 36e8f82fd..4035776ef 100644 --- a/rt/lib/RT/URI/fsck_com_rt.pm +++ b/rt/lib/RT/URI/fsck_com_rt.pm @@ -133,7 +133,7 @@ sub ParseURI { if ( $self->IsLocal) { my $local_uri_prefix = $self->LocalURIPrefix; - if ($self->{'uri'} =~ /^$local_uri_prefix(\d+)$/) { + if ($self->{'uri'} =~ /^$local_uri_prefix(\d+)$/i) { my $id = $1; @@ -170,7 +170,7 @@ Returns undef otherwise. sub IsLocal { my $self = shift; my $local_uri_prefix = $self->LocalURIPrefix; - if ($self->{'uri'} =~ /^$local_uri_prefix/) { + if ($self->{'uri'} =~ /^$local_uri_prefix/i) { return 1; } else { @@ -214,7 +214,7 @@ Otherwise, return its URI sub HREF { my $self = shift; - if ($self->IsLocal) { + if ($self->IsLocal && $self->Object) { return ( $RT::WebURL . "Ticket/Display.html?id=".$self->Object->Id); } else { @@ -230,12 +230,11 @@ Returns either a localized string 'ticket #23' or the full URI if the object is sub AsString { my $self = shift; - if ($self->IsLocal) { - return $self->loc("ticket #[_1]", $self->Object->Id); - + if ($self->IsLocal && $self->Object) { + return $self->loc("ticket #[_1]", $self->Object->Id); } else { - return $self->Object->URI; + return $self->URI; } } diff --git a/rt/lib/RT/User_Overlay.pm b/rt/lib/RT/User_Overlay.pm index e828ebd71..ba322cd4b 100644 --- a/rt/lib/RT/User_Overlay.pm +++ b/rt/lib/RT/User_Overlay.pm @@ -203,14 +203,16 @@ sub Create { @_ # get the real argumentlist ); - - $args{'EmailAddress'} = $self->CanonicalizeEmailAddress($args{'EmailAddress'}); - #Check the ACL unless ( $self->CurrentUser->HasRight(Right => 'AdminUsers', Object => $RT::System) ) { return ( 0, $self->loc('No permission to create users') ); } + $args{'EmailAddress'} = $self->CanonicalizeEmailAddress($args{'EmailAddress'}); + # if the user doesn't have a name defined, set it to the email address + $args{'Name'} = $args{'EmailAddress'} unless ($args{'Name'}); + + # Privileged is no longer a column in users my $privileged = $args{'Privileged'}; @@ -234,7 +236,9 @@ sub Create { #TODO Specify some sensible defaults. - unless ( defined( $args{'Name'} ) ) { + unless ( $args{'Name'} ) { + use Data::Dumper; + $RT::Logger->crit(Dumper \%args); return ( 0, $self->loc("Must specify 'Name' attribute") ); } @@ -274,6 +278,7 @@ sub Create { #If the create failed. unless ($id) { + $RT::Handle->Rollback(); $RT::Logger->error("Could not create a new user - " .join('-'. %args)); return ( 0, $self->loc('Could not create user') ); @@ -729,7 +734,7 @@ sub ResetPassword { my $template = RT::Template->new( $self->CurrentUser ); - if ( $self->IsPrivileged ) { + if ( $self->Privileged ) { $template->LoadGlobalTemplate('RT_PasswordChange_Privileged'); } else { @@ -929,7 +934,7 @@ sub GenerateRandomPassword { my $length = $min_length + int( rand( $max_length - $min_length ) ); - my $char = $self->GenerateRandomNextChar( $total_sum, $start_freq ); + my $char = $self->_GenerateRandomNextChar( $total_sum, $start_freq ); my @word = ( $char + $a ); for ( 2 .. $length ) { $char = diff --git a/rt/lib/RT/Users_Overlay.pm b/rt/lib/RT/Users_Overlay.pm index b397c3bc4..430e6d720 100644 --- a/rt/lib/RT/Users_Overlay.pm +++ b/rt/lib/RT/Users_Overlay.pm @@ -1,20 +1,19 @@ # BEGIN LICENSE BLOCK # -# Copyright (c) 1996-2002 Jesse Vincent +# Copyright (c) 1996-2003 Jesse Vincent # # (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed -# from www.gnu.org +# from www.gnu.org. # # This work 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. # -# # Unless otherwise specified, all modifications, corrections or # extensions to this work which alter its source code become the # property of Best Practical Solutions, LLC when submitted for @@ -77,6 +76,20 @@ sub _Init { # }}} +=head2 PrincipalsAlias + +Returns the string that represents this Users object's primary "Principals" alias. + + +=cut + +sub PrincipalsAlias { + my $self = shift; + return($self->{'princalias'}); + +} + + # {{{ sub _DoSearch =head2 _DoSearch @@ -233,8 +246,15 @@ sub WhoHaveRight { push @privgroups, $Group->Id(); } + + if (@privgroups) { $self->WhoBelongToGroups(Groups => \@privgroups, IncludeSubgroupMembers => $args{'IncludeSubgroupMembers'}); + } + else { + # We don't have any group that matches -- make it impossible. + $self->Limit( FIELD => 'Id', VALUE => 'IS', OPERATOR => 'NULL' ); + } } # }}} diff --git a/rt/lib/t/02regression.t b/rt/lib/t/02regression.t index 62b4e9a69..4504cc76a 100644 --- a/rt/lib/t/02regression.t +++ b/rt/lib/t/02regression.t @@ -40,5 +40,5 @@ sub wanted_autogen { /^autogen.*\.t\z/s && require $_; } File::Find::find({wanted => \&wanted_regression}, 'lib/t/regression'); sub wanted_regression { /^*\.t\z/s && require $_; } -require "lib/t/03web.pl"; -require "lib/t/04_send_email.pl"; +require "/opt/rt3/lib/t/03web.pl"; +require "/opt/rt3/lib/t/04_send_email.pl"; diff --git a/rt/lib/t/02regression.t.in b/rt/lib/t/02regression.t.in index 51cd7e378..8c050ff5b 100644 --- a/rt/lib/t/02regression.t.in +++ b/rt/lib/t/02regression.t.in @@ -40,5 +40,5 @@ sub wanted_autogen { /^autogen.*\.t\z/s && require $_; } File::Find::find({wanted => \&wanted_regression}, 'lib/t/regression'); sub wanted_regression { /^*\.t\z/s && require $_; } -require "lib/t/03web.pl"; -require "lib/t/04_send_email.pl"; +require "@RT_LIB_PATH@/t/03web.pl"; +require "@RT_LIB_PATH@/t/04_send_email.pl"; diff --git a/rt/lib/t/03web.pl b/rt/lib/t/03web.pl index 4500ff281..94ad3e97e 100644 --- a/rt/lib/t/03web.pl +++ b/rt/lib/t/03web.pl @@ -5,6 +5,7 @@ use WWW::Mechanize; use HTTP::Request::Common; use HTTP::Cookies; use LWP; +use Encode; my $cookie_jar = HTTP::Cookies->new; my $agent = WWW::Mechanize->new(); @@ -15,7 +16,7 @@ $agent->cookie_jar($cookie_jar); # get the top page -my $url = "http://localhost/"; +my $url = "http://localhost".$RT::WebPath."/"; $agent->get($url); is ($agent->{'status'}, 200, "Loaded a page"); @@ -37,6 +38,37 @@ is($agent->{'status'}, 200, "Fetched the page ok"); ok( $agent->{'content'} =~ /Logout/i, "Found a logout link"); + +$agent->get($url."Ticket/Create.html?Queue=1"); +is ($agent->{'status'}, 200, "Loaded Create.html"); +$agent->form(3); +# Start with a string containing characters in latin1 +my $string = "I18N Web Testing æøå"; +Encode::from_to($string, 'iso-8859-1', 'utf8'); +$agent->field('Subject' => "Foo"); +$agent->field('Content' => $string); +ok($agent->submit(), "Created new ticket with $string"); + +ok( $agent->{'content'} =~ qr{$string} , "Found the content"); + +$agent->get($url."Ticket/Create.html?Queue=1"); +is ($agent->{'status'}, 200, "Loaded Create.html"); +$agent->form(3); +# Start with a string containing characters in latin1 +my $string = "I18N Web Testing æøå"; +Encode::from_to($string, 'iso-8859-1', 'utf8'); +$agent->field('Subject' => $string); +$agent->field('Content' => "BAR"); +ok($agent->submit(), "Created new ticket with $string"); + +ok( $agent->{'content'} =~ qr{$string} , "Found the content"); + + + +# }}} + + + use File::Find; find ( \&wanted , 'html/'); diff --git a/rt/lib/t/03web.pl.in b/rt/lib/t/03web.pl.in index abe446eeb..4fe2d3ef3 100644 --- a/rt/lib/t/03web.pl.in +++ b/rt/lib/t/03web.pl.in @@ -5,6 +5,7 @@ use WWW::Mechanize; use HTTP::Request::Common; use HTTP::Cookies; use LWP; +use Encode; my $cookie_jar = HTTP::Cookies->new; my $agent = WWW::Mechanize->new(); @@ -15,7 +16,7 @@ $agent->cookie_jar($cookie_jar); # get the top page -my $url = "http://localhost/"; +my $url = "http://localhost".$RT::WebPath."/"; $agent->get($url); is ($agent->{'status'}, 200, "Loaded a page"); @@ -37,6 +38,37 @@ is($agent->{'status'}, 200, "Fetched the page ok"); ok( $agent->{'content'} =~ /Logout/i, "Found a logout link"); + +$agent->get($url."Ticket/Create.html?Queue=1"); +is ($agent->{'status'}, 200, "Loaded Create.html"); +$agent->form(3); +# Start with a string containing characters in latin1 +my $string = "I18N Web Testing æøå"; +Encode::from_to($string, 'iso-8859-1', 'utf8'); +$agent->field('Subject' => "Foo"); +$agent->field('Content' => $string); +ok($agent->submit(), "Created new ticket with $string"); + +ok( $agent->{'content'} =~ qr{$string} , "Found the content"); + +$agent->get($url."Ticket/Create.html?Queue=1"); +is ($agent->{'status'}, 200, "Loaded Create.html"); +$agent->form(3); +# Start with a string containing characters in latin1 +my $string = "I18N Web Testing æøå"; +Encode::from_to($string, 'iso-8859-1', 'utf8'); +$agent->field('Subject' => $string); +$agent->field('Content' => "BAR"); +ok($agent->submit(), "Created new ticket with $string"); + +ok( $agent->{'content'} =~ qr{$string} , "Found the content"); + + + +# }}} + + + use File::Find; find ( \&wanted , 'html/'); diff --git a/rt/lib/t/04_send_email.pl b/rt/lib/t/04_send_email.pl index 46e3d7472..c384eedfa 100644 --- a/rt/lib/t/04_send_email.pl +++ b/rt/lib/t/04_send_email.pl @@ -33,6 +33,32 @@ sub RT::Action::SendEmail::SendMessage { # create a regular ticket my $parser = RT::EmailParser->new(); + + +# Let's test to make sure a multipart/report is processed correctly +my $content = `cat /opt/rt3/lib/t/data/multipart-report` || die "couldn't find new content"; +# be as much like the mail gateway as possible. +use RT::Interface::Email; + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); + +ok ($tick->Transactions->First->Content =~ /The original message was received/, "It's the bounce"); + + +# make sure it fires scrips. +is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); + +undef @scrips_fired; + + + + $parser->ParseMIMEEntityFromScalar('From: root@localhost To: rt@example.com Subject: This is a test of new ticket creation as an unknown user @@ -65,7 +91,7 @@ is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); # create an iso 8859-1 ticket @scrips_fired = (); -my $content = `cat ./lib/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; @@ -74,8 +100,9 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. use RT::Interface::Email; - - RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -103,17 +130,21 @@ $parser->ParseMIMEEntityFromScalar($content); ok ($id, $msg); + + + # we need to swap out SendMessage to test the new things we care about; &iso8859_redef_sendmessage; $RT::EmailOutputEncoding = 'iso-8859-1'; # create an iso 8859-1 ticket @scrips_fired = (); -my $content = `cat ./lib/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; # be as much like the mail gateway as possible. use RT::Interface::Email; - RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -202,7 +233,7 @@ sub iso8859_redef_sendmessage { # {{{ test a multipart alternative containing a text-html part with an umlaut -my $content = `cat ./lib/t/data/multipart-alternative-with-umlaut` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/multipart-alternative-with-umlaut` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); @@ -210,7 +241,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. ¨auts_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -229,7 +261,7 @@ sub umlauts_redef_sendmessage { # {{{ test a text-html message with an umlaut -my $content = `cat ./lib/t/data/text-html-with-umlaut` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/text-html-with-umlaut` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); @@ -237,7 +269,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_html_umlauts_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -266,7 +299,7 @@ sub text_html_umlauts_redef_sendmessage { # {{{ test a text-html message with russian characters -my $content = `cat ./lib/t/data/text-html-in-russian` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/text-html-in-russian` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); @@ -274,7 +307,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_html_russian_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -308,14 +342,15 @@ sub text_html_russian_redef_sendmessage { unshift (@RT::EmailInputEncodings, 'koi8-r'); $RT::EmailOutputEncoding = 'koi8-r'; -my $content = `cat ./lib/t/data/russian-subject-no-content-type` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/russian-subject-no-content-type` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_plain_russian_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -346,7 +381,7 @@ $RT::EmailOutputEncoding = 'utf-8'; # {{{ test a message containing a nested RFC 822 message -my $content = `cat ./lib/t/data/nested-rfc-822` || die "couldn't find new content"; +my $content = `cat /opt/rt3/lib/t/data/nested-rfc-822` || die "couldn't find new content"; ok ($content, "Loaded nested-rfc-822 to test"); $parser->ParseMIMEEntityFromScalar($content); @@ -354,7 +389,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_plain_nested_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -382,7 +418,63 @@ sub text_plain_nested_redef_sendmessage { # }}} +# {{{ test a multipart alternative containing a uuencoded mesage generated by lotus notes + +my $content = `cat /opt/rt3/lib/t/data/notes-uuencoded` || die "couldn't find new content"; + +$parser->ParseMIMEEntityFromScalar($content); + + +# be as much like the mail gateway as possible. +¬es_redef_sendmessage; + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); + +ok ($tick->Transactions->First->Content =~ /from Lotus Notes/, "We recorded the content right"); +is ($tick->Transactions->First->Attachments->Count , 3 , "Has three attachments"); + +sub notes_redef_sendmessage { + no warnings qw/redefine/; + eval 'sub RT::Action::SendEmail::SendMessage { }'; +} + +# }}} + +# {{{ test a multipart that crashes the file-based mime-parser works + +my $content = `cat /opt/rt3/lib/t/data/crashes-file-based-parser` || die "couldn't find new content"; + +$parser->ParseMIMEEntityFromScalar($content); + + +# be as much like the mail gateway as possible. +&crashes_redef_sendmessage; + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); + +ok ($tick->Transactions->First->Content =~ /FYI/, "We recorded the content right"); +is ($tick->Transactions->First->Attachments->Count , 5 , "Has three attachments"); + +sub crashes_redef_sendmessage { + no warnings qw/redefine/; + eval 'sub RT::Action::SendEmail::SendMessage { }'; +} + + +# }}} # Don't taint the environment $everyone->PrincipalObj->RevokeRight(Right =>'SuperUser'); diff --git a/rt/lib/t/04_send_email.pl.in b/rt/lib/t/04_send_email.pl.in index e171cdc9b..2bdf4c5a6 100644 --- a/rt/lib/t/04_send_email.pl.in +++ b/rt/lib/t/04_send_email.pl.in @@ -33,6 +33,32 @@ sub RT::Action::SendEmail::SendMessage { # create a regular ticket my $parser = RT::EmailParser->new(); + + +# Let's test to make sure a multipart/report is processed correctly +my $content = `cat @RT_LIB_PATH@/t/data/multipart-report` || die "couldn't find new content"; +# be as much like the mail gateway as possible. +use RT::Interface::Email; + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); + +ok ($tick->Transactions->First->Content =~ /The original message was received/, "It's the bounce"); + + +# make sure it fires scrips. +is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); + +undef @scrips_fired; + + + + $parser->ParseMIMEEntityFromScalar('From: root@localhost To: rt@example.com Subject: This is a test of new ticket creation as an unknown user @@ -65,7 +91,7 @@ is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); # create an iso 8859-1 ticket @scrips_fired = (); -my $content = `cat ./lib/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; @@ -74,8 +100,9 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. use RT::Interface::Email; - - RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -103,17 +130,21 @@ $parser->ParseMIMEEntityFromScalar($content); ok ($id, $msg); + + + # we need to swap out SendMessage to test the new things we care about; &iso8859_redef_sendmessage; $RT::EmailOutputEncoding = 'iso-8859-1'; # create an iso 8859-1 ticket @scrips_fired = (); -my $content = `cat ./lib/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; # be as much like the mail gateway as possible. use RT::Interface::Email; - RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -202,7 +233,7 @@ sub iso8859_redef_sendmessage { # {{{ test a multipart alternative containing a text-html part with an umlaut -my $content = `cat ./lib/t/data/multipart-alternative-with-umlaut` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/multipart-alternative-with-umlaut` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); @@ -210,7 +241,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. ¨auts_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -229,7 +261,7 @@ sub umlauts_redef_sendmessage { # {{{ test a text-html message with an umlaut -my $content = `cat ./lib/t/data/text-html-with-umlaut` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/text-html-with-umlaut` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); @@ -237,7 +269,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_html_umlauts_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -266,7 +299,7 @@ sub text_html_umlauts_redef_sendmessage { # {{{ test a text-html message with russian characters -my $content = `cat ./lib/t/data/text-html-in-russian` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/text-html-in-russian` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); @@ -274,7 +307,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_html_russian_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -308,14 +342,15 @@ sub text_html_russian_redef_sendmessage { unshift (@RT::EmailInputEncodings, 'koi8-r'); $RT::EmailOutputEncoding = 'koi8-r'; -my $content = `cat ./lib/t/data/russian-subject-no-content-type` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/russian-subject-no-content-type` || die "couldn't find new content"; $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_plain_russian_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -346,7 +381,7 @@ $RT::EmailOutputEncoding = 'utf-8'; # {{{ test a message containing a nested RFC 822 message -my $content = `cat ./lib/t/data/nested-rfc-822` || die "couldn't find new content"; +my $content = `cat @RT_LIB_PATH@/t/data/nested-rfc-822` || die "couldn't find new content"; ok ($content, "Loaded nested-rfc-822 to test"); $parser->ParseMIMEEntityFromScalar($content); @@ -354,7 +389,8 @@ $parser->ParseMIMEEntityFromScalar($content); # be as much like the mail gateway as possible. &text_plain_nested_redef_sendmessage; -RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond'); +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); my $tickets = RT::Tickets->new($RT::SystemUser); $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); $tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); @@ -382,7 +418,63 @@ sub text_plain_nested_redef_sendmessage { # }}} +# {{{ test a multipart alternative containing a uuencoded mesage generated by lotus notes + +my $content = `cat @RT_LIB_PATH@/t/data/notes-uuencoded` || die "couldn't find new content"; + +$parser->ParseMIMEEntityFromScalar($content); + + +# be as much like the mail gateway as possible. +¬es_redef_sendmessage; + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); + +ok ($tick->Transactions->First->Content =~ /from Lotus Notes/, "We recorded the content right"); +is ($tick->Transactions->First->Attachments->Count , 3 , "Has three attachments"); + +sub notes_redef_sendmessage { + no warnings qw/redefine/; + eval 'sub RT::Action::SendEmail::SendMessage { }'; +} + +# }}} + +# {{{ test a multipart that crashes the file-based mime-parser works + +my $content = `cat @RT_LIB_PATH@/t/data/crashes-file-based-parser` || die "couldn't find new content"; + +$parser->ParseMIMEEntityFromScalar($content); + + +# be as much like the mail gateway as possible. +&crashes_redef_sendmessage; + +my %args = (message => $content, queue => 1, action => 'correspond'); + RT::Interface::Email::Gateway(\%args); +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); + +ok ($tick->Transactions->First->Content =~ /FYI/, "We recorded the content right"); +is ($tick->Transactions->First->Attachments->Count , 5 , "Has three attachments"); + +sub crashes_redef_sendmessage { + no warnings qw/redefine/; + eval 'sub RT::Action::SendEmail::SendMessage { }'; +} + + +# }}} # Don't taint the environment $everyone->PrincipalObj->RevokeRight(Right =>'SuperUser'); diff --git a/rt/lib/t/data/crashes-file-based-parser b/rt/lib/t/data/crashes-file-based-parser new file mode 100644 index 000000000..da1913eb9 --- /dev/null +++ b/rt/lib/t/data/crashes-file-based-parser @@ -0,0 +1,193 @@ +X-Real-To: +Received: from [194.87.5.31] (HELO sinbin.d-s.example.com) + by cgp.example.com (CommuniGate Pro SMTP 4.0.6/D4) + with ESMTP-TLS id 125035761 for mitya@example.com; Thu, 11 Dec 2003 15:17:46 +0300 +Received: (from daemon@localhost) + by sinbin.d-s.example.com (8.12.9p1/8.11.6) id hBBCHjN0031595 + for mitya@example.com; Thu, 11 Dec 2003 15:17:45 +0300 (MSK) + (envelope-from noc@rt3.mx.example.com) +Received: from d-s.example.com by sinbin.d-s.example.com with ESMTP id hBBCHjar031575; + (8.12.9p2/D) Thu, 11 Dec 2003 15:17:45 +0300 (MSK) +X-Real-To: +Sender: (Network Operation Center) +To: mitya@example.com +Date: Thu, 11 Dec 2003 15:17:45 +0300 +Message-ID: +X-Original-Return-Path: +Received: from [194.87.0.16] (HELO mail.d-s.example.com) + by d-s.example.com (CommuniGate Pro SMTP 4.1.5/D1) + with ESMTP id 120757484 for noc@rt3.mx.example.com; Mon, 27 Oct 2003 09:40:53 +0300 +Received: from [194.87.0.22] (HELO moscvax.d-s.example.com) + by mail.d-s.example.com (CommuniGate Pro SMTP 4.1.5/D) + with ESMTP-TLS id 107945800 for noc@rt3.mx.example.com; Mon, 27 Oct 2003 09:40:53 +0300 +Received: from d-s.example.com (mx.d-s.example.com [194.87.0.32]) + by moscvax.d-s.example.com (8.12.9/8.12.9) with ESMTP id h9R6erFm062621 + for ; Mon, 27 Oct 2003 09:40:53 +0300 (MSK) + (envelope-from vox19@b92.d-s.example.com) +Received: by d-s.example.com (CommuniGate Pro PIPE 4.1.5/D1) + with PIPE id 120757490; Mon, 27 Oct 2003 09:40:53 +0300 +Received: from [194.87.2.108] (HELO b92.d-s.example.com) + by d-s.example.com (CommuniGate Pro SMTP 4.1.5/D1) + with ESMTP-TLS id 120757480 for security@d.example.com; Mon, 27 Oct 2003 09:40:52 +0300 +Received: from b92.d-s.example.com (localhost [127.0.0.1]) + by b92.d-s.example.com (8.12.8p1/8.12.3) with ESMTP id h9R6eqIe014669 + for ; Mon, 27 Oct 2003 09:40:52 +0300 (MSK) + (envelope-from vox19@b92.d-s.example.com) +Received: from localhost (localhost [[UNIX: localhost]]) + by b92.d-s.example.com (8.12.8p1/8.12.3/Submit) id h9R6epst014668 + for security@d.example.com; Mon, 27 Oct 2003 09:40:51 +0300 (MSK) +From: "Stanislav" +Subject: Fwd: scanning my ports +X-Original-Date: Mon, 27 Oct 2003 10:40:51 +0400 +User-Agent: KMail/1.5.4 +X-Original-To: security@d.example.com +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; + boundary="Boundary-00=_z3Ln/tUeUBipHgx" +X-Original-Message-Id: <200310270940.51758.vox19@d.example.com> +X-Spam-Checker-Version: SpamAssassin 2.60-jumbo.demos (1.212-2003-09-23-exp) +X-Spam-Level: +X-Spam-Status: No, hits=-6.8 required=5.0 tests=BAYES_00,FROM_ENDS_IN_NUMS, + HTML_MESSAGE,SUBJECT_RT autolearn=ham version=2.60-jumbo.demos +X-Spam-Report: -6.8 points, 5.0 required; + * -3.0 SUBJECT_RT Tracking system + * 1.0 FROM_ENDS_IN_NUMS From: ends in numbers + * 0.1 HTML_MESSAGE BODY: HTML included in message + * -4.9 BAYES_00 BODY: Bayesian spam probability is 0 to 1% + * [score: 0.0000] + + +--Boundary-00=_z3Ln/tUeUBipHgx +Content-Type: text/plain; + charset="koi8-r" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + + +FYI + + +---------- Forwarded Message ---------- + +Subject: [DEMOS #12148] scanning my ports +Date: Sunday 26 October 2003 20:19 +From: 1stwizard@isp.example.com +To: no-reply@d-r.example.com + +This transaction appears to have no content + +------------------------------------------------------- + + + +-- +best wishes, + +Stanislav A. Mushkat +http://www.di.example.com + +--Boundary-00=_z3Ln/tUeUBipHgx +Content-Type: text/plain; + charset="iso-8859-1"; + name=" " +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + +Somebody at IP 127.0.0.1 scanned my ports. +--Boundary-00=_z3Ln/tUeUBipHgx +Content-Type: text/html; + charset="iso-8859-1"; + name=" " +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + + + + + + + + + + + + +
    +
    Somebody at IP 127.0.0.1 scanned my ports.
    +
     
    +
     
    + + + + + +
    +--Boundary-00=_z3Ln/tUeUBipHgx +Content-Type: image/jpeg; + charset="iso-8859-1"; + name="BackGrnd.jpg" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="BackGrnd.jpg" + +/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFk +b2JlAGTAAAAAAQMAEAMCAwYAAAHbAAAC1gAABZX/2wCEABALCwsMCxAMDBAX +Dw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoXHh4jJSclIx4vLzMzLy9AQEBAQEBA +QEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoaJjAjHh4eHiMw +Ky4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIAGUAcwMBIgACEQED +EQH/xACAAAEBAQEAAAAAAAAAAAAAAAAAAQIGAQEBAAAAAAAAAAAAAAAAAAAA +ARABAAICAwEAAgMAAAAAAAAAAQARIQIxQRIiQDIQMFARAAICAgIBBAIDAQEA +AAAAAAERACExQVFhcYGRobECEsHhMtHxEgEAAAAAAAAAAAAAAAAAAABQ/9oA +DAMBAAIRAxEAAADtRZYE1ASghQFgUZoCkKSwLmhcllAEqkSkqFAlhUomoAS3 +IoJqFlDNpFEAQFE1AIVYAWIVKAJRNZpYCwVmmshKACA0CBAUCBYGwf/aAAgB +AgABBQD8B/yP/9oACAEDAAEFAPz6/or8H//aAAgBAQABBQC2+ZeHjbD+saX6 +hwXeDW1Rg4xLLTa+m7ZiIEsI1MTiHP1dYpvFADiFM1/X6nq9byuwdPPz5oFo +fWlEMQ9ULKrWq2ppG9Y2J6INQma9lVTRdlUKgHzXXSEECw1SYu5WsGoJPkis +ZYpx31GvXZQ/JM3VwShzVTsp1EZbBI8LcaUSih86+s2Zl4Wp6+lAZnVsDkjd +ku5m+lJTdXDG2SHM9M2wKX1YxsaZTTwmoVrYnqsMrM652yjs01K0mtbGAz6Y +5dpfqNz06qpq5QNjiIjiZtbhtceNuf0jyeqGgu6rXMvI4omPWbPMYzEfMI+a +xHnFvOP4/9oACAECAgY/AGP/2gAIAQMCBj8AY//aAAgBAQEGPwB72Yucb1Bf +IhFEaeZ+xRXFQELN+HEUQdjU0Xn4g9gRCQcpw1yajGYsP/kFvUzvjUBWrIMF +HI2OJQNEAjiEEFdTmfG/MTHq5RFOnpTV3kzCBx7x4YOD1AV5uYJvnqMA0hep +jfwpYCwC4Bx3q55zeZRBCw9TkoIuHw78RdczSNH2mgqcLpRC+RASAkA3B13m +cYd5mR84c/yOx4lWtRAZ6mGDhiP9WgXVyhWA+xDgMOWGMsTg/wBTz8SjjXrP +8hHIlX1MZ6mDzgc/cIV/iyN1GBR0MQMKjnEzvvMz8mUkErKlfqU63iV+IKNH +7mNZBLFQEpEDeDOV32IVn8WR4caoywqI2p695mbZzNUQIcKfk0bo+0NpCqn7 +CiQiNGXkdQen1DpjGeZ7WNw3pK+I93maCPc16+Zkf6XxMCsFwAkaiIB57vc/ +IAhZ/HqZBBbB0ZokAEOGxsYqBgPp8agQBu4VSMJdqx6SwDsGBrTmAR93uZGX +6KePowEADAIjoX8gw459CICaW/MLGvodQfkDW71zBxRHtB3j3jC4PMIYoAgK +NfPMCQNN7jCzvlzXPopzhQvNZY3CRya9ZrEFfRE0iCB5mscZuVYfKmAi94uE +3Q8qfytQ7xD0svmFcmaxNPI8iMjh3pmF2HbzqeUi+YkiD/MrOl5LmbwPuWVf +mXpv3hDH8qAjPpiZHXkRnSd6ZhB53mejzKV6US0K9TCCLyCeIhtETX5MsHBG +JkD/ANiFkMCE2qGoCdZ8Q8AMGpYFqEhdhRIYH3CF3d1M/Mexma+4CwdQ2Ddc +x0exAlmj04QUQd8QWLB/iB5GxmEg5TENVZqPYzFV8eHAy9T/AEc8a4n3Ov6g +/VwvE6lpQ4VNysXzhS8esOO8w/rlF/rypjV3B5H1Knr8T//Z + +--Boundary-00=_z3Ln/tUeUBipHgx-- + diff --git a/rt/lib/t/data/multipart-report b/rt/lib/t/data/multipart-report new file mode 100644 index 000000000..538e0c880 --- /dev/null +++ b/rt/lib/t/data/multipart-report @@ -0,0 +1,66 @@ +Return-Path: +Date: Sat, 23 Aug 2003 00:15:18 +0800 (SGT) +From: Mail Delivery Subsystem +Message-Id: <200308221615.CGA36111@mailbox.other.example.com> +To: support@example.com +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="CGA36111.1061568918/mailbox.other.example.com" +Subject: Returned mail: User unknown +Auto-Submitted: auto-generated (failure) + +This is a MIME-encapsulated message + +--CGA36111.1061568918/mailbox.other.example.com + +The original message was received at Sat, 23 Aug 2003 00:15:18 +0800 (SGT) +from mx12.mcis.other.example.com [10.1.1.232] + + ----- The following addresses had permanent delivery errors ----- + + + +--CGA36111.1061568918/mailbox.other.example.com +Content-Type: message/delivery-status + +Reporting-MTA: dns; mailbox.other.example.com +Arrival-Date: Sat, 23 Aug 2003 00:15:18 +0800 (SGT) + +Final-Recipient: RFC822; jesmund@mailbox.other.example.com +Action: failed +Status: 5.1.1 +Remote-MTA: DNS; mail.mcis.other.example.com +Diagnostic-Code: SMTP; 550 5.1.1 ... User unknown +Last-Attempt-Date: Sat, 23 Aug 2003 00:15:18 +0800 (SGT) + +--CGA36111.1061568918/mailbox.other.example.com +Content-Type: message/rfc822 + +Return-Path: +Received: from mx12.other.example.com (mx12.mcis.other.example.com [10.1.1.232]) + by mailbox.other.example.com (Mirapoint Messaging Server MOS 3.3.3-GR) + with ESMTP id CGA36101; + Sat, 23 Aug 2003 00:15:17 +0800 (SGT) +Received: from STATION13 (rhala.dsl.pe.net [64.38.69.104]) + by mx12.other.example.com (8.12.9/8.12.9) with ESMTP id h7MGFGac020135 + for ; Sat, 23 Aug 2003 00:15:17 +0800 +Message-Id: <200308221615.h7MGFGac020135@mx12.other.example.com> +From: +To: +Subject: Thank you! +Date: Fri, 22 Aug 2003 9:15:19 --0700 +X-MailScanner: Found to be clean +Importance: Normal +X-Mailer: Microsoft Outlook Express 6.00.2600.0000 +X-MSMail-Priority: Normal +X-Priority: 3 (Normal) +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="_NextPart_000_05684DA4" + + + +--_NextPart_000_05684DA4-- + +--CGA36111.1061568918/mailbox.other.example.com-- + diff --git a/rt/lib/t/data/notes-uuencoded b/rt/lib/t/data/notes-uuencoded new file mode 100644 index 000000000..f27fdf8c0 --- /dev/null +++ b/rt/lib/t/data/notes-uuencoded @@ -0,0 +1,2368 @@ +Return-Path: +Delivered-To: j@pallas.eruditorum.org +Received: from serveurlotus.example.com (unknown [213.56.193.67]) + by pallas.eruditorum.org (Postfix) with SMTP id C21DB113AA + for ; Thu, 27 Nov 2003 10:55:58 -0500 (EST) +Received: by serveurlotus.example.com(Lotus SMTP MTA v4.6.1 (569.2 2-6-1998)) id C1256DEB.00578401 ; Thu, 27 Nov 2003 16:55:54 +0100 +X-Lotus-FromDomain: DOMAINEQZ +From: "Maxime HENRION" +To: jesse@vendor.example.com +Cc: support@example.com +Message-ID: +Date: Thu, 27 Nov 2003 16:55:50 +0100 +Subject: Test e-mail which exhibits problems with RT +X-Spam-Status: No, hits=-2.6 required=7.0 + tests=BAYES_20 + version=2.55 +X-Spam-Level: +X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp) +Content-Length: 144905 + +I send you this mail from Lotus Notes to make sure it'll exhibit the +reported symptoms (lost attachment and body). I Cc: it to our RT address +to verify it does cause the reported problems. Could you please mail me +any replies to my personal e-mail, mux@example.org ? + +Thanks in advance, +Maxime + +(See attached file: Naz_Head.jpg) + +(UUEncoded file named: Naz_Head.jpg follows) +(Its format is: JPEG File Interchange ) + +begin 644 Naz_Head.jpg +M_]C_X``02D9)1@`!`@(```````#__@`>04-$(%-Y56:T,@P9,:ML)Y$]AW03FLXR78A.VY=&=IV58& +M2!^X1-BFWO)S""S_`!#M,.,'VV2;<.(C48"JR'#&!V*>!LUV_OLBK)KO@C5) +M_9)M=V0(GNJSAL9"7!!E066UR&X)^BD%P06DOR%2&00WG=$WYSQ[JHL&Y&>9 +MQV3ON7.;ZG:@.).%59,Y.#[)H&F7.`/QNBK;:Y#?S$XP"4(N'[:S[Y46H-8< +M2#C.4``SZA!V")I9?5=AVO[')L[3G?=15_P#BG`0"[/=(W;N3NJ@/J]>8PG=M(5'#_`)CL>Z`7CY]1=`[$Y50& +M1,Y]BF&^G!]I07_XRII!#JD3]E(ROHU9_/O]5G,+F"9@>Z?5D3Q[HC2'4*PF'9=]T_\?6!' +M\QQ^2LZG,[R-U(3Z):<<"9A*+K.I7(<2*KA]4XZI<:R[S78YE9H))$NB?=+4 +M(C.^4&O2ZM<:Y-=^F(+\`#^+JQ[/*P/,<'SI`]E/1D[@'.`D*V[GKMZUP>;N +MOW`#RJEQXCZB^KJ_BJ_P*CEG]1JD5PW5D?HJC2`V8,]P>$A.&PSKO41Z'7E; +M/_649\0]18YO_K:I@Y]9@K%:\DDM/P.4#G._J)39IT%3Q#U(48;>U9]GE*WZ +M_P!3:=;KVMCC65@L,M],_=3C\I9@^_*IIT-GX@ZL]P<;ZK#3)EY5YWB;J9`_ +M]75`]G9*YJB-%&!@G<=T?F!K`T3'LL4=(/$_5-`TWE4#_P"Y,?%750__`-[5 +MS[KG?,U-`)..W*$N$F=QW4TKH?\`S5U?7)O:@^J3O%/5&`3>5<_]2YQS_3,D +M90OJ%L9S[*CI'>*^JA\_QE4>VN?[)4?%76`''^/KCC\Q7-.?WG[PHR\9[\!" +M.I/C+K8R.I7(CL\J1OC?K[!J'5KH>WF$+DC5TM&#J_="YY=].$Z'8?\`G_Q( +MTS_QJ\$\"L[_`#1?_4;Q8T"/$-^('_SN_P`UQ.O/`(3O?Z<\JZAR[=WXG>+V +MMQXBZB)Y-R__`#3?_4[QHV2/$W4\)NJ0.]W4_S3?_5'QII.KQ/U0@;?^I?M]UPDN()DCLE2J/%6>?8Y5X-U +MWP_$[QDTZO\`S+U0#L;A_P#FA/XI>-1__D_5!`__`-A_^:XBK4+A#=]LJ'62 +MT@@2H;KO:?XK^.`#'BCJ7_\`'=_FI&?B]XY;G_S1U$]OY[O\UYWYA+")*;6- +MNRJ/26_C)X]8UI_\T]1@XCSBI/\`ZT_B$W;Q5?D]O-*\R#P`#O&R$UC,SDH/ +M4*?XX?B,R)\6]1$?_M4=3\HB?\`]IM^B\LU.W(D$*.M7\L$-DGW +M31MZF_\`';\2*6H'Q3U!Q(P?.V_15S^./XE:-;O%O42WDFIM^B\K#_3).0>4 +M1>-,R,YB86M0Y>HL_'+\2"X$>*NH?_Q/]%+1_'7\1FNSXHO2>_F+RG5#,F/8 +M=U(S+@Z23\)J'+VNT_\`$'^)M.W:QOBJ[@=WJ3_]8;\3_P#_`*NZ_P#WUX]0 +M/\IOJ`13_P!8_P!_1.#E)>;X.DJE4`G4&CW]U>O/2YTY/95"VD\@O(8(_-NE +M-(*I$\#ZJ.((DP#MRC?I!,.#@3P@`3L`F@0!0`")).=10F`,SG9*`Y^DS'9#0VZM.' +M@0=NZ51S@XYR=PG9IF'?1!4<)QF4!`X&TTQ@",3R5'[%V$1,Y\B8S&Q0:S^;4")R9@(2^`

    T[ +M)`@^IH&GL%%2-?@B8^J;60">3]T+=C.J1O@_ND<_U8'(RJ8`/)3#3OJ'T*(D:[&8B=Y4C7$"&M,J)L1Q'>$3@1L8'L@8F3@1]4+G +M&(VX2(#3^:>\%`?54P9'SNJHZ;B.^4]0D@X!(0@..QCZIR`V"7-.)0)CR6P1 +MDHFZ@-_BVZ.>9&?T32';4C&4FN.24S!G,B.4@"7P-D4;CZ02G +MUQM@'E,`7,D-F-TP:03#B)XW03TW0`3/=.ZHT[20HJ0(=JP<83U=1'Y??=$I +M.>20)B/JF<\D^W$)+@3@D=@@.1J(C\RGI.TTAL`%!;@U'@&8)4U< +M#40..%*LA!WKD@?,JQ3<*;=6J?959U`<%*HXBG,R=MU`JM05+G42#[QLF>8: +M0V"1O)W4;):`V3G>$4@$&()W0/YA+H&$S"=Q$'E,X34D!.&MF<>_NBIZ.G5. +M1C=6*32XZSMP56:Z#I#1/=6ZKAY8:!$;PI:1(7B!)SV0O$+R(+B![(IY&DQN$!U$=OE*99G;V0ZVDSVXE7:0I$@DY12W5 +MF0.P47ID%(N@03]R@.1DL'ZH#_DD#^G"C!R=_NE()$'?!0$X%Q$?NF(& +MY!&.Z;;4`24#RYH!!)]T#U7A@,\JNZ-6?ND\EYDN$]T]-[\MUX[0M!/;+?E, +MUDQ/WW2=4TGL3V*!SAQQS*(D:WD$P?T4M+8@29W]E!J],CE'J&H`.XR$&G0< +M!1:(&R/6WL%#1TFDTEW'9%#/\?Z)N+I/L@B%`B9(SQF$/&TIHT[B +M2F;!.3'L4#N:&P[?Y*:1!WD=T\S(.3\RA,:2Z.?T3:GD%I&Y&/A*8&9CLA(S +M$B/S8PGQ&R%0;B#F#CW14 +MXU>QX4?]1X*3,$X(]U!,_2'0XS"%S@'20(CLAJF'#E)I!!:2J$XMS(]L(26P +M)S[(W._EENH@3J4+FR2/902.TZCP(V[HH!!C(*A;#@)V[8@M^"J#<1&QE-SL0.Y2(SOLE'IF<($XB$3P0[)"%VD9!D#^Q02!D;F2>P0&(,[I,:XB-4B,Q"1#@=49" +M`J9!R^3&R=Q;J$(0(GD(*A<(='U2"1V&;#_-`R(D;%,\DL$B>Z$;X!55)G48 +M1-'IS&VZ'48&#GE,4[2[5`(GL902`.:#ID(2,Y$D]D33Z().$(F,'ZH#:"6GU +MB9_*F$SO]$F-)V,%(.Y`D(:'4P0`?LD`[2)D`]]B@#LX:1*Y0D02-.>ZE<\NHM`:)'/*HBDQ.=MYW2C,D[(2XN;))"32XM(! +M@'906+-LEU4DXF(2TD$$.)3AX91:WDY0DM#?RQQNI5A]!+@3/PA<=\@HGNCT +M_?/"AJG$#8^V$"UD8!4E,P9;G':5$"`?5()X4[6.@.VCLJ@2UT`B?E.3#`9$ +M\93:H/I/SA.P-J$``R#NH+%KAVLOD=H4I<9@SW[*(0T>EV/8)5'$N&9![K-Y +M5+J<68(R-TTB=0P4!<-`@(`YVH24$],SF?A"]P#MQG&4&J'">$+W>H09SA%% +MEI(D"=RA+9;D_;!3.+B\DCG9,]X(,.T@;?'R@6Y,]L94L4_X4N=Z7R(`V4.M +MPR2W*=S@:@&P(VE5."?KTR1!)F4#LB"-LRBGYH`$85"!G@'ZIG0>$S8D3*L=2_@!58+)U4MTC6: +MD3JYVX00'T[YS\I4W`\H9#G"8^`D\M#AZ9^40Y<7'@?.4#@)!R24Q,]FI$ZG +M$_W5#XW$S'=,UHF(W0DB#DY3R0V29(W0"78)*KU':R`9]D]=^O\`*%&60\1P +M@,#5`VGNG`:T.,9!30`!#N,I0!N(`5*.B*/G!U5ITC)&<_91N+!J(G`*54-6=H"B/I?MDA2U3DG&.%&]Y=!+H(/W4`N_/@&$B6R'#=)[AJ(P( +M0-$/@"9303HF0TR/T2:06!I)E*3!$8E-K=K!``;QE`0#9`P8]L(&_(CV*<&0 +M.9.4[OR['L"A<1$`A&_\`(.!.854F-(:?4?A$6AKX[;Y3 +M4G.#,[=RE.!(CNB'=&X.R8F``,)2X',0)"B)).T245(..>=L)B +MXX0'R!SAP),>R1Y(SV]D+V_S2V))YE,T:F@`X"J)&2UI +M'._*1Q$&/7:9,`;0H&WR`(.(1;;D",8*:)Q)D;F4B#.'8!GL@?+7$'OPDV"_.3.Z6"1 +MM]1E.ULSD2,90$TES#\@83M&3&W=,USA$R0=RG`T@.!WVA%Z$UQ+CB!Q[I.( +M.`([^R<.EFW/*`DEYDX(@RB:%.8,&/V1MD8R<*,B'`[QPIV#^43D#]D`Y#H. +MK`Y"*J#$F028DY4?YJN,`=N457!<=I&K/919@P1DJ5^EEO`(G(W]EEI%5(+ISE!4=D<$' +MO"6OU1Q*:)=G!Y5036G7)VVE76.<+5S1I')=L2J;"00`.5,S\D@C2$^!JAQL +M('LCH,<&E\@$YCZ(6-UNB7$!2@[-&`-]U*';.2#`CLE3'I$@'O/"8P!G'=%2 +M=J>9^L#$#$8P@:3DD@J5X<##?Z9)([J(?F_+)B9E`#IG<`\2FEN=L?JB%4($Y"!Q#8&1[]TG26`Z<`;=DG0&C[HH0,R +M('(.\*H?`@'O.-T+RUOIW,Y@J:XHU:5.G4 +MJTRT5&ZV3R-I^X4+H+BXE.3J('`Y"6&M^NZ:- +M!)RYV0"G!``&DB1DH8&7'`,C"8N],ZAP)0._2XB`94%5\NTCGE27)?2+6N8X +M:A(GLJ\`F)S^ZH8P!`R-Y3G\V)D#^Z0(&,F#O[)IY)A$&T@&08QRF=!:,$3& +MR<^H0TD$_JHWY]!W^J!W-);!&#NG.EI!U9!VRD0)`G/"%P;$@2(0&!%0.F09 +MG*.F`#^:3O""FT$`D[X^5)1G4!@GL54K1HU8I-!F81><.Q48H]W9&,92\D?X +MBJ<+=T&!T-,R,:>%1J!DDQ,=RKEW`Y,X1/]1)!`&T(H6Q'..QW0^^Q]D1/],`X2!<<_\` +M9,2Z?RC!X1%IRX?=,-RPF$\>HC()V2<'!V/ZNZ%WYL#G[J=D$W#=S')'9"-B=C*+,3JG[X2:#C(SW5 +M#M(U>TIB8P"!GE-FV4[`6QB3[!%I=H+P"&SM*6HZ1'',($\PR(.3@A0P9)VCA&XNG)R< +MPF,$02,?HB$&XD_7NF@',9[)2=CE%`'LBI#5J&6ZX`&PV48>-7JV`_5/HV@? +M/ND02Z7?TG[H&@#W._PB@Z@):1'=.)>_)@\^Z%Q/YG8(Y0%@$@N`G$#NDTRU +MT<\IAB3.3G>4[7"#N0).$47]43.)_1$PB(C$J,8#8@2C9,SM_9-(-@]$`X.4 +M),C`(#433@M]S*&)=&<]D!TA)S^O)4U9H;;AHDSV4%(@`;F.%+6=Z`>$#,$. +MW]H*8DDDG;M"'S#C2,#L93R3D"2@(0'#5$B813J<6R/="P'RR22!P$S8:^)U +M3N2I5D2'3,1B=E$^"[_5&YP:6@A19F7#"FE$`8`'.91%IJX$B!RGI_FG)C,! +M$[\LP?8@JHC@M#OS23W1EQ\L#&IW9"XR?=3T*;=1>/\`,(:%0:6CDR)_LG<0 +MVI^:.=U-TW^&_C!_$BJ]G^&F!)/`SQ*&]=JJ%PHLI@>G0&Q`[+*HR-1R?9*EI%3+CGA`FEQ-, +MF)V^4]1PT;DD\("XZC'`50@_U#A!)@S.=H.R-[A$0@#@3+>4@=[M3`"3+1&3 +MPA.6:8R,9.Z6`-1.)0D#\VK3\;H?].02[!$D)G3IG4)/[IO=HE(@@29^B:*1 +M/H+7`P=@HW5"`/T`3$Z0=1.=@%%4(+OR[[JAWU'P-1,1@=DP=#L"1L"F`]$$ +M92S)'M`0$[!!!(GE".2?L4A&LD"('=,X1!D%"HU7-I-;)V1^>[N5'2CRQZ47 +MI_PE39__`%9N'D/=#RP$&8Y"H5B7`Q!`5V]U$G<-E4:N9_:%:(B!I^,B5&X0 +M,GTF`/U2]$&"9A._5IR1"C.-B?A!:Z76MZ-;76 +MIZQ!@1.?<**Y(\USF&&N<2`,0%'J=J&`.9*62XD.^J!9($../E)PSD'YE,XD +MNDRB+6Z))`)X'"!-B(+A(3THR2<`Y4;?2Z"W[HV^Q@^Z"S>OH5?+\FB:4,AV +M9U'NH-!D$`CW]DAD`';W2DB1/"!'TGA(3J&4P^#M".1Y8](!)C5R@'5#N8([ +MRF$1W[A,^-A)A)L[`9/97L'3`,^J/9.08^>4(])@G$Y"Z*$U,AI)+)]I0N +M($[3[IV#4'`D-Q(0,-\B/E.2-0Y[H6D'?CB40(B/LB[."7&(`^2CDSG([(#& +M'$Q"9CFAWM^J"0D"=+O_`,(2:0?S8'<(7?D(9/=.TC>4!'_F?&P3M<"P`M)^ +M2A:2?Z))^J<'.PCF4!O@Q`C&TIP&C+2\:PUQCF$``@G`)[C"ELW%E20.,%`U>)(,[<)FZ/,!R8X2;-2H07'/) +M35&C9@R-R"LJ:Z?JJ2TQ.P*9CR6^H;8A`6%P&H93M(@B2/A4&7NSI,81:VBD +MT'NA$@#!":,:AN@DID/J1$QMA7':12TM>2!C3W5>T8&F7#<9A2G2'&-H6:HF +M$MRTQIY&(2Y(&??=/Z=XD#W3TV4RQQ=4T +MXD")DJ@=,TX'U!&4G%L@D$GB.4G$EH``B(D(20!I`@2@R'8F3]95#U`"TZG#V0,PZ8$?*0_*3J.-P4.H3D0!PF@3F1(D%!` +M#?2_=$]K1SO[H"V`3[\(AA^724AEN(":)$G.>4Q`!+I]D(9X$21N8^5(:C?X +M=M(TV`M.K5SMRH@T22YQ([RHZKPY\3LJ<&J$D[8&<8E1P-8WA&]L1O\`"$M$ +MG]B@*#I/;N$AW.2D[)B?\DQ:6MW0)L3!E+2`X<#;*;=VK:$>F6R3\(A%I`R) +M!0./H)X]RG.N8:Z!V"`G_J'Q*+L[20"6N`'*4-+IG;@SE+3ODD']$T@;$_=$ +M2!KB3!)PBI2'1D3P2@IO(;@[CDJ1FJRHO4R`P`MV]T6IO^']4%/5H$3]D +M_J[G[(BS?.:1O/Q_=4*S@XR($*W7+M6,?14;C\Y&DGY5JHWU&%NJ(^%$7-#I +MR0.$YVWPAR';@1P0L[#.=,D$IAM,I.P/5L4FB1#^2(14?+TDO#@Z,0-S[H!D$B3]CA/Z9P))XF4C`.WW3"`[9OP-T!:O5I.( +M1#,9Y0-`@D'(XSE/I$3O&=T$D9R0,IJD<#`[(7B!`B$=(,\LN/YAPJ'I!U2J +M*8DEV!">H?5$Q'=0OB=C\IV%LB0?NH%J&`,?7=$7-F2?JHW?G@`QS"?1J@9D +MJB1L.$EWZ%,XAQP)]X0-P-!DQ[E(@3B4#D09!QP$[BTO_P`/LHR`'01(&Y[) +M`-@@GX"@,1M(*>`!.('9,`(B-]H2>WU3)^$BCH,+@ZH&ZVL$NCA"!)W.=D`D +M'00[W1:?^HY]T00T[$B?E+3F9$]D).ET.]/8IC_TNYG=4.W!CT@C8%%B9G[% +M`X-2=T\S)XVC=`8$"03GW1`B3.2>5 +M%Z_\7UE$9`$\\I%&X"(+H[(@V!+=O9!,M&04B3.`?NH#C5MN4[!GT)P(;.#W]D`+RB),[[Y]BH!((!$<;RI`T#^J9$!"T@5` +M73],HF/=,Y!^5*IV"&^P1.!@:1]45NUU6HUC07%YC9=5XA\,ML^@T+NWU.>/ +M^;G8(;Z-,$1V3=I](*4R[5!^H2?CC(S,+*E$.YQ\IW`SB<[RDZH +M=S$H"\:).)[H",QB8W[)I+1)Y[(=8/!TQPG-22TP2`J%F#W"9@)9'*1=+>\E +M(&,\(!J-,B3CVV3M\H:PXEQ/Y\-&"#)[H`@DZM0'UW4FC^5)W/*`N;,@Q.QA25GD4FM+@0-E1$ +MT%(^HYA,YS8$G[%#4>W5G,>Z`J0+WP2T?*!P+1GGA"7Q//NB#M3I=$#N@%TD +MQ!RG:USCI`)+N(3!X)[?&ZBJU@`()U`]U4*N2'Z9/V43_>$^H&3,8YI8?V(^BJA[#<$ +MAH:'&8_LJBRS\H_-]"G^CONI*8.@:=D\.[JFCU]&K))!6=D#;.>R(:);)D92TYAQ( +MA!K]&DXGE.^IZ]1.Z!R!,.)PF<9,R!\IB[N)^J)Q@B0W81D($^7.DD.)RF;^ +M:)@\04P))P!/$[):])!/?=%'`WGZ)W21Q'8*.G.HD;GNB:^#B`"$B#@D`0/E +M)K3&'8Y0M?`!$%*F_.VRI$KJ!IL8\/:0\2,R1F,J-ATY_1,2.3GY3/?+G.TY +M*BG`DSRI,MIZ=,3O[J/5&",I.>"W5'^B"322V<9V*'!=`R1^J8&2/ZD0[V@B&#$X3P]N)`U;CN@U0Z2)^4J;QKEPD?/*`J8$8W3G.^.R&1C +MD#9,7("JZ]6EV^V4I]6T=RH^W/'RGUB`!L<(I'7$YSRG+8XF,X*'40P`#,I% +M[33].LCW0&?R`G?A.]L8&2>R%C@21$QV3Z@1IB/D[(&>),SO[I>Q$)B]H<1. +MV)28<@%THAR8;M\J2A7?1:XL.7")W46IH:0D'M+<`Y0&T^H%PD'=&`"2"0!\ +MH&N!SF2,E.UX+>/HBBI-8714<=/[(]88``R)P8*B#MO5]$S'%I)X/?\`[()G +M?E(#<_J@(AA`S[HO^:XBF)`R8[=U%JP1(A`[LNVVX3M:#]DVK.0!'*9KP'D[ +M(@H),`E.[:(@[Y3,(U9C&-)2>9S@1P4X4F3I):)C,)__`,4)VN&DQPA9$:9B +M>$T'`R2'8^$;&SZ9^J'>=(,?ME%OVA`U,,#4`09+@G>`3@$?(1@M!)(WY"3CB8&>4#.C@P1S")T!QS(3-=C2(SR43 +ML.:"=N`B!,1)"3JA>B^);RA4Z'>U650PD"F`>?9>5 +M,:0[21!"MUJ]>G;MM:CB&-,D'!!*K-G*.H3Y<;25!+M1G96*CFU&@-!$;F=U +M#6;MF)X470:;"]_J,0%9!ETM<"/=10&MW$A'Z2"1.,PI06HM9I+M^YPDYVI" +M-(W)SPDV)&!CLHIH<3))_P`DY=-/1((!^J9^_?5]4[9PUS`9._=4`TP,#;A* +M1K./H$;O*#X9VV/=`"0\@8/)0(@@0D-3H!2V.9(F/A!L3R$!8+#$2-\;H9(S +MJR.`E`TQ.^Z1;Z?3QA`F/(!=@\Y3$MEWOLF([;'VW0D@$1N3,!4.T@C+FYX3 +MO=#(:Z1V0.$,G8WL$`Y_J'RFT@&>QV2<3'YLM3``3!^$#$$3$)BZ +M&C$\)-$P(.4#W9[J@G8+CO/"K/WVS\J0R#O]"FT:<@C=$!$X''*3\")`"+2! +M_6)[[(3ZAGO"!,@1Z8)[A(F#@#(^4Y$@-#I*1WF2/:4`N/K&!/LGT`.$I.)! +M`;N>$Y;@B9A$[",_W3$>D0#*(&"?9,V3OP@30`22#^R0`DX3_P!)DI$``.(P +M?;*='!I^<^Z>$X5+W +M0U\`&!LXB/T5&IVP<[;Z=;HG'?95:H<6N&J`-_4LU5>J6R=(`GA`UPU3 +MSP0C<,'T_=!I,@$1/"BE-,$:@2W8B>4PC2X:=_N$B#IEP&/9(#U`SL4#M#G"29(]\ +MH2(@29/8HV-BGJ.T[IG#TG=`-,0W&?:43@Z"1J,')3.PPC^KY39`]C@^Z!P6 +MP<;^Z;MW[IS,$AWU*0F2H]S7VP:060<'WD*FP;C'R1*.LW +M)#H!&9!0-(:XG3(CN@)T$0/J!RBTC6886G_#RHX!_-()W2)@S/\`F$!O>3F( +MDS`$(#(/'RG:9.2?<)%OTR@1W_1$"X/:0)0T\D_NB+=9@`YW0+(G5B0G/YRX +M#XW3D:J<$NG?;W2U$$S!&^/KR@31+-0(D',82$:-I,X"=K26''Z[IP(=!=C; +M<_Y(IQ/L9C*)C9:!)SPE,8TS/;9/2:X#L9F5=(3@X``#'"-S8.7<*32UU*)R +M.R'2';MF,RHIG4R,$1&^=D_I`&,C*DIM+O:4=4`50U +MC1,3/=,,.D`X_J*>OZB=R1G]%+RL5WODZ1W&,B$X75>_O*EY=NFI4RX@``G[*I1IR#@>YE2-_P"8 +M""94T@2[33,`R!A/2.LZS@#9-<5'U:HF2[8'X&%)IAH:(]/92KHC(VF>X128 +M$GU>R%V'`<\II.DP"H$]TOB?5VV2<9&J3'9-!+06DB3ND`YQ)B>#[JD+5!!^ +MIRDQVH@.<1[IIC9N/W2&",`DG7-`D1*3,?F<)2):_!@>RJ +M&&,Q@;J#S`YP=ICV5BXKTS0TM;\E5?1,D'XE('J/$Q(@\!(U(;&H#ZIBT`3] +M0AC$%TJAR\E\"#'.R;4!L,X3`AN(XR4(C)@[J`G.)&`W`^$['2\@C(&(*9I@ +M3!/RG8UFF9W1`EV9D8V2EQ=O*8MGMVW3Y$@1/[H'UX2:X3!/W3``M^".4VSA +MJ]0]T!DB3`QLF>['.>R;TZ@0=^4PWD@F>`$#ZL1!@29[(FN(//P90$3,@0>" +MEIT^D9CD(B4.'((CWW4U")]IG95F07'2I:8`]6Y$*PZ:U!X=1:9C'9'J_P"K +M]%%;,8Z@USG"2I/*I_X@IJ)Q^%>\@2,3[\*G4]3L`EQ=/*O7H&HXP.9W56A7 +M=;W(JM]4;`JU52K&DP#W`0/!TC(R.>%(]TDDF0=T!,NF?NH!.^<@X3<;P2G& +M"#''=.W2=6K&,(&+L'`SW2&_"8DN@0!'LF9@QD#V0.#B0V9X1,:PYTY/NASP +M"DW?)_1!)`!@SGF4U,G3S]$1!+@&`D^PDH6983G"J'):3GYW2DS\(=68(&$1 +MP=OD%%*8$9R>$[SO'9,TPX#VYY0D^QR@7],$E/3U!TZL^R8`:9RDT9,X]T03 +MR"P;GC!W34R2X8^Z1([8Y2#@#Z.$4XG9VR0<3)SE)I!$$`9V'"0/](D"5`[7 +M'5+C!'LE4<7.`WX3&/,+@/NE4@B6SODH!;D3J/.R<[S((Y2&G5D3/,I#\\EV +M_(0+48F1":>=H/=.XX/J@H9&0#]^4#D[N)D\IB&D>K\3G[),P@88$"3^RD8)]_K*`F#\HTJ:@TEQ#),]LRE86]6X +MJM928YQ=@87J/X=?A_YY9+,LX\!L_PUJNM +M]=1V>T#O\KG_`!7X3J=(`<8=G;_9]U]']4MF6EN8;@+R[Q9:U>J=F?3VSLDT""9,'L4+02=.T= +MDX.D$9^2@:63J:=^)3/#0,'/'LF<(,`3'ND[6!$R`-]T41_(,XA,T`MXP/[I +M9&(!`0C83"H.8$'CLE3INU"/LIMJ8VG:W40,8F$VG!/ +M;:5.VVJ.W!RI_P"#TB"TR>W98]X[3]/E5(0[D8'"8@-(@Y[=LJ^RS#:8)$_! +MW41LW;_V5F<,OTV<4F:-0SGLB>9=C,;'LC?;5&Y:PP.0=_=1.I.#B-,'?LM2 +MQQN&4-Z`T$S*CJN)>&C')37))=C!43B0)'9:C(G!L8@@\(2T`P<1W3-,Y<,> +MQ2HQ]%C:-,N.MX;/L)W*@ +MID8D&$.!DC/:4[QB3./="#O\;2G_`%#@1.?OA$T&1/*!L3`XW`*X;6HF',Y(! +M_0_*&T9;G&VR+&C^W=-J).)!/9-+L$\]R@?2"Z&R`=I2:1ORFGN8^B=OYL"> +M4!TIF6_*E:,R-Q^JB;F"7P/A2TR"<2"#NK$:-!O\H8_4H]/M^I0VU1IH-+G- +MGW"/73_QM^RNS:.[@SJ='SF51KENJ`(^JNWS0'&#,?,*C5B-QV2FD3C!P/NA +M<0'3(1.D849(Y60GYV"8@!^EY"9GYM]CLGJM(JG5AWNBFEL@!(#.0CI/%-^L +ML94'(=,(6[B-CW0(!NN#D)-_-$8&Z;!?,?5$&P/.Y*`[$%Q^94-$./5&=TY] +M6"YL43>8)RB#P7', +M`I,,`_XB<&4V(@G*$>DY!)E!(UKC@[)SO&J!W(0M#B,Z0-]Y3M;!$P +MA=(P(3`N/930D='E9F>R3!Z)(0N)P)Y1ET",#LJ'@AHC:.Z=F6\Y]T+"Z2.% +M)1:[2=O9$%3:&-V$GDJS86M6XJMI,:7.<<>ZKTR3Z0)/<3*]#_"+PU4O+IMW +M49+`9`(/^2,Y9>LVZW\*_`=O2M67-S3#ZKA.1M^B]8Z+T^G;L#13`^%'X7Z> +M*5!C-,8[+H*-L)S"YY9;<9-\T-.V!`X/LK5&U!&6Y5FVH>D<*W3I:6KFZ2*= +MO;!KXC!5YM$%L$;?JCI4I,E6649XW4VU%-U$`:0%!7MQH/9:IH]A@J&K2$?L +MAIS'4^GBLTC.?9%Z+7MY9$96==V6=7]E=LW%S->W%.V@! +M>7?BY8&O:/>`1&Y"]BZE2#&$'8;KS+\5*M)G3*PQLI+I9'@]]3%.I$[<*M5' +MI;DS[*U?5'/JN(V!RJ[W=FQV7:.J"7:I:<)Y,1@E.3#C.4.2=DL4XYVQ@X2@ +M%N9)]MD+I`PW"0=N8,G$(0Q(B-N\),#G#TR>PWE6;*SK5ZA#*9"V^G]'#-+J +MH),GU?'_Y>,_LYUG23H]69[*Q;],8QTP#P!V6Z*=,4/'J,T68G#1",6L[;K1TM),`)F@%T8F%CWKK^S)\9K[2&@C'OW0 +M&W@"1[[\K7T^DN@`*&JP.PWZ*S-,O#BQZMOI=(;+NTJI6L0]Q!$'B.5N5:32 +M)(4%1AG`77'-YL_T\O<<]<=-)+LQ*IUNG5&9'J75>6W4<`_51.H!P@M77'S7 +MZ\?D_0XWF.3-N]H/I46DY#1F5TEQ;,)TN;LJ-S:-)D-A=\?)*\/D_27'IC:3 +MO@\PCHOF>%J(T:+Z8I`&E/\`^)%YE/\`^'_^=/1T>4/[(_0FDVCN +MR&/CN=E1KM+GX`#5=O<./:?LJ=?6`!CVREYK2*N"&Y:-/=0`1O!5BYK&I3:S +M2T>6W3@;_*KDSF!\+*[`\`"<]R$CDYA.7&#(&4P=),`(A^Y`S^Z1)!G0/A,= +M]Q\)&#C5&$#P#Z2V9X",`!LM)'_2=T#7%K@1N#,2B;!SB`/ +MNF8-6J8QF$YTGL([H%)B"A8)SC")FF9)D>R1&"-`^Z!FZ2!,(V#!C9`S)C`" +MDIZ)&H`*:@T:B'\;94+&@G8#WV5FDT;8'U07NAV#[J]ITJ8U&HZ.Z^ +MCOPPZ"VRZ328&@$-$XB5X_\`@OTT777FU32U"G]>R^DO#EJVG;LP-EC*Z!W0VS0T",?"O-8'-Y*YTD*W;F8PK0IEPD;)K.E(R +MKK&%K0UH$$9*EK2O18(^%W"IW5'!ANZUJS`!)^%4N*;2,$PAIRW7*.JF6E>7?B%TFI>T +MJE!LC5B3E>S=3H-=3,#9>=>-*#VO4WDA8W4^MUG4]%VUTQDA<9Y?)/CO/'OJO +M-Z]I5H.TU&$9@X4-1@$P?ONO0NFVEEUB62))W6%XR\+W/3'&K2!=3<=X.%Z, +M?-+=4]+O3EG#T0>5+:TV.J,&K$[!.:,#U'`XA36+:0K!I#H_ISRM7+AZ,/!K +M*>SI^AVM(46QDE:1MVZ9)CYV6?TJHUE-K08+1F#R?I9\8);D$@X]DM.T_?BN*N0-+3DGDJ,@&9;]U+5:1(((`P(49;%,N&\K3E +MK0?2#@(FMD3^Q0AI,G^Z)K=HDQP@0`/TX2.()!`*6-X..4BW$Y^VR`<$R?OE +M'#=>MS0?;9#_`%R<_=2>HC),#[HA4V@O`!&3B2K+:3J54L?^8;P0?V5=@+7X +M&_<*9H((F9[+2::-$GRADHI/$50P)(!08#)].4`!P:9W2,'( +M@?"1;!QM"1T[&8X4"F>('LD73N,\)$2<"$@UL[[=@AH[@W!&4\@`2AF,-$=D +M0((/I*!1/'PGJ`#&_NAV`(^ONB@3,Q`RD*6F(S[%,(C!V1`@$1&4(.8T[?J@ +M)P&#P3PDZ"9@;X3$0X#(3;-R1WA`WG5M&=^(0(PYT`&#R2F`@S(ENV)3P,D&1$(20?2#))A`[LM.WP.4M+3`#ON +MD/T30"[&)0.1,YVRFB&#YP$@")$_F2C3SE#1')P/CLG@;;)FQL#LG9&,F!C? +M=`G&#!,@]D,>WU3Z(&K,3"8?E(!S*!P($Y^=TX`(._QP`@;40R`1ZA +MF0EN`(R,$IB"!NB:-I/&R!B"#N91-P"ZN6=)U6JUC +M#)<8WA4QJ#N-UT/@6W;5Z_:-J:2USQ/;<*I7M7X)>'/X/IE*K48-=4!Q/.P] +ME[#TVDQE!HD;!`G`A+1F7X]!,?*Y?JMHRO6ES!`.5T=_4+9!&.Z +MQ+BH"7$B(&%C*FF/UNWL'VIM/+:`X:0LNX_":UZ_T\MH-(J.&".Z@N:[W^)M +M)R`?[KU#\,NMT+6[;0K.&1&5Y/W+A=UWF&^GR?XZ\+=;_#SQ2VUNVO;2<[4U +MYF")_P!%V'2[=OB7PT0&@E[(F)S"]6_\9%C8=:\(_P`51:UU>V]0,KRK\ +M`:NJU?:U#,9S\#"WGG,M91N;T\?\7]/N.D=F>7&8O3X?#Y//=AZ +M?4K-HB08]E>I:B(_0\*:VM<#TG'SA7&VA#@"V9]EY,LY:^]XO'<<=519J),Y +M/"-I>(EH6M;]-J.:!Y#B79P%J],\*W-=H?HT@;:@LSGIK/R8X3=KE1KW@Y2# +M:T?E.>5WMGX.`<#6=,C(6W;>%K%E-H-%KL025VQ\-KP^7_T?'A>.7DP9<$C0 +MUP=QA6Z'2NHU73Y+W%QDSRO6*/ARRI^H4F`]EHVUE;,9'EB`NV/@GVO'Y/\` +MUO\`\QY78^&.IU&RYND^ZL,\)W^DAQ:#[+U&E;T22)$=D?ETI(C$+7[.#SW_ +M`-3S?'EG_E&]TE^H'YW0N\)7;F>H@$GY7J-S3IM&1QM*K-8P.VW[J_LX)_\` +M4\SR^X\*7S#Z:<@'$*"MX:OV"32,[X7K;J3'#\L(76M$M]7V3]C%9_ZOE^O% +M;SI=W1,&@<;JE5H.#9#")]E[7==.MZH(-,&5F77A^S>Z/*;]E+X)\KMC_P"K +M_P#J/'GM(RX`905*(\LN*]4OO"-BYN*<$]ES_6/"#X)MS_\`A_V%F^'+X[X_ +M^CXLN+PX"XI2,CN5"6MC@SA=+?\`AJ^I./\`+)![2L6YLJM#4'TG-+=Y!_R4 +M]0&Q[+5-0@$`^^%4:M`32:0#$(M+O\`"5!39%,>MR+1_P!;E4W"OC,@M.,22>ZI +M5#L#B`K=WO+HDA4J@:79'ZK-:1O.O/W05`2X"!`'Z(X(,EP@CNHWY(P84.@N +M@'WW3$F(Y3R0[OREJ:701`Y0"Z0\&1!Q*41#6QMV3.,NW.F4@<9&=D#_`&WV +M*D86B3@8Q$84Z9 +MPTD2/LG!YS&WPD\!I<6@ELX*<*%HB=]L>Z?!+2XR(C'"9I/`YW31!COE`1]+ +M8WD\X2<"1Q`.R$EI@`00Q31Z<9`]T$A@S,8&$FY(`CZ(0!(V$[3.?A%)C?< +M(O18#?HG`+6->Z(?C[(=Q^B=Q,MD^PE$,[5P<#DIH)GDI5!#N/@)-'K$.F$! +M.;I9)<"(G!W48G5O$G8HW3DNV03!11D-T$`@&$@[88QN"DT"&S@E*/1C;LH@ +M00\P=OA&=R!C.)0T\&(W3D'5![JZ#N/!,(V.B21GN$+0TF"G.V=D!TX)U#E; +MGA&N+?KEO6C#'`[_``L*1O'T6ATUPIUF/R8,YPI87E]0>$KYMQTN@YCL.`./ +M@+LNBTW5-,X$;]UY5^"5S5O^ET0=F`"3/LO9NA6^BFS&?V7&SEQC7Z;2AH)X +M[+5M@T&.V%2M6P,<]U;HNR,@?59;BU(:TYGZI4A+O;E1.S$!3VPVD*?6DU)H +M&)4C&2-X2:T1Q,(I:,3[?"H<#2()F#RF(G`10#A,[TLD&(10.I>C5&V.RH7[ +MM+'9V"MW-7T?FC'?=9=\^=0=RH.8\27[:3RW(E4NG!UY(:/S--+:X(=R +MH/#W6:-D]_G/`U#!*\N>?K77'';,\16'\'U`U?ZAF"LZTZQ4M[X.UF0Y:/C? +MK-"ZJZZ+A`9!(^JXVR+ZO4`."9)7&WV:ZKM?%]Z>I^&JE*H20ZGM]%P'X:6M +M>RZQ7-++02/U"[#J=84^D>6#)+8CZ*CX2LC1I5*C6$N>2DWKUC4NG+?B]KO. +MJT61EC>WN5@]'Z#>73FZ:+HVD@KTR[\/_P`=U'^)JTR2T1!"UK#HK+>D`RFU +MH[0N^'AM_L]W_P!#'PX3'"S2^X/P`%NT/"UK3A[J;3\C_1=2VTEA +M):.P3_P[BT""N^/AQG.GES_]'RY_63;]%MFL;I8W`X"M4[)M.G#6A:5M;9DE +M7&6[-.6B1NNDQD>7+S99=USKK5_F3"E%M4$`K;-!NK`1?PX+IC;E:IO^BCKVSRXZ9A= +M#Y!DB(X0U;<#>)A!S+J%5C9(.$#608(GE=)5M6.'TX5.I9-+L(;8E1C2[2!^ +MJ@N*`$P-^ZV+NPT9`YW55]!PG5'=-&V'5M&5'9:(&=EG]5Z!95J;@ZBP`C:]:\#TGS4HXGC_87-=7\)7EHPN:USF^R]IK6 +M\#+1GV52O9TJK-+F@@[@J62]QVQ_4YX_7@%6UK47N\QKA'>5#7T"F8&W=>S= +M?\,6EXPN--K701@;K@O$_@^ZM];Z#"?CLLWP[YCUX?K9>*XQ_J!=V&RJWE(. +M;@;[+4NK*O;^FJTMA4[ILM(VCCNL3J!SA-)PTZ6D4P"[CN44L_Q_J5%3<\,`#G$!/KJ=W*^IN%>; +M%Q700R<2J@VMP,GV[)%PWD`QLE(V$I.;F"443 +M1C3(E#4WXSPGW.!OB4+L`0B':1_LIY'F#\H'OE`W?:/=.!P<\H=E4TS$G*6) +MTB3!W)0U`9B1&ZR3_`$`01!V*$@%WM[2A($3!440+8DP> +M_P`)-]7'LFW$@@$<).:X$#(,3"($3= +MI]D.B&CU;IZ8/.?9%.W2'1$F.4Y'9XD\H""`08![RA`)[0/=!+H`HZB]KB3^ +M4`RFQIB!\%#"3E-SEKI*`FQHQCB>R>(&#N4)V`[CE.X>GCY"!VCU2,]D[@#.\I@) +M`EQ(`[IVF!/*(36_U"!",@:-6!/"C:7-.F)&$[LY&P/*`P&^V=RM"P8YSF@3 +M/8+.8'7_@ +MY58WHMLT<,'[!>G=/K#2#.ZY95QQC2HXW^ZN4F8&RIT'<\*U3<(X6'18IM$[ +M^RLT0`/T56F9((^JMTHP9V14S8#"XCZ*"I5/F1SW4I&(!4+J<&82K$U"H8,G +M,IJK_>4-,:0%#3A_'#'AP<) +MBN"2&,)'5YSXDZ.ZD7/:V2"N.?B]NFL<],FI;U/ +MX)I+IGNJ@K,MGR-QE3BIW#7U&G3,Y7*>'*_&O:`Z1; +M7?5*S1I(9O\`*[OH_2&6UJT:1,=E>Z#T2C96[0&B5IOIZ6B&X7HP\4Q8N5K/ +M99TV@@`;3LH*U%C7:8"TVTGF1D(769).)*ZQBLKR#'ID\J7R/3^671@+4IV9 +MQNK%*P<2"6R5H8M&T=@Z4?\`#/#IC!X"Z>\\L'LI!T\NC"I(YW^#($[J6C +M;3(^JZ.GTX!OY0C;TYK0(:$-.=_@L;;H76T#9=2;`%L`2H*G3`'9"&G/?PX: +MV0W"C-/3,#]UT3NG']5!4Z:X@]BJ:8+J<_EYW1A@B#QPM&K8.!(TE!_!G)VQ +ME$9KZ0&PW0NH-+K:%JBF9(C=15 +MJ0DGE!F/HASH.QY*AK6D[#9:3:<.)_=1UE[9"V:E"23'W52K3@D!NRHX[Q'X9MKT.+&!K_`&Y7 +MGWB?POTU6%C28A9E[:T;MQ:^#\J\7MO#RY8=/G6_MWTZQU@@[ +M0JO'8KU[QQX.I50^M;MAR\RZSTRXL:[A49!G'LM7'4W&YY)E6RM`U6T&V;'MJEU5SB',TX`[RH!^;=$\^K!!08=.8(X +M[J!-;_U2.R$M<)D0>Z=I@YPED`D.SW)0"]I(DB?JK+`*-E4(>TOK```;CNJY +M+B28VY3.RV!QPH&J/U2`C,'X28<29^Z?7F0<'NJ#IR':Q,QC.R%P).`#/ +M,H28.TH@2'9.-E#9Z>VYE)XW!;/:$MAV0ZR3/?94/Q[)#3W^H0Y<#`VWA,"# +M+H(*`G279PEI,;[YQE,2!DRBD:9S\!`+MH/Z(28<"6Z@/U1-TCN/=-5<=69A +M-*$'?LB)<,SN(3.(@P)0D@`X/RH"DY,<)'CW*8G,?=(.,Q&P0.)C3LG)(,-. +M=Y".JRFV@VHVL'$[MY"BU:=\]E=!W%SOTM(."$@0?A`+H!@S\H2'''[HR3IC!^0F(@F?M*H;3F2Z +M`4OS2(!]TX(CB1PD`.,=RH%`$22DV(Y/LE@G/T3C3&((F,HAVB"1]$M#MHG2 +M(1@P,X]Y0)N/G96^G/+:@)G&% +M4P3),@^ZFH%K8,Q"#Z&_!#K!J=.I4M660-U[3T>L'4FS\[KYE_`GJM*C>>2Y +MP&H[DKZ&Z-=--%I:<'LN.3EU77V]00.)X4VO.)PLBQN6N$3^JTK7U#^9EKMU8%RYH_,M3R5+XXZS^)I.;^Z<5J+O3@2N7 +MI7;MR25)_%/U#2\_"W/-6?VG2>73?S]$#K)AF`/HL2EU"HSG;E6:/5SR2MSS +M?EB^);K=/;I,#/95:UA(,"`K5/J5-[W,`+I/)*YWQU@/LBV7053 +MN:'(;E=:ZE1>"1"K5NGTG">%N65BXZHY,!;=:W<#$3"JU[:0=059L8D!KLY"CN*;7D#A: +M56VD$8^57\HM.1*(RZ]!H!`;"H5:$/)B%NW%$ETZ57N:`TR1*K+G[ND"TF-E +MEUK5S27[+JW6[).B5;"Z>W3(G!A8P8`2"(CB%[_XEZ%:7])S0 +MP!W=>7>,?"E6SJN?2G3RKZR\QVQ\F^*Y-K00!.VZFI?F&-U4>X$1@-X'*"#3/J@X0.QQ,J4O@$MVV(0.#0!ZM]S*B(R!$@E"8(C@*1[ +MB7N>3E,6^D.Z`8&"4T0=_UW1%H.9)!0N@$_M*@:8WRGUY@?J4MX'*3&M[Q_=#1 +M$G3,QW1%Q&ZAHFX.-N?=.TY'LD1O'";\L'ETWBL"Z,B>?NOE<&#.K]5U7@OQ;>='J-#3%/V)/]USSQ^Q+CM]8]+Z +MB-7YC]UU/2:XJ-!#XYW7A7@?QG;=0H-+ZH;4Y;,2?NO1/#O7FD@&JT_!7&\, +MZL[>E47M#7$CE*RMM3M1PC#=1WGV5RR8`?=6(L4[66`A05'LIDR1 +MA6ZUS3I4"=0PN"\:^(_X?4VD<[83+.2+CCMTU[U:WH-)-1N/=:]>\0]3JEVESH/RL!]:[N'ES]><%>3/RVN^/CCM.K>.JKI#7&/EL=/:3IA]) +M=7O:!;5)SC.ZSO$/2KRE4-6DXP.R[K_@[:%0.:W3_97*G2V5Z&DM!/=)-,^U +MEW'GO1+R^H/%-Y,#NM^EU&XIM\S45?J=":VM(;'O""KTPAT:#'"Q8U[;;'AS +MKS]3653@>ZZZROJ==DM(7GM&P?3:'#$+6Z76K4:@:7'"2V+K;M#5WAREIO?/ +ML%C65Q,:C'NM>@6%HV^JU*FA.JNU0)1M>X['9`Z"TY^B!WY/VRM,Z6F5W-Q) +M@X4S+EXR'&5EE\#>5(VIZ<.A39ILTNIU6`2?U5ZWZN',+7+FJ;R2! +M,976NI4ZC<*C=V6#NNDRCE<7*.:0XR,J"Y@;-"W[BQ.LDM69=6NX`"TSID5Y +MF(4+V@L@MB5JOM"&203"IU:0!C9&6'?48.V%0N;.6X"WZX(&P@\JG6AWHB6K +M6TD[>&>-^@5:-R: +ME*GCF%RX9I?!!@<+WCQ'TUMQ:U&.`)(PO)O%/1JEEX^RY:CLJ.KUJ;*U*G5=396:&5`#AP +MD'/V_14GP#`D_P":M7@;JF/]54J#B=\[JT`2UI`G_)';5*#!4%>FY^K8M,05 +M&R`PB.VR$.]4Q*E@,TF/>UM$N<7;`[J*."XHW!NJ0"UO!E"8(`.4`#Y^DIL" +M)._;*.(.ES3(.W9,6MWDQ\H:"[V)'PD08TS(Y3@`S&!W"1`+2)D[;) +M@V#G>82!D<_912!@Y.`G=$C.`F($@$004[P)W]T`@2[*=QQ)^GRGB`29^(W3 +M:0002/V3F0()(0N_,1G/'=`+B8B1',)LGW[)W?_'9CG.R$.,SCX"-K8P3OCE!'IG[[J`B1(C8[2G$EI`'ND9D;93& +M9S$H'GU&!`A,XNS`PC:"3$A`X#/Q%NK2X:+EYLFI3:X5.>G>2)KM/O*+_SI +M;&`VN"1C&?[)N4>B5[T-F'?""A<^>,.,''RN/Z1U5_4BT,G2>2NOZ=3;2I#6 +MMR;9VNL>6'\TC]D]UU"G:T2XN&%5N:K:=-Q)^ZX[Q7U-Y8ZFUT`*97U:DVF\ +M4>,0POITWKC']5=?57>8=S*C?:/NJ^27%:%ET.'MAL^Z\F6[7IQD@;>QIW#- +M6G)Y5BUZ'1G\@QG9;G3^G!M/0=BM.C9L:P`"/E6+_P`<]2Z12`/IB.5'$]E5M +M[44JF<05&H@T.:T@#A:/3ZCO*#3NBI6S2Z2%*VV,^D?"B[2M,C8?=([R%+3I +MP())"*E193:0R0)P.RK*HYA)QO\`LH7/(,*[59I$JI787.V1=&I5#\(C5]4! +M0GTDD[A1O=I((,PIH6WU!I$#=0.<"R1(^%%K+G`26I`D:H)DY24T-]9S8TJ> +MC=O8R0X[\*EL3G!4-2L6OC/PM)9MTEEU8C#C';*U[:_H5J8@B8R9W7$4WDLP +M[Y4E"[J4LASH^5TQ\ECCEXY7;U&4ZK2&@+.N[`#(;NLNSZN6.ASX[Y6O;]1I +M7#1Z@O3CY97GR\5C(N:)8XM((E9EQ;.+RVS@8`$+,OK?09Y"U&+-,>H/3J+=/UE4KVF'QZ\N(R>Z;_@]O +MV"W_`!=?W*\#NZD/APSR=U4JOAT@8XY4U?\`.2,859PAW8>Y7.NVR+H.TB,% +M,7##HC'>0FQ$B$S@`T=SQMA0V,U6;-!@C8H?,TD.8=MI0%H`F9A`(,AT^R"5 +M]8OJE[R2YYDDF24.L3JSGNA@:9!Q/^PE&(S!W0V(5#N`2"93O>#F8]O9+$S.P022,DG!2#O1$X''NHY` +M[YV2:(S.>Z`@0'0-MLIVN9D\;*,@S,XC9-`!DN@'A%'Z9U<#$HG.86CG/*BW +M>R'6W0TM.1PHL@`0(&Y3`8,9A#:1SFAN\CO*4LC\V3R@CD8"1 +M&9*(P&@%TQNHH@9VYRDT2 +M,J&TNKT_F&/T14:C09G'90`&,?;NFC.VWNJ;62[UR#(D)FS&#C]E"&.B8._& +M82(AOPH;3D`#?9"/SQ,R@9L3,':"A&"8P=O=4VL?TB=C[)B?4,S.)4+2YVD@ +MP!LE,;*&UAI$!TB/=`XC!^ZB'IP23W3.RT#GE71M)N![)X'$Y*A`(?F8GNG! +M(GV]T5,WL.$F<-])A0DGO\P48,N:9G"(E#23,_24X+2!`CVC"BUG,DMQPFU8 +MR0"-LY1=IZ<9''S!2:2)$P.Q4<@/W,3K&))X3AQ)D;;C*AI +MN(V.0B$ZMX]DT;3-J.;D3@YA7+?J%RT'2\YBG&:!TKIS*(!?$K5H46X`&%%2:YYX4]'7OL>5C;K(MT6L`G2G>0'"% +M$R3N8Y1!CC`F5-[;D.XZA&`0F;3^P1BF=)[J;R@Y@/[J=KPA\OG,*Q1;!C>$ +M@SB"/HC8P$AORKK25)I:3D`=_9(6[=)@#Z)B0-A/"-KQMA:E9TJ5:68CY4#[ +M?2"8RM%PE^P3:0Z,*5J*`I13_=4G4?YA@8'=;GDRT[2JXMP2#A9UPUM4MZ`@ +M$_JIJ5-IF0K#J):.WU0-9$08/92B(,=JP,!3-I_RSW4]&F3EQ^JE%.7#N4D& +M959B'#!Q"J7-*#$;=EM5J30W;*HUZ4O@<;H,FNQT$D0J[R)C<[+3NZ3B-L+, +MK-WWQRHL!4R#$9[)A4+1,92;)$&$&\JE-4<">Q]TWE!XF2/JD]P!@CZH758: +M2W*=()K0UF#,IY;$"%!YH&"=NZ'S@';_`$2&DSAWW1T*]2B):2(XE1MJ@GF4 +M;(>V"5N,6-CIO6"QH8]Q$]EN4;FE7HX>,KAZC8!(,?W3V74*U$^EQ@<%=03C*KW%LW +M20&_5:5S;Z'Z@JM5P+M)V"#--"F#!R4WD4NQ6LRC1+`2""47D4?=.%?)%56?O.XXRH])J@@$.TRWLHV@@',GA&]QYR.4SO +MRDR,<(R"1)`W^4B(V!2G>&IB3JVX[HIW:-1`.`<80.B9!(([IYDP2)[IB2)Q +M]D#.=/(^Z)H@:L'ZH3&G#3O\)R8B#G]$"=J(_U3M$X;B>$YD`MF0=QW3-@C+9(Y0%I;K)VC +M8=T-0R[_`%3AH<[N!PF>-),B/8H'8).9,(!IF/;!)1$ZL>R$B,<]T#@0P'?@ +MI@9/Z).,-B4FG&V_*!P`1C/LD-0!]1CV3,.(`^,HFF),8^4#C5N/L$[9/IC, +MY(2$@8Q^J*1(:1]$"(],0<<)J>F-DY@M$?ND(F0J&/I<5+3(,3D$IG!I!.QV +MA.&P-ON4"(!$#E=A^'7AQW4;MKZC)8TA8/0.FOO[UC`PP2O>?PZ\/FTM6`L' +MRLWIG+/UZ=#X.Z*RA2IT*;,-'*]+Z);MH4`-`"R?#5@U@!(B-PNB>6TZ>-EB +MNF7#U)K2F2-ONKU"G!CLO/>7IQA6S`QHA3&F0"4@`'2<*1[FAN( +M6:Z2$P"6XP5,T#&%`Q[2_)_56&'MNIMK22FUNG_52M'HQRH&$ZO2K5`#3_=6 +M4T`,,0!",LT@3^BD$.F,)G./*K*%T\H28B``GJG_`*E&7`[S`02XB)1-B9C" +MB8X1,DX1TG09/*FQ/'I@#Y3^6,N)@CV3-)(D(Z?YC^J*!](O?`0U:`;D?16& +M-&8'Z)ZE)KP`X2.45'08W1&".Y5@4QH,)4F'4('W4^D:)'*1*I5*0!DSE5*U +M(:C&Q6C6:!.)A5JC6S);E18S*U"096?=6S1_3!6[7``^50K,#R3C"G2L-]') +M)&`@\HP?9;#K=A&!@JLZD!(`0K(?3)!&WNJ]1C]/I(^@6S5H`B`,JM_#:21^ +MB:1EO;IG!*A#'ZCO'*TW6WJ,A)M!H$&$TNU&DPG?CW5BG3@;[J846L),)5:O2#G;;K4K"FUY:[4Q\%;/1.LN8[RWN +MU`+*=;$B&/< +M1_OX7765[3O*(@CW*]/B\ORO+Y/%KIR74K0LEQ'ZK%K6O\S6Z3"[OK/3@6DM +MV7-=4M2*1TSCL%ZIR\MX9#7M`B?U2\QO0<`!6*YEQ;`&..56>1Q"E>H+@2/8)/!D2-TSMA)QV2(F'$X]D-&<,X[(2) +M))&41`'9"X]T#$&9@&=BD9`B"2$PSMQPB4)@#_1%3=+80/+MR23WE-LTZ@DZ8&04TX@ +ME$.!Z9S!2W[I9#1.4I+M.?:.Z`?3S,<)`$DX=/`2AP<J^GJ;H +MU;>K.Y00TGL=DY!C4[Z2D3)D'/NA#`@..GM&R0)`^>R=I+4T>F"W=)L!ID?14/=.I.JEU*G +MH:=FZIA1N]@B#26ET8:)WV0F-!Q]5`Y!<=1&!RF&Y@>^Z0(E.8!$85":V3D' +M"<`:<#;=+4T99(/)*=H$=^Z!"1$#*<09F?HD1MRG='(DSW0T8>SI]D]-OJ@D +M;[)@,;F?E&(&^_LBB.6P>58M[>I7F6^&B%3Z):!K!A;MM3T`8^'3'SI:,GW5D=%J-R&N! +M"OK4]HWK6[-5FH'Z`JRR^+?S#3[K!L35M7!KP8^%J4GT[AHV"FMK&A0O&N/Y +ME-4K!W]06-68^B8&J!V34;PZH.RSNSMJS?34>Z7%`V=63`4=&J'"094K3Z@1 +M&5N7;-@R('I&ZDH@ALB$PRTG]$3()&(5TSM-3P8S"GIM`,A1,(.5*#VQW32[ +M6*8!@2BTMG?.TJ&B1JVE66%IW"!1`P[[(RW!F4@0`)&/E-J&IX(:[([JG5ZH8!UPH;\-9(:!/*R+IQ) +M@'*9$TZ&WZDW5)=,JT.HTW-`7$UKEU/)<<=E2NNN/I,($^V84F5B7';T,WK# +MC4/;*FIUJ+VP0"?E>3?^9;IE3,Z?=:?2O&#&U`*U32??*U,_\2^*NZOZ/]30 +M1_=6>@=0=0KBF2L;IO7;6ZIC2Z9&_P#L*=[VEVMI'>97693+IQN/RO1[6LV[ +MMPT1)&95'J=DT,((^BQO"G4SK:U[L]UV+A1N+4.!X7J\7DWQ7C\OCTXBK9-% +M0Y_1-_!-[_HNCJ6)+S#"A_@3_@*].W#3X'N-RZ8G"KDP2"#&RL5\F&S([*"I +MZJ8@F1B%-O2A._<#W2.H#V3NB3N1&2FJ.);OM$?"JR:">3\J!#,G*7S(A-M[)\=\Z=P:!D^^$HD2=O +MV0)F#R)3NB,QGNDX``9'U"1'I,<(IA^4$B>Z9\``C]D_],S!A*0/^H>R`(SB +M<>R=@)G.Z3@``Z1GA,#/$(%IC'"49!V^4XR)/"3))$9[94"(R2(3/V_=&0#. +M-]\JUTQ_3J=.Y%^RJ\NI$4?+,0^1!/M$JBG!C<=HW3"=6#D(FDZI`GZIRZ6P +M2/D;H$"TN`<(2<,P)^$((@#;Y*=TD8?C_P"Y`\C3_ACLG:X@[S*;$$S@=RFU +M9E`1)X.=D)!C"67&>P3`8,9*!`^J28'<<)R0-G<]LIB!/")C27`-&78B$"&/ +M43@IP#!,'2>3RFDR6]P8,IB0#I&8[%.6Z9 +M;I(/,H?S/COR25%$QQ+H(1F3&G[E-0\LEQ<7#'')4]M3+W-`R51?\.]/?>7; +M`&D@D?NO>_PS\-MHVE*:?J@25QOX.^'75`*[Z4S!R/A>[>%NG-H4VC3&%,KI +MPROM=-+HMCY%)N`"KUUYE.F-6(7.^(;\'4QA@^Q7*UJ17\0=1=5< +MZFUQ2Z#8N)#WY)]]E3Z=;FXN`]V5U%E1;3HC'U7FRRV]&&.EJW8&L;Z=E:%0 +M!NX5%U9K6Q(V[IA4WK*=(Y7-7?G]0N-+7'3^RT;MCZSX.%H] +M.LZ5"V#C^8Y6=;:WIF].Z2*;AJ))706%FP``-5>B[75@;<+5MW,ITY<8"WC' +M/+)RZ+J?3#2JZV<=E5%)E1A:=QW7++'7%=\56NK1U*H2V?E-;EP,+E.'2S;7ID%L0$MLZH"BH$>7JG=-4>5U[W3A'4(+L9&RC>!&6C"XN#C]`L3K-E+"0S8 +MKN+BP@2!C9974NGZV$'93U-V/,>LNJT7END$#W61:;@!R.3\+TOJ72 +MNF^0T>5_,`AQX/NN3\06MM3)T,?[+OO +M#GB)MT/++B';1_L+R/JE-S'DM'I.T!2^'>LU;&Z`.8Q!6KX_N+%LO%?072KK +M14:X;E=]X6OQ5IM#SF(7C'@[KM.\HL!/JB8/_9=]X=O13M(,0(V +MF=U7=(?&5Z;VTC<09`XY2JX`;!VS*?&L`NB3DH.=\;)0F@D3G?=,\.!S@^_* +M:21OE(N)(!=/RH&R7<;)`ZN3DP +MA(#$?N@/`<07`\2G1G.Q0_P!'O.^_A%X: +M%K:L?49ZW9_92UC.ZXCJ_`'0:=G0IL;3#0!L%VU.FV@WM"@Z?0IV](#:`J?6 +M^I-8TZ'?5SH=4N:Y,[G=!7J5;FK(G=:G2K4,:"3\K +MSYY;>C#!;Z72\ILN&%>KW(IT\QLJP(`+01E*C1-5^J?NN5=I(9M1]5\SOE7: +M;M-,9(,*2VLQL&G.ZLUK2&&!!C*QITE9U2JXU>ZN![BP1C$8*J_P[F5@8WV* +MMTQI;D9(315RQ9Z0X1C<]UC^-.M&RM##@#NMFU>T4R-B!"\]_%-Y<2!\_.ZZ +MXS;SY\./\5>,',8Y[ZPF<"?E5_-.ET@']%E>/7/IW08`=)Q^Z[C\"_P +MUZ'XDZ"[JW7*]8L-7RV4Z#@#L#)D>Z[SQX_6-^LW6A^'/CJJ^JP&J02=I^%] +M#?AYUD7UJPN?F!SLOE?QIX9'@_\`$3^`Z=4?4MG$/ID_FTDX!@;KW7\%;ISP +MUAF,?V7++#URX:W+'KMS2;5I;;KG[^D;:L2``"9E=-2@T&&(D+*ZU1:^FXM& +M96?)-QT\=U6-69Y]/4(E4*E`M>8^JNL?Y;P#SA2.HM>=0V.5P[>GI3HU#^7? +MV4E:"W/'*CKTS3<2!`05*X#(..Y5G"6`,->/A.ZH&[''RJU>LT2951]R"V`X +M+>V%]]UIP24A>-`!!SV60^L7$29E.R9P%A6Q_&`DP2)2_BIP=OE9;6NB#REJ +M+9.P_=%;3:NJ>ZFMG'5JGZ+$IW`!''.ZNVESD'ZJ+MO4R-`DH75`2J(NP6[I +MZ58ND?JKM(MM<&NB=T-;).1'LHR^`)2\S8?9:A2:UN3LH:C2YY4KW`@D'/RH +MWNS@_P"BJ*U2B`ENRR.IV9+3S/"Z&HTZHX56XI!P((B$B;:=\\.VOJJ5@7.))DSNN;\3=`M?))INTD;2%<Z3@!!$DSRG+CI`!PF=)`QL-^ZBFEQ)=RG@`Q)DH0X3(G*<.( +M.)5#P8&?LG:3$1DI,)&"XP0FGW_5`8#-&"9!VXA(^IQP`$.-0DY'9'J!,.)# +M9RE@$_\`+`G=(B!EVV(2`]6#A$0)W!$2B`R&X.4Y+HB?NG<0.,).@"/K\(&U +M&>2>4.2#D=OE/(`:3N<)SD`@B>W"*0@.D)F@EV-Y1`C3&`)V"3G1,``H$0`Z +M3A!$CL$3C!R`3\I`Y&=NZ!A.@-G!X3&200C=+8$C*;4)WCL.Z!MP)CY3QB9V +M_1,2)WPD\C&-T#.DY.\II@DD`GW[IM7J[)SET[(IR9C`$#;W2`)@3!2&!@"4 +MQ+-,YDH$<>G$1E+`<(XV3-P?=.)!]\X2C$NR?9`P)TD'(E.R3)T_=,V"#@R>.R=A8706F3L`@0 +M)D1,S&R-XGX[(0<2/L43W"((R$`@F0`)3$SD#`12.1$A,E8VP,M$#EFT&L +M:'$;=UH,=C?8J&BV:8#0K5K0+M^%RM=I#TF%S_>%HVC(`'9-;T&Z1)QV5FDT +M8(*RUI9H1N["DR[!4(@;'=.7EA$LP/TA#YT'3Q\K;*\:H([?L@J5=(D@J$.!V=[[IJSI&#*!5JL`F!["<*( +MOD\9"'U&9W0M!C.,;**D80.<3LG>[U1Q*B<^-MR4SB=."`FTT*070<*-S!). +MQ0PZ*SO3YSZK3K6US%0' +MT&22/=;G@WJ#J5W3;,-D3&W"['QMT2TJT7O$!PG^ZXFPMA1OAI$M!WGW6[JQ +MJ7;UBROV.M*;IF1O*E_C6+G+"NT6=($G#0%+_$-[E8W7-\XU]#JN#`YY*J52 +M`?1'NK5?#N!.ZK5A$C$;1"^C]<43R9/?LE$24[],3J@SV0N_)^B@8G.(2;#B +M9@XPDT$X`^R$MAV1D(%$)",SLGW$%+2=])`]T"D:0($^RQ]TH@"?V3M&=X^$0TDQ@8"=S1&=B)3R`-`!GNF('Y3OO** +M;WTQ\)&#G!^4OZ)PD-\8'NB:,!)C8)$!I(TIV``;_?*8S.P^RBIKAU%PIMHT +MG4H:`X%^K49WVPH7;[9/9.\&-XG@'=,9+AD&.Y5^AMC),I;X**1)*%D:23,H +M'='/Q,IH&DR-]DPY=)GY3R=$G"!F@-)G;^Z0@D\A.&NXS*?4?+#8&.VZ`,!Q +MB/A(D!I:0`/;=)P,9,2-I3<>R*(1$;'O"8M$1!'RA^3"(S&Y"@&)^B7>(!*( +MQI&3JY28`7?YJH3)B&F`[!2#6"?4F]IPGB^'*-'I%@*E0LUZ>#"Y3I56E9GS-/JX&Z;JO4;FYJ>6"X#L"8"7+7 +M3%Q]JWNI]#^DNJ%M2H)F,%>@=&M6 +ML#1'/'*\^==<9\B_TRVT@'*W+2B2T0(5>RHDN&_T6U:41H!7&NV,%;4,-&RM +MTJ3ALBH49:%9;3TK-=)!4F0-M]Q*GMV0#(F-E'1'J^BMT6SB$;]0BF=\'V*) +MU*?@(W,=P)"E#'Z?=#U5C1&D"#(,PCIVIU=L*=K3,'=3T6:LB%E?52?;.!]. +M%&:-0#?Z+6%$N(X1FVD@IK:,;RZ\2'$0$%6KRD`:U +MD",**H^?3W34B;V=PEWIW"NV%`ZQC*AZ?2+W_P":W[&T@`D96:W.#VM$0`!M +MN5:-`%L3(CNK=&UTL!")[`QIDJQ&<^F&S`V]U4NZH:R-NZL]2JM#?W6!U&X] +M4S]%-M:VI=;K:FN`&^ZYBZ=-:/HMOJ+]605AW&*DD+6*7A=Z>X-<"?JMBV?` +M&GNN>LZGKAI"V[)P<-BMZ8K2IO)]1V'"($&(Y5=@=C.ZFI%F))'$*[1,T&1B +M$;((AT(?,:!L-E&*X)SLLVM2;2^ANWU"@J/DF-/R4-2K(,<>Z@:USB3G"SMJ +M8K6(GORFIQJ@C?*9@EN94K&9!Y5BZ$6C$#(0&!,B%9IT^"AJ4A&)`5TS5&L1 +M.^_*A=`,GA37+!JGMW4%3+(!6F=&UC29$*EU1NJD((D^RM0`-Y3,8'-AQ)2, +MY.!\3].N:E-^EARO/+VWN+/J$U&:0X[+WGJ-JQ[(`PO._'/2AJ+PW:2"%TQD +M8]K.&+:5&FV9SCNI-;>Q_P#WE5MZ3FT6MTNP$?EN_P`+E=)IX77R_`C.ZKO` +M$G^ZL5LDD'_55ZL`[8/=>ZUP0C,YPF>#`C9$`-)W33$S*&C#`$2F&X<,)3+I +M!33G=0.7!SB?V3`8W,>Z33F"/[I\3DC*H+29#C!]A,I&.3E-`G3LG/I&2/F4 +MV'#0,A,Z0<(,PG)#0-L[A`A(,GG9(G&YRG).F!L$C!W,1W1##`P?HF!@ +MD(@(GLFQO)12'Y)'ZIB9;JGZ2G&TSD8^4S]Y;(4")X(@H7&#/ZS*-P)$Z8)4 +M>G)(/UX5-$UQ&0?E(?/*0!!,)X@3!0/Q";U;$[)V_E2'YIF90."9"3S@$P[&81Z8(S*0;V,^Z* +M`?XA&$33Z?=+CG[;)-V]E`^H:?RC='3+7.EY(&TJ,`!TI^=-J +M*,-`F=49*$X$<)G-!@,G43D*H0,8@?5.3D0!A#ICM@_=.TD?1021,>G?&4Q` +M:>X3R8`:9`R,X0PX.#?U[($R7&(E$6[%KI)W'9#!$Y1,^,'L@-KO1V*`3YFH +M\H@)`TPDS$3QN$&MT4C?A;-)M-U,Z78Y'=9/0:>JH&MS\K6KL%%FB#/*Q>S_ +M`!7J57`G\P'>5I^&[9UW>`@.C&^ZS&`UZN@-R>Z[OP/TLTRUY'N"N>66HW(Z +MCH%B*=!GH"Z;IU!K6B&K/Z;1R#$+>Z;1B#W7GW]=,8T.FT1`)"U*%/(@0.RJ +MV+-+1[K3MV"97.NTB:VIG3MA6&4=42E2;#8VE6Z%/GA&I$=&@)_+A6*=&?\` +M)6:3,[05-3I@[?:$:5V40.(4C*$M]O96J5)IYW1BF&Q&Z:6549:B1.%+3HMD +MX.%:;1Q*D9;SM,J6&T#*>WLC\LAL!6Z=N1`1&B-6VRK%40P@$\J-P(_=:3J` +M!.,*)]($0%$VR;BGJ!G=4*]OK.0<+=KT@W,`JI7:UL]NRB,2K;1@&/A15:+` +M!`,K0N2)G[`*G5(CU*;%5U(;DPH*M5K<3A'?W#6-C^ZS!4=7>0V3QA#6UD5" +M]_IX5NTMGU*@)'T3=+L7ZI=RM_I]F`084M;F)=(L,R1]5OV%`#C906-NYKI# +ML'A:5`0`8^4C5B3RVAA[PJ'4,-*OU9T[0LCJU0L80,CNE28L/JM1NDDOCV7/ +M7E4%QRM'K-7)B9*YZL^:D:E(TDNCJ9`S*R+X#(,"%L4V:QE9?5Z6G8+>+GE5 +M6Q)\[?"W^G@B).%A]-9#YX[+:Z3[HF;D@_W4-W@]Q\IJ)<>?T4+$U;+28_58W7K(UZ#B +M6SV6N#)@;?LH[MWE#N"NF-TX91Y[4L'-J%N@X*;^!?\`X"NKK,INJEQ:)*'R +MJ7^$+ON./+Y#N3+M,$_)4%PYQ`&HD#8RK-<:B`V/5Q,0JE<-V:\P,;1*]*(Q +MS!]T,^DA%B#F$V6ND.RTJ(`D`$PEQ[]T[AOD?"3V@#!,';"!-/JD&(]T0,NP +MXXV*9\BL[4S3F=/9-`/,R>$$C=()F2?F$PR3[!`3B-6!$Y2:-3PWOW2B=,'/(3$Y@!02,)#2,04&-6 +MV$G1\^R:0!M,@*A'2TDDQ]$P(P=,Q]D0PWN@&#)P(WA%27%4UG%[PV2(,"`H +MQI@[>Z08#OEQY2`(<"Z80+TC&)3#:0!"=H.QC*2F<`<@X]RG(.G\WT";8Y$`_JJ$V)SB/=,W_ISRGTD-G'/*0C2 +M21!X'=`Y$_/LDQOJ`G/ORF!!`Q]47],0-D!%HV).>R$M@0#ORI/3_0'("/27 +M&2=D#.$1P.Z>F/5D[);#;ZA"S88WYA`8$F92@2#KR>Z>89@2A`R<">R((MD` +MZA]$3.T'ZE-&T[=@G+73IB>%`;/2\0`83MU5*FV_8(*9),;*WT^BUQD3\(-C +MP\?*8"X>P@*]>.#OZM@=E2IQ3%+(U; +MQKVM)@\C*]1Z%;>70:V`)7(^#[-K7M<6@>\?*[_IE.=.!G]%Y\[MTD:-E1V& +MRV[&F!`P)6?8T@&:C)_NM6RI%Q`C/=<[7;&-&U9Z1Z<+3M:8E5[2EB./=7[6 +ME#?=9=(L4:8A6Z+(XPHJ#/3D25=MV>K))114VQCG?"G93<8Y*EMZ4%6Z5(1@ +M1"U$VAHTR"9`^ZG;1U#:)1LI@'T[JU09W(CE-%J"C;Q(`R%89;D"8W4LM#AG +M=$XC3(X2QG=1>6!QL@J,Y4T^O'U0N!T$`[J"/2(@M4-9K8]U8,=Y"AK"9VGA +M04KPAHP2LN]+0"=EIW8AIET3W6)U.X:`YH(6+6I%.ZJ9QRLZ\KX(`SV1UJI< +MXL;RHA:U'ND@=UF+I2F`$YMI;/*UI95*@UC3^ZL$`-D;%)M&'3 +MI@)G@AN\J-\`KO.GNL;JKO3(XY6K6.!WX67U$@L,]E$TX_KKX>'',<:E*,"WFDX.^(5>T=J.O7Z@N=GX=-_EWS:K7LF9!Y4;JD3)E8/1NH#%)YY +MV6M4<'&6D0=H3_#1KIH(G49]D#):V=7NB![C/LG#=+=$9*U"](VN!=`&?200?E-KI^_W7 +M5P?'U8`%QU2,S_95JA&GXXY&5/<..HDW"`B`6D3/\`=-I$3N-MR4X@M$P=/!35B`XM!+AR=N$-A(AN$VF1@?=%4+=) +M$1]4FX!P2@30=MCV2?E(F#&\8RFG!SG9%(F!`^"D!Q/T2!`/,I2-<@$0B +M'<-1!!@3"%['DP!MB`B);]1RB)D2XR9Y0`<-DREI$0=D\MUD@[;2B9),B".0 +MH!P03,EW_`'4],#5'9+^K?/.$3()$;'E0-4;.3VW2`,`$R1V1.`'NG8W2Z=_? +MNH!T`YXV2%/[+:8DK0KD-,3L.5S_7;P,81 +M.2LVZ63;/ZU>L@C4N>J^96JG'1QGB9S1JS]UB]-@W!+5K>+B"TG;V6-T36^Z[:3]E/C&3IZ+8MS!SLL +M?K+_=95_3)?EOR4E#/;*Z+H=:EITN@G;"XVRN@)#S@>ZU;*Z-.'-/U6= +M:JW>M.\M7-;3D\*AU_KUITZF2^HT1W(6-=>(&6]@XN&OQ#IW,!]5IG$$ +M[+N>F7]#J%MJ:09XE?'OA?KE=I:"^#N).R]P_"#Q,ZJ!1K.]0.<_*XV7"\EU +M\=OXIZ2RJ'56B"1A>=]6\WI]SZB=(.0O6[A[:M"<&>%P_C?I+:]%[@T`1O\` +M93/'P4-L-5,3!'96*3(GNMPM0W!#7P +MX:&DR>%0N7RSM"Z1QR+1J]0>(*7E'_&%6\QO^RG\QO;]5UT +MX;?(=S`,`AP[]U7J"'=YR)4]P6DQ(DY[(].F6ELGB#_DJ:"0!L#'M +MRD(_*1F-TGD%VXPD"-,R"XJ*0'H@[CE*'3,_ZI/`(Y^J=FDND?9`@&:#).K@ +M<)23C4E5!D'(D2A8`AH36G8'/L81`[`B.Q/"%H(_F3@8[IH9)R8^TH$3`B"G +MR6:9'>4_Y6G;`Y*%@D9)]D0S6#`GZH]()R=DP!`&84M33H])@#@JJC$`=@,` +M),P[5!(V*1,Y,`%,WZ<`.=$B?V2`#L1_V3DD`8CA3H,`_?V6_XP8VW:VFT-U;=H5[\.6&C +MTXAK,D3\+/\`&.IUZ6NF)V"XYYS?JUAX[;[52Z)0\RL=8+I@8*[+HEGH:V`- +MYPLCPO:%T$@D[X7:],M0W3I&%P\EVZ3AI]%MA`UUI'3[^RC<6;9@:9$*];4S +MA0T&`$*_;T8Y*-;36],`CLK5!D-'LHZ;6@*>UAPGCL5=":F`0`3/]E8IC$<0 +MHF`[*:EL!,!6"4-]0,HP!'RHV[_W4U(2)[J$`W>8(A3,9)S`A%2IAQRIPT!N +M4T(6TQ,$\)5H8P03E2NTB?=4>HW+64YD*45>IW(IL))7+WCC<5=,D\JQU>\= +M4):UQ*/I5`$!SQ)]UQRNZZ2:2],LVL`)9GW6DXTZ+,B!W0.+A<7K7_S +M#GW*\TNJ%?I/7J=1Y(:X[Y@J7VK>&..^7T;X:K"XI"I,SW74VE2(_P!RO//P +MVOA6L6YS_P!UW-O5D`XE7&\)9RV*50"`#A7;6L0T$D2L:C4(]2M4:OW"Z3)F +MQLMN1IW56]N?285&M<:6D3^JI75X,@._T6KFDQ!U&JV""`9"Y[JC_28C*T;J +MX$.AP^%E=1?JIGV7.UN<.,\6.!!D[K&Z!J%R6G'Z+>\3T=3'/VC]5B=#9%WM +M,G"EZ+'7VXF@`2W8KJJ]$ +M1$+.O+8%LP`MQ&`ZB1D'/[([>X=3<`XF#[J]5MP&$9SLJ%S1+7'>.86M;54?BAX9NF:JUNS#1D0<[>R]/Z9=.;4#7-AOLMFKTVTZE;::C& +MND=EK#+5<<\?KY)\,7%ET_QI:W'5Z`?;TJFI[*@X'RO6/_$'XT\$7_X?OL>G +MT[*YO:VGR'TF-FB`X$Y&TA:?XE?A9:W=%]6VH-94`P6#_1>&>(?!W5.FU1Y[ +M/29&QD1$S]UZ\?[>^WGRQF4U^&9T6L0]I(N$W>'`>+Z1H5!5:(`.3"BZ7?,?7I"#+MCP5T7B +M.C2K6K]0W"Y#H]L*74H!($X,KAY/R]F&OKU+I%8.MV@X,+0:26RZW'M`9(/RKBEJG>G+O5CGW61>U0`8=\+2OGQ.?E<]UNNUC'&?U7?&..5X5 +M*MZX5"&D0A_CG_X@N?KW;_-=IV0?Q=3_`&%W%5JN].D1!5N +MX+7OEK(G8`[JMN2%S2,@$2)R@&>%(X3$ND(1`/?V32ASI(@I@ +M.-TT"(TDD?;V1L$B"\#G)_1!IYS]U`B#JV^R0D +M081-`#ADHB!L'?W5@8DNW'Z0$VDGZ(X])WA)S=D#`^F,S^Z8"<1E.W:"=L)$ +M$"90(3$29W14C#FRT'V.Q33@YB.1RF(@9A`3RW=I4=:=3B'&"BS`@@2F-LYW09)[J@I))@Y"D-1SZ(IP(;[*-C9,$@>Z)H])R$ +M#$&3V[A(`B#"D;ALD84CRP6X:6#6#.J=QV326H7$XS/PF(=));]`C:9(,#/= +M'#8@E#8!J()&0/9"3#IZ.!IF"`>$PQ^5L'N@.D3.!N-TU0D-@3*3=X@9V +ME$]D@X'R%`!(#F@".,KHO`/0J_5NIL;HEDY*PK.AYM9M,'\R]J_">SM[#IS" +MYK=3LRN7FS]8Z>/';J.B]!I6/3?+#`-(R>ZX+QC18[K@I,=MV*]*ZSU.C0Z: +M\AW&%Y:*K[[K3JO+BO)CSD[R:EM;_ANWAK1I=\KM.C420"6K!Z#1`RW["GHI1!/NJ_1[<""0"%M4Z +M;`T8CX7.1M0N*3GB<_"PNOT&LIE[H$!=:]K0"3PN3\8%S@\,)5LU-D_#A^J> +MNJ?9<=XXZ36NJ(-,B09&%W#Z+G5O4/JAO.GBK3RS"LO&EN.KM%^$[:M&T8RH +M22`O3K0N\L?YKA_"EJ;>H.R[6U>&@">-RL8S2Y]M"DX3$J1U9K6Y.0L\W`8" +M2R>RZ&VIE\'/\`FI,C +M+'3'ZW2!ID1PN>Z93#;T;[KM>K6Q-N[&ZYFE;Q?2-YRM6\,1NV3]-,@[*>FT +MG)RGZ=;%U,$;J\R@`?WE,>6:SZM,021"KOH!_P#3]5JW%`$8(*A%&&G"VS6% +M!LL>O0$]99RT;[J%)S(:1]UF0ZM4]!D$K+N65&F"=D5 +ME>BW?+B2`N>6=^MX82+?B"U>RS+78D+DK*FZGU(:OZ3L%U=[U)MVP,F)[K.? +M9M%<505G/5G#4NNW0]`+6M!)(A;AJ,-'4:D'@+G>GO#6#U+294+F$$C(X*WB +M9(>HU@1#>5QWC"[\J@:3J,[\@I2P$Z09XGLDX3).23W0/W'<;H$( +MP3E,8G?!1`9Q"'?!_P"R!O8@GW2';!1%C@W+26S`(3.:0^1('$JAA^6(B$6\ +MG?;"%HR`"B(@Y"@+4<'@)#\LF4#$4HVQCW"<'./W3` +M83!L'`4!.;!("8>[3LEI`,28`S*<`:?9`P@`04@)G"1$B-B$6F&_"H;TPGF! +MQ]TS0=<3&.4S=Y/'NH@CEHS@)`#5ONG`(W`^)3&)[>R*?T@'T@CY03Q)E&V( +M(WG;A,V`_@9V"(:28R8E'ID0-TY)#2UKX!W2!@QW0)H.DR["+4(@Y*#$P#NG +M`;OPJ&D`@?NB<2`1&>$((!QD)F)=)!PC,MQ*"F,F!"EIM+GC2TDSG*@N]%8'7;7`1G.%ZAX4N7&M3H:H!@ +M&%S'@SI%-U'4X&>Z[?PCT84KP5BTX&Y7F\MEX=\,O6+_`(W:VAT@PXDQB%R7 +MA.@'W7FR22>5L_B9=Z6-H!RK^!+?8N$Y[+CCQ+8U;P[+H=``-DB>5U73*>1C +M'98O1Z0$8PNCZ53AX)V4VQ(T[)D1Q[+1H`$P!E5[1H!SSP5>H-;M*S6XMVS9 +M`,%:5N,#"J6K1I_-^JT+1L-U;A%6J$Z5:8`(]U7H@=HE6!M`$JJGIQ,*=CL1 +M.%!1VR-E8HB8,9*C6DM$?4*S1:V1.%#0:6^TJ1U4-W5V:25:[J;]-.GCG5FM``6BVKK:`#"P[*F\ +M/`+EJVI(@?ND6Q/4<\LCA974+!UP3JV6TQNJ!PIQ;-TSI]UO6V.G%U.BM827 +M#G=05K#2=L=UV%[0:&N`;E9-S1;L`5-2+.6/96K6OD"(6FU[64LIVTAO^JAN +MA#2&\+#2IU6ZTT708,+@?%+[BZF6[YU,&5D]1Z-0J/T:0>(6KG9#'*N +M:_#?JU>C=,HUB8G&/]%[CX=N&W%HTC)/N5Y=;^'Q1K-J,:`9X7HW@FF:=%K2 +MXDQNN/,K6=F4;74&`T"#&0N9-$-ZA`&Y767PBD8,K`#`;[5L96ZY1M]-MR+< +M1V4WDN`("L=,9_(:8X4U1OK.%TG3G6/LM>K1&8'TE4[FF0#`!51AWM)L:EDWM$`D@[KH[JB(]0"RKRB +M-41^BC6G.D/IU"YI+2M3I=X'0UYSLH[VD`2"/LJ<>55#FR"J6;=`ZFVI3G"S +M.J6@+.ZGZ=AU#> +M^,=.N6M.P71>+K@MMGD/CTG=9OX2VC+KK!K%N=>Y7HG3SW\O7>EVX'3Z0#?Z +M>58\@?X5IV=LP6K`!B%)_#M[+K'E?`-Q)JDSG=5WP.EY@0"<(4-!R3,),'I(D=Y3EPC`G +M*$F3/]D#N)VC?A.2YP&HR>QW0!_^RG)Q&^-^Z:#9!B-NX1GU.)(P3F,)@8G; +M/UA-)D-)$#8*AY$!K6DG^R4XVV288[#Y3N)!(TX]U`S2=XA-F8C'=&S:8QLA +M<[.V1A`T@-T@9F9X2).F83NRT2`8"%Q((B$T'`)]1!SRF#.R<9]Y2!W`&4[2([_``J"#HD&"(V*8$;C +MZX3$B,3GW3LB,$SQA1"8`23JX3ZMH/RG%0:1Z8@S,)C^>50\C5P)2)$$P/9, +M=$A$S000XG:0BADX[)-/9.V"1.>"B,:1IC"`&"&_*?&Y@?"=X$0(CDII!,DX +M&\)H)OOE$.^`WMLD0-YS&1[)@?5B/[J(=ADB`M#H],5+EK($SLLX1W``XE:O +MAMS/^(4]1`$J9<19-UZ1X.L7-HTSGX'*[BT'D6VJ,`25B^#:;/X.F&Z5T=YI +M9T^I$8;_`&7S[;M[,L9T\W\;W)N.M>6TB-41]5T?A"EY=LR2)AMFR!$K-:BW:#(,+0MP!OM/=4K89VV5RD1GD +ME%7*)C`&RFI27*O;\*S1&>))V2M1:I``S*LT0,$E04FY$J9KH&!NHJ8OTM]X +M5*]N!,:LA/=U@![K)O*^IQB=E+5B2M<:G$`D*(ND$3E5M0D[H@2,0IMK20X^ +MB-CA`(.5&R'$#E6[>A)]E%!2]3NZLTK<$"1NI:%L"9A7;>B(`(5TOLJTK6(+ +M6Y5RWMR`)^RMV]NT1'"L,I,V5F)[(*5,1B,=U.UOHB%,RB`,DPK%.@(!W6IB +MSMD75OJ!.!&2LJ]MW-<3NNJJ46EN6CX5.YMFO#F@#/)4RP=,KI[1S_\`!S,A4>IV8T'V755+8`0,E9G5*/H( +MVQ*FE<)U!OE.?MA95-CJESM,E=9>=,\^L0)AVZL]/\.`.U8.%B[IN1B6=H*F +MEI$+J>B6XI4P1`14NF"B[;;E:%*D`P8XX*2!1,[A8]@T5;V?=:/5W +MM#2TF.%#X>M]5?61REYJ=1TMC1B@&B9C=$]FY.ZFM9%,B2%4JI6G@?*HUQ.P^5I5VAQA4Z[(;I)"J1GW=.1,02LVY +MHF3^F%MU&C3@@_*IW3&AIG[J::CF^H4C!D[%8US#:G(@[A=-?T0YC@!(6+>V +MA#C@&5-MQ3MW.#Y!PCV];31:)B`C\_P!U7&!&HI9_Q%>OT>/V?!5TT3J( +M#>T&56J@1+3DXRK-P/YG`/;=05&>K2X<*O2K$Z9`!!^4GMTZ02W!)4`;B,;IB,Y*>!ID83Z,$E`+A.!*9A)&Y`]D,S@[)F$MJ-J`!VGAPWA27ES7N7,\^IJ%,0T1L-X_5!`P-`,C!_5.(X +M&R>!`<4Y:-.HC?*`($[3E-$$1RB($8R)[*ST9]K1ZE;U[VV-S;,>#4HM=H+V +MSD3PH*PS.,A,YQU2[C`^%/^488=,EPC@S"8@#5(:<1GA`+FM!'O[I-TD=C\I.:#_4`# +MV1A@+8)&_=4"($EHD:D_E,`:2_A-@&'W/=%&29.W?=/Y;/\8']T!#)F3"!L:-9KQ\ +MSV0!LMEDCZH(PX3LH=/6OPTZ[2T4Z%=X#L`2?9=IUR_I4^CU"QP&L0#*^?>G +MWE:U>'TW?E[+;/BB[KT!2=4,;+RY^&WIZL/++_9TW2GBKU\O)D:H_5>B]*IB +M&,#3``@RO-/`G\VY%0Y)S\Y"]0Z,"6,Q&Q7/.:X8SR]KMU'0V::;<[?JNBL6 +MRT`F,Q]U?MP<3\J-1 +M98(`D0K-%IB95<$@YV'Z*:@\GX^4VU%VB,`JU1C"K6WJ`5IK0`,J5J+`VU9" +M:I4`:/5!0EVD8^RS[^X+=7J@!2J'J-Q!/JQLLXU2Z +MGD3E7Z%)P:.RL460)A-2!=@8PK%(-@3\0M*DIB`TR,J2F`7 +M)`!V&P2G9^;M"HL4Q(]E-3$-Q^JBIG/]E/3$C/PMQ*"KANP,JNX'=6ZC-\J( +MLA^)"595>G3#B<"$]6D"V8E3,`#\B/=/6(`(^JFFMLRM1R8$86;U"WD'`6S6 +M[XB%1O=);@;KG9'25S;J.BX@C8K4L-#F`1E5NHTAKU-$'=*SJ^7$F5QZKI9N +M+US2U<1"JW3A3IND20,*=]VSRSZA*PNMW^#DB>)2UF1G]6K&ITRZ:U'#!S")X!&-^R"BZ![E2O`^(79R0 +M5&&9(QW4%1F8C'=6G-QOME05)F`JE5JK`!@&53>S)5^O.D\*K4VF=E44JS-! +M)5"\!+<8E:=U!DA4;B#@G)4VU&749)(GC*S[VE`+8,E;%8-!D$*A=AIU1OOE +M-*YZ[IN;4)B.,*`@;[$\K3O!/ITX69=L]4@^\*QJS:.JXND$<*M5T@1"FDD^ +M^RCN"-)!&58Y933*ZBZ).^E85R]KJL-'J&5O=3PUTD?*PJ[8?M))PY,JXKMC +M6+:6(B),*OU*\++=[FGU.!!,*%U;2T,&_99_7*[OX9P$1&4PIE&+;UA5Z\V? +M5Z^WNO:_P_I>784_3!(F>Z\2\)M?<]>:3_34X^B]Y\*L?3Z6QH&-*].$_D\W +MFO#3?T)0YTD[X]D`&X+D0@-$B?HA. +M1(R@=C?2-LE-Q,0@:=.YQ\(">WW3`ZZ1D@095(4F/68E(NA^_QE+20(SG8]D[A#@`\N`R3L@=CM.'-D +M1M*$.,'3NF:`1C]24I]1C"B#IG`](GY4M!H\P0/U45,8!G92VT>:-P)RBQZ) +M^'E.&LU8C$_9>H]$;AITXP%YK^'%+66DN:.TGE>G]$IP]LU&G"\7EFZZ1U71 +M_P#EMF8XA;MF8`GY6)TMHAI6W:-,`X^JYUN-*UG`S&ZOT(`ET_'94K1I(GZ* +MVP:>2HTG)D8)D[*2T$B!^ZAI9V5TJ]9MDC8B4T;7+1AU?FPKE$MF9D[95>@P`[1"O6H$[X*?\6+-J#J#B +MM*W`(`GW5&DX-P#*O4*@:!ZLA6"Q2;Z"1]DS"2^",;RDVLTX$2I&:"Z9&RTL +M'2,84[#J(,`2HZ6DN$?=3!XF`=D@D8R/ZL`*1CHV.V84#*ITZ<;J1KLC:2M" +M<.PF$%V^/=1.?I^4[*D"<*[-)7QI)D;J*KZA&)3O?)F,)M33)4%2L#JSG*HW +M^)P%H5R-EGWC06F2L9-XL;J-32#E8ES=Z'D-,0M?K`Q`.>"N=NZ9+BX$X7#) +MZ<$M:^/DDZ\]ED7]TZK5#9QLFO2]F!RJUI2>`KU;_P"["S[P2^`?JC3. +MKB7$[$9^JH7%,:'0UY]E!5?+C[*6[:0XF8$K/JO` +M>?40[A8OB> +MX:*+@2&X[9`6G6,N=JGPS^3Q>>HJUZSS734C* +M'^-I_P#R+!N6N-=YU')[H-#O\7ZKW/*^7:WY@V`3['=5J[8)])'"M7`!)*KU +M-);.?A<'N5WD;K./A,YIX./A#H+0 +M"(V^4B2T07$CLG@1G<;82ZH(")@X3.+=)W +M)3_T[(7-,?FQLH%)$PF$\$%/I($2DSG2=MT#`NDG5D^Z6VQ`QLD0>=NR$P!W +M^J51$_U2,\2GI5#3,M,&(D'9`UH.Z<@!`MR8.V8)2/M@]DT`'O\`!2`$D;_* +M!QN,Q&0DYL8@;;('#LG`@IHSF` +M/A.1C:#O@H3ODX0$T8P`4B)$:1/>4FMS,.A)S9=@[(@F2/\`)3V7_/;C"@`X +M*L].$5`,CX18]'\`:139(X7IW0A(;"\R\`L,,#B97J?06AM-N%X?)/Y.N^'5 +M=+@-:3QNMRR`+1DQ&%B=*@M&(6Y:B",;K%:C3MP/+YV5BGAH[2H+0"/[J<8? +M"RTEI.@C'*T+,`JE2:(SLKE"&MW1J+3<`DE5KNL`(!QV2K5@&F52N*FL0TY4 +M$-R^2294%>JPT@UM.'3.N=PFNW$-,G94PYSZ@RB=K5`-DP9/*O6T-V!PJ-!N +MD@;*4U-.2Y1J1KTZK0T$NA2_Q8#0)(GNN;K]2T#33,RL^ZO+UP])(:<[)MOU +MUV[=G463ET0IJ?4Z9P'97FU"^NGW'EZX.RZ+IM"Y>`XN*;OX6W&?77TK]D@Z +ML0K=&^8X8=EJTB3,%79H% +M5\'A1/<'#(^O">J8YG]E!DDPJF@5@'-@B0J=S3GLKSF0"3^BJ5ORF/W6NS;+ +MNF.DPJ%<<1E:=WALK-KCU?KA--13N&!X^%F7Q@XV'ZK6K2LV\``D@(LK)O2W +M +MCQSEQSZ=W^"[7/ZJTN_5>N=>J"E99($!>-?@<[5>NK:X`"]!\47HJ4"P/]EZ +MO!/Y5X/U%Y57]0I%Y))W3?Q]+N5GTM)I@D$HH9V*[^S$E?/=RQH&.>.RK/TD +MF6\<*U6>X$_E^55KETB2`2N3U(@!JDX"&-1_9)Y)=O\`5($ENXQPB&3L.4S3+0[3M]D`P9V/T2$P2EK)))W]BF:X:C +MG`0/EISRFV/*69$[#ND2,`2BF&<@Q*0!W,E$8G/Z)AC9N_,H&VD$2-X3-ATY +M._=$8,,[^Z4,F&X!Q\)W@#TDS'(0,R(W@^Z3BX^WR4WHT[_3**6EH&G(Y!.55 +M$2#$-(')W09`AN?=)L3))QC9.<&<91#AW$X"N]*@U@=PJ;6D@$`1W6GTND&D +M.QE9H]`_#_-8`#CE>J=`TEC,%>5?A\0;IC2['*]7Z""UC>5X\_[.KING;@<+ +M?M22T2L/I>X&WRMVT:-(GCAX(#42JUV^7$3A16U,% +MP=ND]NNI`,@*8Z:5/=-$A[BJ*3,X7->)/$C+)CB7[<)>*^JTZ-LXO>`!LO)/ +M$G6!>W[J;JI%.=X6+;O4>KQ>/?->A>'_`!11N+R7/G,1_L+L_P"-H5K::?(7 +M@5O6I4&MJ4ZI#VKL?#_BNG2L]-:H!A;PMG%8V/$76V],OA5J&&3NM[ +MH/XA].9;-#Z[!`Y*\:_$7Q"WJ5?RJ#O2WGNN0;JLJ0-2IW'A[S:T4P/E4K_I%[TT"H +M#+0?=3^6/;M,\ZJW+0`3*GJ.TD@G"AKP +MYF%C8RKQYU0`LR\;(,B/=:MY3AI)P%DW67;[_HL5O%2TG5$?5/I/,(B3&-^Z +M"8=!^ZQIO:S0QMN%J]/.`0G.55NG#20`M(IW+001NLZLT`GM[J[7<1,*C=.,F/T15. +MY=!,RLZ_@L)!A7;DDM67=O=M,@H,^NTQ(*R;W+HB/A:5Y4`$;$+*NZX)))D* +MEJA?._EF`[/"PJCCHYEQR5Z_'-.'DKT7\'!Y5HXC[_5=3UI +MI>#J)$9PLK\+K`T^@,K3EXG]5E5'EC40"B\UG<+>DV\%N7;-('IDY"IU6'))&#RKE8>C42T@=U4KQ,<3 +M*YO6@)B1B"FKO"36@/@=OE4.\$'26P0<@J>G7;3MRQE*G +M+CE[A)^D[*`-`)./F=D0D-@$`(&`],DC!2(;J_`1%HG83O*8-$@$?7V0T89:?G,)X( +M,C'9,1C';=2.CR\B%0,Z6D#&K=)Y=`U2G#89,?FV/=(M$80,9)B4(:?>$^B1 +M@0$;8TF9S[H!#009"8-_I.(1N:(=F$+FD@#4<\H&CQ>/VKCO'WB&XN*[F4G'1/=<5_P"H=4)=J))^ +MB]1;X)-2B:M7+CG*Q;OPH^WNH#-0!Y*S/),7T,)CU'-65.N6B7[9C=/=U"PP +MYQ`[%=)5Z=$KL/=J88!'U4'4/#%U;VVMU+*Z8^6.>>,_+D[>L^G4EKB,[KN/` +M7C_J'0WL8Y[WT@-BGZ`>&NKVUZR6O!'L5J]0H"[MM+&APXY7R9^%GXM_P`$&6_4*NGC +M43@[^Z^A/!7C_I'4K&F]M]2!C(UC_-7'/?%>?/QY8)NI]*+=1##J"S)KV57) +MP/==1<=2L[QYJ4GM+3[[K!ZZ^@X$-ZV.C]4%0:=0D?JL[LXKO-7F.ANJG:%&:GIR1\JLVL'4HE +M`:@.)]E*:*\+3.HX65=,TM*T*YEL<*A=G$AWT6:D4:DM)(Q[*"H\`8E'<.WQ +MD*M4J0V94;3T7CS/E;72WN(#L^ZY^W?_`#-UN])&IN^R%;5&IM`^ZD+B<'Z* +M*W`@2,J5Q:.8[:`PG(S*N$Y2ZDX875GDO<"9Y`5*@WS;UM!LET]X*>^KN=4E +MHEP)VPM#\.;=USXIIO$PS,_0KU7C';S7F[>R^&Z!LO#5*B['IR5A=4JL-P7& +M)GX6_P!8J.IV082`(Y7%=0JDDN(F-EZO%CK&1\_+^657V=2H!L2?NG_XE0_Q +M?JN6>^7DR<^Z;6>Y^ZZZ:]8X2X9',G;2#Z!K/YIV'^:J +M5:[)E[6O`P1IC[+S/4H5`X"=B@:(SOPK3G-8QX:^6NSIC*KD@B>WZ(!J%SW% +M[@.V/]^R",_F@SO*DC;4=QE"6AQ!(^@4`$&`"?@=D_IW=O\`*83>K,"1\H&:]P)(P"$W!).4^\"82()$3@I5.3@9D'A% +M4)D&2!P/[H&M`=C[IVN,^HC!W1#28QGX^48)W:0.P3:0,@X3L#9&H2#P#'ZJ +M@8(=)@E.Q[PSRPYL.()!'(_[I&(Q$#&R1$G3C3V"@)@)D'2"9WY^J1!Q(]Y' +MPF`Y..ZGI:!N3L. +MRXY]MQ>\#S_&R-H7K_0!#6#;"\B\$M#;_3.)V^B]=\/D:6CLN&?:NKZ61H$# +M$+6MB2(_99'33D"`?JMBS:/3&WNN5;C2M&@C;]%HT@UK?=4[6=H5@XGWX4;. +M\->\F<=D-=H&>>45(-&\R%#?/`9RFH6JE5TO+0=E!5.AA6P?943TEMR\D#=;=G85:]3;=; +M-KTSRHD9"7^79N8].:Z3X48^MYCV8/9=E;^#;+^!DDZHSA6*#&TFB!GNIA=7 +M'_*\PZ2NF,QCCE*'3W,IXC$KV2YL:CJ+WR` +M<8*Y'Q7T(WC7`M)XPLWCITPRW>7R]U2VT5G`;?XEDUFAH&73)7K7BKP15I7! +M=3:8G:%Q_4/#-Y2.H4G.S!PNF'FDXKV98XYSAR]-Q>T3.,J1N@X!,QNM"YZ3 +M5MVZGTG"/LLRK2J-,220N\RF73SY>*PJC@&2''.)'T6MT+Q'U+IM1AM;VJS$ +MEH<8^RQ'3N1'M$)WD:,8'9:NJY^M>P^&?QDO;6W#+ISW$#=I/WW6YTK\7&W_ +M`%1E#4X,.[G'_5>!!Y`#I$D3(&ZEMKFI2>"UV1V*SZZG%<_VL+\?973>HV_4 +M>EC0YI,<+.I7KK._`+S&VZ\6\`?B(ZRMA2KU':F",G??W6[?^-FWEXTL<2'< +MA9\EEF[VY>/PY89:^/=^G7C*EN#KD0KC*HD1LN'\$]4-Q9M:7#@[_*ZNA4;I +MR5REVWE-+I=S,A5;P#08&/V1!YU3M*KWE26D?LCE5"[AI,;*@^H3G:.5+?U# +MF8*HEQ\S<%9K<7+,GS02<%=)TD^F`87/=+IEU0?JNGZ:`U@GG@++5:=-WIP4 +M-1QA,PB,[H*AR?=:VD(N[[%05W<3*3G9CA05'K4*%S\\QW*C>^!_JB, +MX8D[G=9O4:@`,.CE61%;J#Y;`B?98M[6`:X=^2KMW7#3_=8O4:I>Z!WE;2 +MHJ[A$G8K(ZE5AKAJGOE7;IX;1(<[/>5SW6;EK6%PF7;DJ,=UG=;N@V3/I'9< +M5UJX#I@2"<-E;?7[II9`P`5QO5;B:CSK)/)7;";Y9SOQ1N:LO'IDCV7:?A/; +MG^.%PUD!HWWX*X>QMW7%ZRF&DS/&Z]L\*=(H]-Z*P-/K(EV9[_YKOK=F+R^3 +M+UQVGZ_?LH]QM_N5=\05A1N708U&%POBJZUO(! +M)R9A>SC%Y<,?:B_BJE3U^:&SPEY]3_YPJ%NXFBTM+H^`CEW=WV"Y>U_+U^D= +MGXR\-]/;3\QE,LJ'AIW7$]0Z8UCR((/*],ZXUUQU`TW?E'U4;NC6M>@T.'U7 +M.8UPGD]>WC]W1=1`U-)CF5"_2*8,[S(A>H=7\&"Z9_)<1&=ES]WX!OZ;=37A +MXY$;*;=9GC?KC3$("G&P[I, +MR<'[!4,79QQC9.(F7O,DIZE-["0]KFD\0F@3.<\(&!&0#)E,2.,RB:&YU`F= +MDTCL80(#G>$PTG`$0B@2E`T[01RH'I`!DDB>ZF)HFU`'IJ-,&,Z@?V4&S!P1 +MN40B<';.RH<@#'VSDHGZ0"21)0D@SEL>R9VEP`D;=T"D$$`1/NA>Z378.<[9*!H)VPG$#!PD!P?NEIF3.RH36@8)!E2!H< +M,`F/=`W><%2-<6[8/SNH!:!D@$CY3:!S(/.$5327$M$#M,H#$D"3]4!M!([_ +M`*I])#])!!Y!3"-')?QV2+3.<(.H\&4PTS`&)(717=-C6^IO')6+X+HES0X+ +M$[*G2?YM025RSYX>O#'TFVQTKHM'I_2Y +M;AP"IN:*M:^+/!U&I;.#*0'NT+R+Q)X9N;*LX%AB5]8=?Z53IT6N:X%K^.RX/Q+X< +MHW#S_+&<_"L]L:WXO+^7S1>652FZ/+/RH1:U0X^C=>T]7\$->\%M,#/`_P!% +M?Z1^'=@*7G/I^8Y@D-=^7]EUQ\UO&G3.X2;>"5:%2GAS7=LC*K.U,<=M)^Z] +MF_$;P>RM;:>FVK35:9FFWCM@+R:^M*E&X=2J4]+V&"'`@A>B>25QF,RFX73? +M56;F`<+T+HMK:LZ<7ZAJB?=>>VC8,!H!'NMNRZC4#6,U&!N)68WE>KV-352;F)"X8=/-Y>*O/?+("IW- +M0EN\2CK/AF<*G7<)SF5IYZI7U0P1.Z@MP7P3GV1WCB7'&$]AETD$_5*U&QTE +MD$%RZ*S_`"?V67TJB-`*UZ#2T`]ME%3,;Z!Q&Z"L1IV1>8,Y^?=15GG3GA6* +M@<<^RBJ[%&^I(Q$*M4<2[E6):=[X=&?E5JQ;$20B?4P2JUQ5):)@?"TQ45P\ +M]RJ55X;JER*XJ9+MRJ-P]V2#*H"ZK9*R>H59!`/W5B]K2>0LB^J03E:D9V@N +MZI#?4LN[<8)!W5BYJDR#.-EEW=:)DA7>F;RH=5N]!+3D+F>K7;7`AQU#D+6Z +MS6`$G\IW]ER75GZB'`B)5QA(RNNUAJ(#L@[^ZYVYESBX!IG`!5[JM8/J.:2" +M>\RJ=C1=5JZ&YU87IFI''+FNB_#OHW\5U-A73O`=/^BXR\ +MN]=4OW,_HM#Q;_P"JQMWY>K6W3!<.-2X>XU%H-Z;28T`-..96YTCI8-/43G=7 +M*]FUHPI:\#EZMI4;)8^?91:'-9_,9`_=;M>@T..<+/ZRP4[7,$\*;-;85:T_ +MC+OTLAE/HNMP6MI2J5;K+V/-3RW#V"LARAZST6WNF%KV" +M7=PN(\0^%:UO4+[<2)VR?[+MZOB&B7#S*+E`_KMH]_\`,C3&Y"GK^'3'.QY7 +M6MW4ZNFH-)&(.$#6Z3(=MR%W/B2PZ=?,-2W+14W[+BKVVK6]8L!MJ,P@,EQ2+\>EH$)M3HB/]56B>-O5MV3AIQ!W33[!(., +M[!$V<9R8$>R4NT@H2XDF44D#;]478>9G?L40&-\?"',_ZHVF#,1[;H'8#ITB +M!_=)C!)`$^X3`N#J_*G<"3B#'NF+F@"<%$"W2:_V +M:G3:\!,+KO5F?=>J=$PUIC/LO./P\I:GDD;-U9\0!M"F6@X"Y:O=>GVENHSF`UKD.X'"N]6ZK3LK')&`L2 +MCU!E%I).W*X?\1O$%9[#3H.=]%-Z;F'M4WBGQZRA4>RD[4Z8@'_1<9U#K_6. +MK.TAYIM=V_[+.Z;;NNKXU*HF3RNCI6S:8V(Q]UC+6+V888RZ8M#HQJ.#J[I) +MXW72]'Z=;4:`UM#BW]$UG3!>T`\\!=1:VE(V>&B8F96,;I=,H7 +M37%M(-DKF3T?^%ZH"#&<+OKRF*3W`-()Y7$>+;Q]"\:[8`Y*WC;T87EZ]^'] +MH;JFRD'0T-G==)U.>DO8\50^"/';+*BUKC!;B94OBWQ_5NS.LN<-HV +MA)-37USR\65R_P`>K'Q#Y\,K5AC:2KEM9U.HTP:,OC:,KYLNO%767534HEQY +MQ*[O\(OQ;%AIIX4RGK7+&^^/*+J-K0\Y^FG@ +M\B%Y'^+'A9U6[-]0HQK)+H$?V7LKP"X&"8[Y5#Q#T^E>6I:Y@)`X"U,JL_AE +MN/ERM;NH5M&W&$SG%A!'!7:?B%X?-A>NK"GAQ.RXVY&C):"?NNN%]GJLFMQZ +M3^#MVYU4#)(`PO;.E5?Y`)'"\)_!>/XDQOC9>Y=.`%N.#"QCW7A_4]IKFL9P +MJWFD.)F92KDZL$2H8=&ZUIY052Y[HTX'5R'B"OYME5+SJC2&RS< +MF5D6W3:CR):N_A;T5MOTQM0@A[ARNEN^(XYSUFZZBUMJ=I8-)(V7EGXM +M]3+'FFS(G/9>D^)KC^$L'DO&.Z\$\?=1-UU%X#@9*]N$]<=O!)[YN?KU75GE +MSC]$]#)AT.4#!!)@94]`MU`M])YDKGMZHV+=H\AL=NZ/2/=!;$B@T3PCU.[_ +M`**.D?45M0T4Q&,*/J-.*1(.0K]-N(4?4*8-J9WA9KP1S=.F*E4DF0J/6;8U +M(80(6U:V\`F/=4[JWKOJDMO8-&/+6)U:TA[FL!E==?VEQ@4W>HGZ +M*B[H]:"?,:2HSF3F6_Z*K6L +M2]^DAHWB$TU,G$U^E,V#=NRIW'3:@P&Q'.E-."R6QA4KCH#:KCY8R3QNHU[1S5O;5*];12 +M:7$]EOV'ABYJTVNJ,/\`DNU\%>'+6SH.?5HZZIYA=*;5M8M92HD1R,*V:#GZ-;F&&Y(!2H^'Z#20:1WB)S^Z],N[#RK1VH9/SE5K'IE%C-3F^LP +MI$][]W<>RXWJ'2+RT>0^BX#.87U`^R;4'J:"L3Q#X5M+NB6FD,[8Y3==,<_ +ME?-;VEIS@;Y0$D#!F>R](\9^`JM#55MFN,3L"8"\^O+2M;5C3JM'2.%$Z0<'Z(BT#(G[)B,SJ)^55"X&9+OT3C3J.N8CC>4[L`2XSW" +M"#/O/952@SB)2(.=@"EDDP=N2E!F"5-!S&H$'YGNDXX@"`G,$C(R4H,Y('8( +M&D:<8*6(.R9L`?F$)5!)&!\)RXN`DM$"!"&B +M)VV4U#);)D_"KM!QLIK=L.;)[0@[[PN\LL8+1D0K5;0^L`=_94O#CW"PV`(" +MOV-(FZ$B? +MMJ.AZ:,`&/JM>U$#(!]UG63)B``5J6W&%ATBW2$-DQ*BKO!@$A$ZH6L,B<[* +MM2FK7C@<)5BU1IC27'D;KG>M5F_\0#?Z6E=)>'R+0_\`V]UP?6;E[KXEN=., +M+.7$>KPX[=M9=5HT;)H:1JB-UG]2O/XPD`R5SEK6K5G`$D#Y6WTNAL9RIOV; +MN/HJOZ:Y[#C#ED7WAAE4Z],'.05VM-@TQ"I533`@[X61:L%$QI,K1H5-5.<_!7#"/5Y;LUX!4<97(>-.A" +M[I%U+<<+IKRLYK@!LJ3[C,O$3W6\;-[8FYT\O'2;NA +M2#C*W+NE1J'4*<&9E2L#!18QQB<+>7DV[;W!6?1+048+`0)5_R`^U@P9R0ICDX7^-V\M\.^(NJ=!O12KU:A9.Q<5['X +M-\56W4J+7-JC5&1J7F'C?HYKZZC&Z2V"05X7UND:5RX"9E?47C^WI5>GN`'J((V7SCXUM'TNKN9WSVE0>0-UY?\`A+:Z;5K]($QO]%Z53=%./9;Q +M_+Q_J;R.J0XD\\H@TEL]E'1)>\S@?NK=)GNJ\RO0HN=5Q^RZ#I%#0T$B%1LZ +M4OGW6Q;"&QNI)^6MKU(C3[IB<2@&1GA)VV^$#/>0<%5[I^KE%7V@*K5<"2)C +MY5*&JXD$*O6=C*.K4$C.54N'DM*UME'<$`95*LXP7$XX4E=Y.Y52Y=#Q6XEJO%^@UNI5#62L_IUN_J74FM@F#W7KWAFP%ITVF +MQS0T@!/)EZ_QC>$O]JY9WAUE*HQH8#GOLN\Z#:BUZ96G +M=N;0L]($$!=/T\W=O-^KSNM.%_%2_=2Z8\N]P#_L+P?J-P:UT]SA.>2O3/QA +MZPQSC0.'YDYRO*ZT$EPF">^Z^CGQ)'D\,[IPX:9C8Y$J6@X:MB1QE04CISG( +M4U$G8$D;KD[[:M&L/*;B,(_.:E0/\EOIX1R?\*;:?6]-LF..4/5`T6)(^(E3 +M`>O"BZL6_P`.&]S"S7AG;,MJ9-N9W*KW-,LIDD+5I4P:0T]E3ZE2.(Y*7LC$ +M;1+W&JX8]U'79`@">ZUC0B/A5G4QR$5C5K=[S$P-EEW5JW4=()DY*Z.ZHN/I +M`W45O92XN<`594L7 +M*5^B:1E7?#GA^:HJ5JVZFVN?K,; +M:.&&T84U&W=2;JV'*U_.81D0J]=XK.AC<`9*RK'=1?6JESR8&P'"(6S7'5L5 +MI.I:7/<2# +MPK(L6%N1/>5+(2V/F?Q!T:ZZ9<&G68=(Q,++R!!_5?1GBCPU9=2M7T:E(:\E +MKH&\?"\+\7=&K]'ZF^A581DQ@Y"2_*[XY>S'(+78^$,N$"20#LB,9,-2](=. +MX6V]@R9!.-TAZ20<@H\-<<80^GDJ!GD;MVE//!(^4G``CU2$B)/:!RJ'+70" +M!B,IMP9@GZH@,.]0CLF@`X(RH!9)SR$0+L@@;93M'NT)R`08*`#.W^JFMI;4 +M`/?91[GTCVGLI[8$UFD[R,RE'9=!J.;;MP(WRM[H=$U+QI(_J!/W6'X?IOKL +M`I@O($P,PNN\+VX_BV:A#@X#3O[KS^2M8NXZ-3BDQL8@0NOZ#3.(;(7,]-I_ +MECV76]`I;'(G9>:UN1OV3(;"T*8B3A4[1L08.(W5L;;_`"L5LUQ5TCYV1=+R +M^8&ZI7+R*D;B530<\[*SMJ(O%%X*=$M#L[;KCG-%2H29"T>M7/\`$WD2 +M2`=Y]U'2IB=ESSNZ^AXZGJN`$3*@I@QOD(WCT223B5TCR54NH<9V!]UD=8`%)P.=X6U5I'1)[ +MK'ZO0<_N1"-8WEQ%_5-.[+'0!,J0NBC(.47BBR=3)'C0?S=UG'J8MZT-S`R"-E;/5VU'-< +M3'?W6'>8V78+BDZB1JW/"AJ5#(SC?"FO7F\IRPR&_<*G>-JMI8!!GA734_U- +M9OU5&Y]MUJMOBR*>'?!7/VCJK()'/V5FGY[7E^C$R=U>9TSG)>TO6'^8QYT@ +M3*X3Q'8-;4\YH#3JE=TYS7L=KXGZ+G/$S6N<"TG=;PRU3&?':_@W=/%G!,@1 +M$[[!>O>'#YC))7BGX4/\MI&"TD)VG4YTNQ\RNF5TQ^G=K^']D +M*=BR!B`?V74D-C3MA9OA6CY5@P_].WT"U`S4[;`77#B/%Y;NI+2E+I/)W6C2 +MIPV4%E0),1]5<;3.T;>ZUVXGLVB<#"T[<"`)RJEM2@29@JVQS6CMP5`6N9$[ +M)B_?$H7GU$YRA=F/]PB[1UR""(S.ZK57"3D*6L8=`XE5;ATR`?[*I45PX<%4 +MZKY)"EN'&<'95:E4##HSR545[MXW!]QE4+BK(._,*:\=(D'?LLZZ<1SLM1$- +M=X$DG'*R[^J"QP`^JL75:6D?NL:[J$DMG'RM=,54N/4^2,;X56\K"G3($`_* +MENJ@8'.]BN=ZY?8(F.P":3M3\1=1\LG0U]7>_A;T!FD7503,;_1>@/MJ;6P'8'9< +MIX,O!0H-IC@!='6N@ZEK!P5Y9=VV]O1EQ1VA:VY@GZRL7\4.N4NF])J.%0-< +M00T'X*H=8Z_3L:[YJB0"=_\`1>1_B=XG?UB[+!4FFTD8/N5]'])CJ7*OF?J? +MYY:C!Z_U*O?WKZI>XAQ,_$K-,$`R<=D(<2222<)A!S$1[J +M2W$.S('N>5`S#Y))5BEE^JWZJZ:T^N +MZ5P`_2[!E1=5J--:FTG!5VO;LJNEV"/U697LWU+\14):-@?E3?/+PZ:%%@T2 +M"J-PT.N''LM"V86TG`G8*"G2PXD*6F>Y"J7+BYQ(!QL@Q^L-F2(CW7-R/XL@R +M#,1WRNCZXXMI'(F#PL7HEK1JW)J57$F<`;!:Q9R:?2K1SAD>DCLM!UJ&TPP9 +M)Y[*?IC=1\M@)^FRV[7IH%*7"7.4JSABVS&V].`V4KDT=.K+2MJM94J#2YX5 +M2C:-NJWJ9Z`5!B4Z=6M7`)=H!6E3%%K`QC8`WE;#K.C2ID,:-L*O4LV:,B"4 +M5EUF-VD(6-&DJ6[MW-?#23W4894:ZS;H$L,XA +M:70P'4!WV*J+6IT0'!5ZM`.)+R8]U?%(D845R`QDQ/NIH8]]9TMW.`5FRL6> +M6W2,#"&HWS@2[8<*WTTZJ!#>$4%:U]`[JK5MXD8^%K.!B")Y45:GJ&`)4(Y_ +MJ-$-,F)',+S/\;^B-K]/;>TZ8ULG41]5ZQU>EI:0N5\6VS;OH-PQPDACL`9V +M6;TWC=5\W/;I,$B9Y0-(@AQCV5[K5NZAU"HPA^'$01PJ+V^H&<>RW.GH,?S` +MR/2A&6Y."G!^H>)KYHI,+*,P7P/\U+=08?0^BW74KHMMZ1A^&[4-MVSN0O/Y+RZ +M3IO](8?,!P5VWA^A+`2,_LN4Z'3]07==$I!M`$`SN5QR;Q6Z3-.3A*X?Z8'* +M*J0%2NGR)#MEG;8*9UW')&Y5CK;W4.GD`XC*J].!=6U$\\H/&%8LM(#MQ&ZO +M4M;\>.\I&'9ESZI<3N>ZT;9A(L6=(M'NKU)L& +M%6HZME&%9^'62)IQRKI\.T6TSZ=^% +MNM9#X4PIE[<@CA;F$CC?)E?K@>J=`EITLW[!<5XDZ)=4*@Q>'+AM"RSVE> +M?=%Z0:5\1387$NG&5UEKYC6:#+2,0N,WOEZ/+E,X+Q1>.KL>&C2`"%P%C:ON +MO$)>[=KI_5=]U.AIZ'*&GJ+ZK@)G?ZJY3=C&.4QETZCI](4K=L +MB/3'Z*]:L+GB,RJE-X>0T;+9Z31)C"[O#GVOV-,-I@$94H:"XP8]U(U@#1,= +MT3609X*TY'8W2/\`-$^8C]T1`"` +M,H%6JX.)5.L\03'ZHGN#N?DJK<56Z2B(KBH!/;]EGW575($;_HCNJS9)G?"S +M;JX`;@\PKH#=5B)$X`6=HW#:=(P86Y&;=*_4:T&>RQKR +MY$$@?)"DO+K7))^ZQKZZ9)]7^15W^&-;#U.]`:>T&%RG6+AS@XD%L;$]EI7]RZU-(/(XPLV^]FG2X>N*]:]491Z@[2,3M +M/NK'7?%3;7ISW`^K,"?9<97J&C3+G.)>>5S'B;J=2XJ>7K,-VDK>'BWEM/)Y +M)ZGZYU^ZO[FJ35(:02_5,YY.4QD&)^@,IG.$@-Q`7M^/%KD[8&0$[RQK +M@&O+\"3$0>R8`:9#OLA;^8`$F-U`='&I+B&MTX!*53);I`506+R^:E0_"32AK/I@$:A.RI7-TQH(:`>_*T*EE2&3)/N50O*3=6 +MFFT0J.;ZW4N*N=`T9WRKG0K)CZ8].8RFZPUK7BGB5J>%J!=5;3`QW5B5O^&N +MF-ILUEGW6U492I,U&('"*U93MK8<+-ZC<&ZJ>32&.2I2(JC?XRX@1H!^ZOT; +M>C09@!!8VH8,1`W4M;TC3,E155[0ZH2!@*"Z:`PGG97"W0P[R51NG3,\JHS+ +MIH%6#GW3TZ>)`VRB<-50XDJQ18XMC^GV**HWUN#3EI(/96/#?J:6Y[M+0=,[K2%.K5:2_TM[*C?-# +M7P%"*XI#RH4?3JGDW9IDX)5ZFV:4++ZAJHW#7C8%%;=1P#9(5=M:GD$B5:Z6 +M^E=VW$J.[M:;7X_109?7'-\B8V'*YSJ`\RRJ0W)!X6]U\.;2ADD'NL^C95;J +MB:;&N<7!17A'COH-?S'W%*@2"XR0-\KC*E+2Z#+?HOIR\\-U*5!S*M#6'`_F +M;*\_\5_AN;FL:MHUM.H6%Q9U-->DYL>45-OI=$']$0;(&?T75_AEX2K^(^LL9I(H`C4Z-PK>$WI9_" +MSP1=>).I-.-?PI2.BFTNYE>A].IM%```+C_!EK+VQ +M]EW=M3`8T2%PR[=&QX;I@U@/<;+M;4BG2:-H"YGPQ;RX'3]ET55NEH`Q\KCD +MZXP=>I+`%3O'@-V$]RIFN&C:52O8\P;JQ?J[T:FXF=_W5#QDX:6,`,DP95RT +MK&A;:R`/JL._KNONH`?TM]UG.ZFGJ_3X;RVGZ91@-$'LMJTMB0(V5/IU+T@Q +M_9;MDP!@$+GC-O7G=!HTM+L[^RN4:)Z50R#Q[+;A8S7L()0O:3!.`K5>GG=,&R,$I$JN:+8] +M2J7K&M.`K]P2,;\3*H/IFH\N!='*;28LZM;ZG!WU1"FW#2-NRO5J$"&E1>3[ +M&=U-JJ5*#29`,FPATDJQ0M +MM+,C[IZM/&\=D`Z`:9(^JSNJ4QY1['=6*M=P<03$+,ZM?R/JQ&ZTO$PZ?==8\[ISF.9I&HTXTS*\RZK6)J:P3*Z3PG?A +MMMH>^2=LKAC]OUOOM9\37&FEY;")VA9W1[5P`>`02K5S2==W9=F`M+ +MI]O``(Q*J9743=,M"\@E=%84`T"1@*M8T=#0(6C1EL#=:CRV[$`V8C"*DW.> +M43&S!3NAN%I@-0"/\E$Z&A&\Z22>5#5J>F$5#7=P"55JEP:23*.O5@02%3KU +MH;$B40-:J(*SKJX&H]D]W7P1*R[NJ2-4[85@&]KC.5F5ZQU=%O[:I8M=2"L^> +M7>OCT>*R8[G:;J5"D+8LC`&%PGB&B*1/EM[GMA=C?7M,L<'>I<=XDKZJ;I/! +MQV6,.W3UX11:(=MW1^8[L[[I4"XT6D(O7V1M +M]F5?3;O=(&%!TMKC3)!$%7.HLTV3S,$JG9.#;2?ZE,?KYU6J4OJ;?9&]I&(2 +MLF$-DG)4CPA%.YIEPR85-],`&8A:-9IF(5"\:0[_`%05+MS!1C)*R;V&TRYW +M/"T[W3IP?HL7JSI],S/"JL:ZEU:??'*Z_P`(6IHVGG/$2N;Z=:FXOZ=-K,DY +M7.+JF@8 +M[H(J=,N?JB)1UZNEHILF5*QH92AIU/.V5:L[+0-=;+BJ*%*R#O75R>R+I=%M +M/J0`:%I5:0TQ&>,JG1IM'4&NGE23E=MFLS^6LJXI!SR3]%NFGKI;2:1D)2.8Z!3JVKWMJ,(DX5FY- +M4U-3*9/T70"U9,EH@)5J=-E.=()^$',5+$W+@:K?HMOHW2Z5O2UAH!4EM::Z +MWFG;MPM+'EC2<++4C&ZM0IN&6C[+`O+"FYQ$#/9=)?R\XY[JA<4/23"NDKG* +M_014&IH#F\J,="I`8:%U/32R2QYP<*6M:,95D9:5FPCSCQ1X$L.JVCV5+=@> +M1AP&0O"O'_@^[\/7SFOIS2=^5R^NZENWY6!XT\,6G6NG5*->DT^GE9LLNXZX +M9ZXKY2\*]%N.K]7HVE"G)>[/LOJO\*/!MMT/HU-OE@.W)]USGX0_AU2Z/U&I +M7>`XEV">`O7Z5$4F!K1@!:WLRRW=*8(MQ)&!R@LA4O[L!OY0>%!UFMYERVWH +MB9Q*ZCPMTSR:#7$03[J;33.\74*=KT&H2-F%?*GB(,K>*JU3TEH<>_=?4OXO +MW'\/T&KG=I"^4[C57ZR]Q.SID!D/)!`W[+6O6CRLJMX?IBG;C"N=0,49PN.3K&; +M3J0TF8`X51[Q4K_F^B5W5TT#IF?E5+)Q<\F?F5N1<>:T.HU&LM-!,X[JETRB +M7.UD`2E>N=4](SQNKW3[?32&%QSO+Z/AQU&A94\<+5M\-`5.PI>D2`M&DP1` +MW2+FFI9=LK;*9T=YY4-%F0K=('3S\+>+SY(:0=,%3-9(DIJC2,!/!;DG*TS0 +M5:9[B%$:4L_+[S*FUY@_HA.,]ME6;BK/IDB"-R@-`,W$>RLB29V^J187?V*) +MZJYH!P@Q*B?9D'MW"O4Z+FOS]T=0"0T*4TSFV8`,G*=EKZQ`C*O!AG`D!.&! +MIWV[IK:JM6CIID\K-NM9&,GNM.[>`#E9E<@$P2LY5O#%0JAVJ7=UE=8&V3?6H=+A.1PBZ#1N/XEK1,3]U?9;.JNT`3*Z +M;P[TAK*0<6C'LN4F[PZ^3*8SE/TRR8*'J;G=7+2T'F;):2RH!,`*[8N$\+M' +M@SR34*1!5AK2$31$>\!1FJ2%#4JQ*J)*M0!BIW%8 +M@;&4-Q7);^8?"HU[@Q'=5-E=W!!PJ%W7+@3C"&ZN"2086=<5_>1/":0US7,D +MG99EY=','Z(KRO`,&%D7EP)))6I"TKRN2#J.0LFZK9,';WV3W=R).8"S:U23 +M&J2[LJQLU]=%K<&"5D=3O@*;BYT$!2=1K:)#IQE<7XJZU3:XM:2#V73#Q^R6 +MR`\3]::QI&K(D`RN'ZC>5*]Q)D@\(NIW;KBI+I@]YRJ]2A79:MN'47-I/<6M +M?!@GM*]>.,CE:BUEKI`),]UTGAOQ=?=.:&.+BP<$E/W0[R)F +M-@@8OQIS'.4^H[Y^Z1T_[RG&?4Z8[JH=IYS]2K-&"\`X]U`(@<_"FMY#R).> +MQ5&M1@4FC*/[I6[6^0V>W)1Z&?[*;:?:'60!8NGLLSI;?->`#("T_$.EO37$ +M%4?#M-K:0,J8_7@R:#0`(V1.`DGA$\B1G=(@:KYCB2W`*TNIESG\85-E#55#`,NQA6*N>%:?EU +MG7+VP-Y(72VVN]J:W`AC=IY63;TVTZE.V$`'\RZ&T=3I,T,B$J)6L+3MLI*_ +M_*$X1B"W!4%5Q<=,X4$=,'6FN'0$B[2('T*@KNTMU$[(*U[5#&',$JI38(\Q +M\DHG'S:VMQP%Z:@A#26`*CCMJVH#K4$%5;IDF85SI0!L +MT-XR,B)4O;416C<>P5RBR20H[2F="L._EL01UG-I#\RCMJ3Z[];YTC:4=&W? +MZ:&:ZH7 +MOS./9*JS6R-_A2NHZQ,9Y1T$`'L56637I.8Z1A7^D5#<,\MYDH.HTP6$ +M90]#FC7$P!*"Q=6]2W,\*"Y,+"\+"K?76MTZ0>5G3 +M5='T2S;3M-3ADH[VIY5N]^TA:=*C%O`.0,!9'7V'0VF.5*U%/PS9&ZO?.>WG +M"[VWI>70T1$+&\.6C;>FUVDR5T$Q0D;PIIJ/)_\`Q`W?E=&J`.$EI'[+YPZ: +M[7U02`2797N?_B7NG-LW-:?Z<_<+PCP\[7U8-``),R.5PO-KT83AZEX<<\8.ZZ"TM"&3DK'\,4R6M>=B>5VMM1::(@-&-UY^Z^A;ZS +M2I:4X;C4>,J[2IG$H&L+2,`_"L,!C,$+>G*U-0:T>DA3M#1@'=5Z32!NI6!S +M7;Y6XYT;FP9,$(G`8(&$6B6Y.R"H9(`B$9TK5B0XZ1(0@@L@;GA2O;/Y1LH@ +M-+P)E&]"#2!WGE'0G,D_(34LMC*EIB0!QPC-@3JX$DIPP1$0C+=3_;A&&0-I +M[^R)I$ZE@&=E6N7.#?=7GDAA`5"Y>.5;-$FU"YJ:R1"J5`T?"NUV:C,*M78` +MTR1LN==\69U&'`MGCA8E>A#IW6S>&'23\++NWZG:0L5WQXB]X;R;IGD5'X,\JW9,=J!/"KVE/@[ +MA:5JS2((DJO/M-3:`U1U0`XRBJU"`H'O<79A/\0-2-.#"JUZL$PY'>5`UORL +MNYK@@@`>ZTSLKVN6YF2%G7%<:3!37=8Y=B>\K-N:I79#LE#>7;B<9G8=U3J@EI&O +M'&-M+0^)^K +MM;2=H=$#$%>>]5NG7%1SG$F3DA2]:OJM9Y`<8[`K+)).1^J]F&,QCC>:=P`X +M$_=*<:9D'B=D!'J.)^J>9SO\+89S=($[;E)PDDZJ]6O^H4:-*[J@TZ +M,^6QM-K`V=\-`[*@V0Z)(![JB5KCI@R/E34!/)4+7#<3CLI:3FSN?\E4;EJ/ +M_3MWV[*2/]PH[8?R&R\C&R.!_P#(FF]?X^Q_$MQ3/3G2HN@U*?D@2$7BVSI' +MISGM,$]I5+H%G4\D'S2.@N!$+F^MWU+\C#K)]U-#/N#JJ%Q=Z1[I +M^A_S*YJ$'2W8JJYEQ6<*;6D:CL970](LQ3@X.EAV0T +MZ[FXJCW!14M0MY.RSKVKYCO+;L-U)=73?RM,RH&-QI&7%`]I0=7J"DP>GDKI +M+2W;;VX8`H>B6;:%#(EQY6@X2PJ-2*M>?RCE4Z@(82095YXSN20J5T2!IDF5 +M4I4&R-7U073&FD3P5-;M'EQ&WNBK,UL)[)2#Z'#J43E6*](YDJKT0AM9S8V. +MRT;AL.]7=2K$=)K0R20$U*FZXJ[4`(W1?CPO\`\2ET"7-Q!;S] +M%XYX5<:O56D.'I(R!$;KO_\`Q#]0=7N@`8D',_"X?P#;/-1U:K^7G=>?\UZL +M9_&/3[*NT6S079CE=7X/+7U&D@#A<1T>7,:!!^5WW@JU.L%IDKS^UJR.\Z/1 +M!I@Z<+G_`!^2!Z=EUO3:99;\97)>/P"3)V"-1P=S4_GO\`2X\[=%T2T+*;=+,<0MZU,^O3E=W14BW?96:5-I;@XW5!CS/$!7K=W8;KHYU/2P +M(($*2!EW/""D,"<^RD<<;+;G]1ZCO&$+SF2/U1@-Q*BN,-#P-E&H=VV9RHW4 +MMD`8YN)Q[JRP>D2HHU1J"FI.]7J&.R%$/4R +M9",-T-R@!C\F`FJO])@E(Q8CK/R2/LJ-:2(W5MQ#B9.ZJ.#G/ALD]E+6\8B< +M#"S^HOAI,&0M&Y):V'`A9/4)N+;M@&4H!5BW.NIL<*M1:Z!$96E84QB5UKYN]K=I +M1!9)*M1I;*%C6L:-_IRFJF>R@"L\:H)^ZK5ZH:./E-7J`'*S+NX&HYF58E-? +MW!+3GA9-:O+LE27-=VHQ^JSKBHW(QE73-I[ROS)$>ZRKVX#?ZL=D=]<-ILR= +MN5B=1NY80TA;D8M0]2NI=^;`637K%YTS`15R:CC+C(Y[(6T);!&(A3:(:C`U +MNJ<_*J7-0MIR,&)5RY#:5-V#LL3J-UIEI]..=U9RU&5UR](IG5L)S*\]\2]1 +M?5K.#2<]N5O>+NJ-\WRZ;I:9!65UWH%RSI+.JM:31(RX<9A>OQX^O;CEERYH +MO?J@?^:<=MT>`=L]Y0`QOW[KLAC$>_P`I?E;`S\%(EG90)CHVWVA6*1(=C]5'+RGH +M#U#V*HUK:J]M!HEN.Z/SJG_3]D%`@T@8E'([+6XV^TO%;0>F.'^PL_P[_P`L +M"9'RM/Q.#_PJH0=@L7PNZ*4#)4P^OG9]1T8P)$0HZK&/&6S*.EJ\J>.%#=7` +MITMP(5L3;-ZI19&D$_`*P+FA3IOTM9)]UJ7UT^L_2P$D@+H:5"F*`;IA/^+"H%I9C=$\>G8@' +ME0U*;Z1EFW924ZP>!J])45&]AQ`^0LN^<-8CNM>K_P`LDDK'O/\`F'4>58E3 +MVAU`"9]U:`#V2852S,F&F%?8V&^RM2*MF!2O(F)*T;SUO;39,K)NWZ;IND[E +M=!TBTEK:KSD]U*U!]/M6TJ7N5<#0/=$RF!Z3DI3&_P!U&P/.D&52O:H8UQ)B +M%9KOWW"Q>HW&I^C[HBO/F/UN[\J5CS(:P%T]DK:B:D3^5:-M2938`&B?=$4* +MEO4=3+G'3[+"Z_;,;2.9]I74=0(93);V7*]5_FG1).5-+M1Z;;AL0T">0MNU +MJ,M*!U"'.V4-E0#&C4,!,VF;R_:&Y:-RKIEJ^&K5AJ^:3))77V09Y>.%D='L +M138(PMRC1(9B%ETQB&](;;N)/RN=KVIJ%U4#(X6QUA[F4RW,E4@1Y!EN_*G% +M6M3IU;18YSA2NLZY2:^^?7<`3Q(6#?AKZ[7'U0?C" +M\-RWV]V/4C0\-TJH8'O81)WG=>K?A_1+@WT[KSCHM>E6+*;-Y7K?@&U#*32> +M5F,]UV5*D!:ZH'RN%\?,+M1G`"]#T`6A/ML%PGCD-%&J=.S5:L>;63!5ZAQN +MO0.@6[6T6X_1<+T"GYG5"\#E>D>';9U>JRBW!)A<,KNOH>''UQ=/TNQ8ZT#M +M)(.9"H79T5BSCW76T>D5+?I[@VL-31D+D>I:?XHNR(V&RU9K289>UIJ>'#.Z +MNVT-<`-E0H/$B2/;*M4G(`3ADM47F%P``F$[7'(),)M-"B&2,PHS(:9*EIND$_NF>T8Y515 +M>9!`RBM7"F"YQ@]RGJ`#)/RH:QEQ`/PLUJ3:/K3FN#0QP)&Y"Q;L@$CLK]T0 +MT03!63U!T@Y"YY5WPFF3>>JY`X6KTNCZ!&25G6U#76!/!70V%(``Q$!B1 +M]5EW]S#3G*NDM1WEP?\`%,+)OJA+B2BN[B!(.^ZSZU0N<07+4C--<5)#A@E4 +M;ZLV)$3RCNZP:T@"7'8K#ZE=#45J1BU#U.X.HRX9X6-6+S4@9A25JCZM6&B? +MJK]I9`L#G?7*MUU$_P"L^VMI;J<,3N5*X"FWW&[J7X77%G<4]3F@P7#?,KM>O=$M +M[6Q=0\H"!M"'P-2HNZ54M:;(;D1]UZM7BUXO+G[33YDN:;J-5S"`(,*)V@.Y +M!Y!V7:_B=X5NNG==N'T*+G43D$3C9<;4IO:8UWY7`=BA!(W&?=+DP9^J42WOW[H"C_`#^%/:'^9,[F5"(` +M!$J:V.0=O=4C8M@/)'K(1X_^0_9-;TM5%IU0C\G_`*_U3AO3[7Z\&CIM68(A +M0P!Q4U%M2Z<&Z2!W&$NF6)?#GB! +M[\K6IT]`A@&.%!#2HBF!3:/JK-.F*7J&8_1/38&C41G]DY(+3$**4SF/HJMS +M5;.<$J6H^*>2J%1VIW*`*I+]R@ITW5J@IM^I4E41#0,G[K4Z/9AK-1W/=%6> +MFVM.G2$1CW5MVT):0/3`3&[HZVD`Q*Q.IM?1)$F%8E3]-/IW@JS7N#^5@U%9O3ZAF`)_1*N-+)!.>$Z5E=9J0V))_LL$TV/K!V5 +ML=6]1(G/L%G/I"F`9(`[HS0W]44Z&EL:CA:OA&RTTP]PDG*PZ+?XSJ+6@$M" +M[GH=J&46B%2-/I]!H&0KS&CX06M.&A2O&)V*Q76,OJK`^N&G8*&[L@ZW.@YA +M3U&.==XV5C20R#F%F1IQK[8T[QS7C=8/C)F/*;@0NP\0T]%3S&[KCO$+@0YS +MG9A=^(_P"43F,96!6BJP%@D$?,K7\7GS*[H,">.5CVY(G= +M>2UZI&WX-M3_`!3!$97N/@FWBBTD+R/P%0\V[86[2O;_``G0TVS!"2G^M.Z) +M;;P5Y]^)#PSI]1Q/'"]!ZE#6%OLO+OQ?N!2L7:3GLF5:QFZYWP8QKW^:<">5 +MW?0JKZ->G4IG+3*X7P++[1KSSW7>=+#6,'JSW"XU].36.G=W'7VOL"`P,JN& +M2=ER-U4UO<00?=*K(E15'2PD'=*2`JU),`J$ +M@G,IC(='[HZ/JQ$+%NW233,Z@3J*R;U[B[3_`(EN=1$'+868]@=<#G*PZ[U# +M]*MOZHF%LVM+`&TJ.RI`4Q$+1MZ0%.0NLFGSL[NBI-T#'^B&K4&DGMV*)[]+ +M2.ZS+^XT-,.581]1K[P0L>\KZOZI*>^N'/<<_JJGYR25IBJUP79$JO5>13)F +M25;KPUI61U&L&M):8A61+57J=Q!.5AW0=7?#3NI[ISJCHSGE6.GVLN!(@\%: +MZ9[5^GV#F&3![K4HT3I@&(4KJ6P@8]E(P!@+B`?=9:TK730UF7K!ZY/#5W7G\F7L\L\>6_\U\",+E/!\V_ +M4JE'(ER[_P`?4--8D`0N&L6AG7`T")*]&4X>?MI=1Z+9W=9[;FG3>U^\B5S7 +M7?PNZ#U"7TJ(I./_`,<#^R[2\?Y-9A?B0I[2K2B<'NL^NXN.5G3R"]_!>W-3 +M^7>5&CW`/]E4J?@T&"6WI/R/]%[57N*+CAID=E`74W3_`$G=3T_UT_=R>.4/ +MPFHTGDU*IC/O: +MXRKX"Z-5;B@-7PLGK'X;6A8]U`"8P"O2J5,3D94SJ;'B"$F$/>O!^I>!ZUO. +MJ@Y\(W6DFE4#CM$_ZKONJ=/K650TZE,5*8YY"ITJ+`X.HO)_Z7*S%? +MW*\^NO#G4Z+=3[O2=%2FX+UP.8ZF&5&9_Q`S"AN.G=,KRVX:\] +ML$)JK^]^7DNSMM]@3LIZ.H.DC1[95&IX9I-.IKYC`3IJ> +M25D4`31:>_\`U(])[?\`\RZ*U\.,_AVS,J3_`,N4^[D=/:/K6^:W^&>R=PO/ +MVN\KK3Z9.-2]"K@&F1R5YWXCFCXA='*N/&;Q=XUT/GGRPUF\836%)KKW^8=O +MW5?I`<:#71+W;+6%J*3!4_J.ZW>W.=-"FP.,```*5S6LDG)4=D[^3)^Z:H35 +MJXV"BFJ/)_+LA,P,Q\*8LXC`[*"X=VQA18K7;H!]4A5V_EU&9.%([UO/8$M(,]D%2J`<1*R^MTP:;OW6R]H +MZBL*^AMQDA4>K/#:&D8QPM#JE,MEVK*QJSG7-<,,C,>R1FM+P99E[Q4(.3RN +M[L*(`!"Q/"]IY=HR`%T=K3TP05:UBM4F@#9#6`\MW"E8"1)05VQ3<3V6'1ET +M\W!/NIW/8X`(K!@=4),;H[JUQJ'V4I&-U^D/X9SNP7FOB*N6U*K2=EZ=U8'R +M'@Q,=UY'^(#C3O*@:=UP\_3KXN].`\1UVU.H&F9WX4E&G0ITVET"?U4%_3F^ +MU5G`1QW5RQMO,+.>9]E\[*[>WIW'X=T:3M#M`B5Z[T$-;;M;,%>8?A];-8YA +MU8X"]3Z7`MQC/==<.&:;J[P6.',+Q+\=[TT:08#NX8GW7L_6'^EQ'9?.O_B+ +MOGLZA3IXC4#/U6';P3>4=#X`J"ITNFX?HNYZ;4EK9`"\W_"R\+^E4A@X7 +MJ'A:C3N'?S-@)*YV;NH^A>)RF?&F<`JM4_Y@.!*T^M6].DT/ID@.X*QZKX=$ +MS/NK.*QW-Q:HN&_"M:Q&%1MX(F2IVB#Q"Z,)A5(."(]T-=X<))^@43@1L9"C +MU.U;*+(.K^3='T]PDSO[JO6<"S!0VCB' +MD1W5NDX1M/96,W:Y;D@"5+4>-$!5Z3O2/V3U'?TCE;VP(.D=Y451X:=X33#9 +MSV4-2"9!6;6I#O?DG<*[TNDPTY<[?.5#T:R=>W0IC\NY*UNM6++"T#V&8QNL +MR6\KE9.'.^)G-94U,)(B%F68-2IJE%UBX=6J%L[&,*ST6V)`EIRLSFL^7+6. +MFA8LP,X^5=:0`FITFLI@`9]U%XMU%7+VKDC.ZJ"GYE9;ZC-Y1V%MK()$_*V*%NUC,#Z)K*B`P#WRF8C?9=L)NN.=X4 +MNG6>FIJ(6@]C0PCE*SI/J58+H"O/MVLI0!PO1BXUYSX_I>H_"\_1<-K[@$+K>8X_6CXBIN?4I%DY@2M+I/36?PP4G6E<6-$"?+'U5>[L*4$%FGW"U_*+Z\`>GVRI; +MJU_D$QF%K45PU\U]"OY>[95JVHM?0@@94G6+=SKO26R)S*&F*M!H:YDM[A7I +M$-6S-,ZL?11MI@&(RM*F!5IX<,]U6O;&HT%[:GZJ+M2KL83#CMPHGT*;S@82 +MJ6MA5UT&E_QB%Z!4IO9)()A +M05-3@<%!YY0Z=7HO]=J]I';*GI=.96U$5'!Q]LKMWTVU6!I;OP4%3I;20ZF" +M"-T''4>@-!Q&_(W4KNENI^GRI`Y74_P=1M3(EH.R3J0#3CZ(,&VLZ`H-&DCV +ME2?PE#L?NMIMO3+9+,^Q3_PU+_`?NIMMZY4,@8_5<%XWIZ.N-<=L2%UM1]RS +MTN$B,$+B_'-U5;U2DXC3ZAGMNKQ[1RF]5=Z#62[`F/=)S_,?OONE6BF(F2[A1H+6^8\4:>>\+6Z? +M1;28`&Y'95>EVX#0?ZB=UI-`:R.0%")`X-&Z0.=]T#3("-F7`1]4:'3W5EC2 +M6B3A!3IC$JGP">,K18&N9&9*HVK"6<25(*CJ9VE9 +MI%3KMN!2@65Q-,2Z2[W7?&QBINID. +MIOD<+YN_\2E$"_%3,2/[KZ1N`'4C.<+P#_Q,VSO(+QGU#'W4R[CO^GO\F?\` +M@RZ;)D/QVE>O=#N3;N#VNC$+P[\&[HL:RGL/^R];Z;<>D!T_=<[Q:^E9MTEY +M>/N1JZ3EC6EVA6!DK +M.L=P>/U5LDP%T8L2!PF2>-E'6>-/LH7EQ,;?"=C9(UZ,Y4[;7I$[NRE +MRUCJ,^O.Z:QH/N*\D3)W72=/H-I40,*/HMDVE1#W#*LUR=6(`3"L^I5,J2DR +M,F?D)4:$L!/Z(JKQ386SLG:!NG13X"R+UY<2-6.,JQ?7!((D;+,N:DB)W]UN +M33*O5ESR.ZM]/M3Z<2HJ#/4#"VNGL'DCNIE5D!3MRT`#,!,^6$P,JU5<`P25 +M1N3(,&.RS%JCU)Q+MU5I4#4N&RTFYIM:S;V7H-"A%D,0LCI%E1H51`C*WZSPRV$8PO3C.7FO2.WI:&^D94D +M.+<]E7HUB3Z1(1U+@Z8(A=)IFN9\=40^@[&87F7B6V!H.&C9>J>*:M-UL^1Z +MEP'7J0?:OFU?/O-&DD2MQENP4M.B0=UOCX* +M!J4KB[FJ`"=E:JVI%/+99"S[^DZC6EHD+0Z3U!C6-HUY@XRE@HU;-NN6%U,E +M0W5K=END5);\KJOX>TKT=3"V2JQL:8.G4/B5!R[NG78;K:9CA!0JOI5--PR/ +M==DZSBG`V5&\Z8'`@,!:>%(U6,/(J-P0<*&I1I%D`R#PKM?H;2=36EHY$H'] +M%!8-+W-([*HQ;FTAY+3[A%:$D:2#(4W4K*[M07AY>WW""Q>RHV8AP&0B'>!/ +MJ9'NJMU39O/Z+5#6N"SNH,TUH:@&C;!U(.C='_"#L%=M:8-NP[84GE!1T=G5 +M,%<1^)=,Z6U`V8(S]UVCW>@YA6-X.ZDZF^G3<[#@ +MMN]J-KO)X&RXOHD^:]S2!IF(^BZ"TKO-#)RN^7+G)ILV#=#-3#*M-N'.(8_' +MRJ?2ZAT@`_=7Z=%KQ),%9O"K#0P-U2-DUNPU;CS#EC3"H7KZC*C:+#(G.5I] +M&EONK5]4'_`"FS+C&$5&AY=#(]2@YSJE,-NM0&!LM'H9#@#V5? +MKU,Z]1[[H_#]08`SE;G3-[;>F:4.,R(6=48:5Z"#`GE:E/+0X[1W5+JC)<'1 +MGNLUIKV;IHM(.1&0J/4ZI=?-;4;J]^58Z6X&V$G80LV_JM?UIK9D#=-:MYY3<@&2IV54MZ1<=9,EQB5U7AV@&4FD\CA<]1+16:P8B-ETO2:G +MH:`-A"TD:](P(E6[8:HD*A2U/<,;*W2K-IMAQ`^JRZ1>D!H"K7IFB04S;NB3 +MFHU*L]KF2""#[I8NXBLY#\D3@2O+^HRN +MM._@QF]U@6M"I4NVN8--/N976].M&^2(&&@'4J[:5(D#$MV"U>D.;YK&U7^D +MVVWX<>ZCH.D@=UVW1;HN:TQD^ZY6VITQ3:X'!V70]&T!K8,X6I: +M.B8XN89[+R'_`,2EH7]"K/#3B#^Z];MJA\L'8+S[\=[7^)\-W0&?23/T*WE> +M-M^+C./#?PHN-/4&4W.V);O\+V?ICR:3#@[8"\%\"5C:^(RTNP'G'U7M_0[A +MKK>F=0R%C.:R?5EX=+;52*<']%#6J%U6&[3E5_XE@I_F`.ZCH5BZH07;]BI. +M$L;%K(:"T$_*NMAP'ZJA9$E@!*U^EVS'M+GDXX[KHY7A!;T"^I,'*.[I.8!( +MCLMRUL0(((@Y^$U_T[6PD)IGWFW-D$OP=U(Q@!X^%+>T#2K:3N$`@OSN%&JM +M6YTN!CV5BJ[T@1&%2`TM!:<'=3:G&C$B2M2L6!?I$GG]UTLD +MG`NM5!2HEHW*;PQ;^;4;5<#,[K,O+G^.O6TF8$]UU70J'D6K3$8W6I-W3S^; +M/UQTTWD,MPP=EE]0O&4:3BXY'5M-)QD!<9XLZ@?4&N_WE=G@1=9ZJ:]< +MTVG?;*&PH_U/YRLCHS:E>^#GB1,KI&4PRD!$'NL[VMD@:C@QF/NLV\JAP(GE +M6>H513ENQ]BL>]K@N.DQ*Z2.=J"XK9/)F,%1T6>94!,Y.$J=)U1\1N5J].LF +MAHG$%+=$@;:T`#7#*T&4PVF2!PC93]$!"_5&D+';>E.]?K):!!04+1`5VK-MK`U*C6-;DE=9T;IE2E:^EF8W6SX4\.M?IK5& +M9&'"V[6[[0O +M/NJL>R@]CL`=UZKXAI3:N)W`.%Y_UNU\RC5])F"NL<,F;X*I,9YCBX%HG^R? +MQ=JUW_4J%"D:_5'-W:#,;KECQ;3ZO>%K$-8'O'J//*U +MKNEI8=,XX4_3K<,H-],8E27,-89:/9:QBUS_`%!@<"1(C=/2M65[4.:WU`J> +MJR7N!R"I+-GE&!!!6F8KT65K?U-V&X**\K^8T5&.+7#A:/EM<9PJG4+1NG6W +M#AE(JWT^J]]JQQ,PBKO<L0UU([[JS6)TR#$%9BU%6N:E/S&C^I475!5O`'2)X6K:WUS +M4I-:7!W!;"L46VCW@7%#23RLW_"?Z&A3:*31JX1Z&_XBM"CTN@:32RLX-(QE +M%_PJG_\`,Y9Y::A_(3SRN0_$"H?*+)R=PNPJO#:)<<>RX#QK<"I734>3C4Y;G37%^ESI(VE0W'<+8Z-<#0)=[+K.6'5=-)V[;+ +M4IU&M:23@#*Q^FU6BFT@F85NM4):Q@_J.5*JU:-;5KNJ1O@`K2IVNBF'L.2% +M6L&C4UK0(`X6D'`0LJ@I5*K'^MN.ZO4:@J1ZOI*#0'M@Q]4!MW,'H)G=1II4 +M```=_E2^PPL^VN-(#*@,\K0H.8YHC,H"8R#G/U4]/#8RHFCU[X*E9@RBG,"% +M%=5@QIB22E=56L$\H+&@:K_.J_0=E*"Z=;D@UJDEQ.)5IS<;*1H`;M[).8"F +MFF%UVEZ"9Q\*ET,AMQ$E;'6J0=0=!("P^G'1=:"0KBSDZ>AMLHNH@&B9.45! +M[12;D!4^IUS4864Q)VE+`NGW#W$4VFTY/=GNN'-JU& +MG/\`B73M;9V%`.J/:(WDPL2XZQ;=+Z<8(U,$+S#Q_P",>H7E1]"VJN8V<1*S +ME9.VL>>(]0ZYXWZ1TYKP:["1PTA>?^(_Q5#ZSFV@)'!7G)H]0O:DU/,>3DDR +M59L^@7-3/E.'T7.^61TF'Y=/2_$+JKJX=.Y[KUG\/NI5^J6%*K6.7"87@W_# +M:MM5;YK2!*]I_"FH&](I0=FQ^RZX9^T8RFK'H#&M;2WX6;UHL;;N).P4C[T, +M9I<%E=9KMKV[@'QC98M='EWXD=4)NGT6NVW*\PZ[U5[:[J=&-1W<XX(P%X/-=W3V_I\>F\>)>YQ+BY>ZY:X +M;-./=<9TBX#JHU8@X`Q'Z+I["\8`-1DCL%X\YIZ;B[SI]R'4VDNR8$+KO#Y9 +MY()[+S7I-RX!CXQ[E=MX>NBZDT%PRDNT^.OI/:*\+70?94R"XD +M`+RKQ_1-CXKJ%HTC5(79_A[?-N+.F)F-\K.Z@=4@97.NLG"1E6&$DR=D+ZY#8#B +M/E0"K+S$QM*DHTC4=),#NEIZ_DF/J"G3=+_JL7I51W4^ +MK-`)T3_=+>$O\>:ZCPA;&I7\Y^Q/^2[#S0R@&@[+-Z70IVMH-,`ANZK=0OO+ +MGU+IC-3E\WR9^]V;Q%U5M*FYH\`*ZRE+HCZJW;6_J`T_*"O:V<1V72^&>F>9 +M5#W``*#IMGYE1K0,=EV71K-M"DT@?HNOCP]JSGEJ+5NQMM:@8!`63UBO4J4W +M!H^5LUJ>OTX`*I=1IT:5N[5!@+WS\1YX7$W0:+FJUP,96_CCDXJ_N'6=2HUN)G`*M>&:?F-\\@R3.57 +MZ_08Z_,@Y*Z+P?:4VVX:1*F?%3&?5AE9K:<.!P%!7J-,\8D3B5JW-*E!!8/A +M9UU;4RTC;L0K"L]P!=B-U/1I8"@J4*U)X+3J:%8M:S7$-?A#0].E\#`'9'5` +M=0@C=&\LQD05%)'!S-;-Y5#IU +M>Y?3+6C9+J4DW&N\-R7X:JM:M2:XR=DS:5>H`'NW3U+*B!ZQJGA38I7-:B>! +M"EL_+J"!D)7EC0\LPU4J5LZF^:57(&`@NNM?(JBHT0KU+16H9RY4@;A]`-D$ +MC*&UN*E"IZV$`*&FM1;IIALG"*/^IR"E>TC3!T%%_&4O\!472[U2MIH$`K@^ +MN4Q6O7@977]5JM;0).ZY&Y9I>^N2<[+KIRC&N+:F:+B2"6\!0=*<&W$.P.$] +MPZN*C]/Y">55:]S;C!@<*XI796-;32&95_IKWU;@N)PU<[T^M-O'*VNAU)8& +M\GDV3V")PD^R"C?-+Z3MX7,OTT^H$KK+K\D@;^ZY7K +M32V]R2)/9)Q4O32M"^Y(IM..5IMM:;*>1J57H3`R@T@[K5()8>ZMF^R*%DT, +MN=(Q[*WUNCYG321N%6J?RKH%:<"O9EL[A9O,:G;`Z.36_EDX:CZ[K(`!F,K4L<;F5R_;WVU/XL3IWA"RI``4FS\+5H>'K9@@4FX] +MEL6WE@"",JVQK2TA:](UNO)_Q(L*5N_T-`@RM7\*+F:;:,F1PG_%>AZ-0V!6 +M3^&-P*75=&I3QW5,IN/4KJV+Z7R%R_B?S[2@_1+AMNNXM&"K;-/$;K'\16#: +MM-P(A7+A9'SKX\>^O?U'N$9WW7#=;#R2X&1PO3_Q=L76E>H^F/LO+ZC_`#[@ +MAP).T+Y^#*ZKPQXVK47,96+H&#J)3+#[B]>%^/?.C515J-#CCY704JX +MIT8IN.<$+RGPSXE9-[=[TS3_#AY:-,2 +M5F=>O&"F]K#`*O65]19TUI;49$>J2N-Z_?\`G7E3089.%TO$>;#'VR-6NQD< +MJM5N!)@JK4J9&=U&YY7.UZIC%VE5.J,Y5NC0/A +M,=UG*1KWG5&`_F((&`L#K76&,8Y]2J,=RN7\5^*[>W+A1,N7+VESU'Q!?AFA +MY8XYB``EXYJ=3<=)4ZG6ZI?BA2RR8*[WP;T@6U-M5P`<%Z5G;TZM1 +MGJC)*W[RY%NT-;B"LXS?->'S>7VXC4JUPRE!VC92P$SRIA/M,N>(LW=X#+&9/R@LNG5[BL'%KH/RM+H?1'O<*E5H]Y746=G1I +M,#6M'9:N=O$)AID=.Z2&4Q(`*T*%DUIVA7]#)`#83N89VA8_ZJLVFUH['LB% +M(N$$85AE(`3^Z.DT:M/Z*[-(K>C#@%=H4X(`&2DUK6>H[K4\.VKKBY#W#!6L +M>6YJZ*BSTP1@)NG6X92#1B%.88W,+W^/'4>;*[0W!#:1("YKK +M]9SY:"M?JURUK"-6.RYVX<:UQ`[KK>(Y]KG2:1;;22K-%DGOE*VIAEL`,'E6 +M;>F/S'/LIC.$O9]):T#90U`(.5<+?;"@N&@C"Z1BLKJ4&@X?NN*ZG2!OGEHE +M=O?L_E.7(WC)OG'&ZU\<[VXCQ/1(N-78R5I^%:X#6Y/O*C\749:\Q$W77;0YD@JE4;(BQW5.],TRFD8M]0I-IN@3A +M<_3J5*%_#?R$PNDK,+CN85'J-F`TO&%=<:B3B\I:(:]D@&3RIB*9;#L$")4? +M2ZK74])&6A2UF@L@%2%*M3T&?U5.YH^OS&.WX`5[4`\M)P5!4!:#!,3A5 +M%>@\TZH!_+SG9:;6-JT0[3)'*H56,+)#H/*N=+J!A%-QP5FK%BE2:*8V1^4W +MV5RG2E@(B"B\D^RFFW/WU4O86Q)=C=<]U5YIWE.@X8G(6[6:ZG2-3VINNJ_F/)T\`J^ZV8]H;`$;)6S0P`- +M$0IVD3)32J['.MSI=,*];N#X(*AJ5&UKP^6,DK4Z9:MM;85'1J=[*MT.V:]_G5`M-C?XBN*;/ +MRA9O";#;6[[FM);CX6@;1C*4"![*]96S*3!C,)ZS6DSCZ+$YY:CF^I6T5):W +MY52E+70X8707ENTM)61=T@QVQE6+I);@1A6QKTX*HV[A$?NK5!QVU*K'*?B9 +M:5JG3G."\X\,=0?8^(*;7XET$KV3Q6UE3IKVG.%XCU.@]G67O$@,=(*Y?UR; +M[CZ-\*UVW/3J9!F0I^I6VIAYE>7_`(=^,6V[&V]P^"T1)PO3;#J=M>V^L/!) +M"ZW'?,9QRUQ7D?XRV+74G0T3*\9O^EOI52ZFV9.Q7TCX_P"DF]+BT%P.87GS +MO";J]8@LQV7B\F.WHPR]7EUC8UZ3R\M!+OT1=0#C#=,M9[KNNL=!%E4TO!PN +M>ZS;LI"8E>;R8<;=\<[:PQ7K4Z;:5$?)[+5Z+6=3:"1]5F&[IMJEI_-V0UKT +M0-#H:,0O/=[>C3LNGWTU`7GT^Q706U1E:@W3$_JO/>FW!(:[4872=-OFTPV7 +M3([[*XUF\.@MB16RYMM# +M@""IZ\[CKCY+B^;>D=4ONB]1\BJ'-T&#)*].\'^+;>X:T.<&NCD[JKXY\(4; +MNXJ.8S29D0%Y]U/I?5.C5O,87.8W&"KN9?Y7MP\TO;W@=8\VCZ:L@C@J(W8> +M8)V]UXOTCQG=6Q%.J\^G'JV"V:?CINQ(^04N-=98])JWD'!D;)S>4VLU%T%> +M5U_'#G$N8=("H5O%5_>$TJ3WDGM_V4F%[I);2V#O5+EPW6?$M[U% +MQHVVHR<`(^C>&.K]6JZZ[BUIS!7HO@OP1:V9:^I3U.[DG_-+G)QBXY>3&=N* +M\%^#.H=6KMK7FKR]].R]:\+^&+/IM$!M,!S1(6Q:6]I9T6A@#<+.ZCU`TZA# +M7XE9U]R>7/RW/B-2YN:5&EI]H@+G^IW,DOF8V6?U7J3R]I!CZJM'W@!]2G!]UL^#N@T+>@V6#;>%U=&UIM:`UHA;QW8S;)TPK6P> +MUH;IP%:IV&Q=,?9:YI@&0(]D+FM;D\K@68H4FXX7+^!>EMMZ+:K_SDK>G'LUS7+R7.,A1=.+7W.H$#Y3U[-Q$$+ +M0Z59-I4]3FB8WA3OAG_4]-[7O+,$MY5R@W$X*KLI@NW*M-U#&WNNC)WC&57J +MC)GA3N?@M*KW)`&#NM1*S^H-!I.7(W-/_P!T[A.ZGZN,[*KX4N6W'2Z<'40%HPX[[+#:LYF2T-D$6L]T-`M\H8E%+?\*SIMS'7#_"T-'(W6/08]@-0Y:_*VO&8_D'&9X5 +M2WJ,=TP-J-`0W:>5E==93=1@CV6SU*DQO\P+%\05)MAB +M3*L*HVE336;JTXSA=5XEW^:XUSBQ[3'W70^'ZY#)X/*WWRQU7963]39!V +M6ST]P(&#ED6NUL)]PBIR)S&/=9OB6GKM25?H5P6AKL%!U5GF6C@"I2,#PP\A^ +M@KJ;=PB97(]#>&WSV.X.RW[F[93H:0X2>RVST;KO4`QOEL,E8_3Z56]N(&W= +M2/8ZXJ:1))Y6Q94*=C:`F-<96=G8+RX;:4VVU*#4/9;'1*7E6X?4&2-UC],Z +MD$&5#>-:*>8(2QIS +ME;^6X[@!1MO=!C)6C<6KJ[SL`HSTQ@&1*SLTSKBJ^Y)9_2N'\9=&+*AJTF3. +M\+T6I:-9^4`:55N;!E5A%2,K&<]N6L;IXU7IU*;I`(A;OACQ3==.J-94>2S9 +M=/USPO2JM)I0#[+C.L]&KVE8RWTM*QCG<6[C,GI?0_%%EU!@8]PF,_[A;0MK +M.K3-1L`N"\-M*M>UK:V/+7!=#TGQ?=4G>75>=/O_`-ET_CFQSCTWO'?1YHOK +M"!"\?\4U88^F<0=Y7J/5?$'_`!"R\L.ES@N&ZIT2K<5'.#=1)PO+YO'KAW\7 +MDWV\SJ>8ZLY\&3M"EL];ZKJ;@`!GY787GA_RO4YD+&N.G,I7&L-+?A>:XZCU +M3RRHQ7=;T#/S`1]-ZG4J7`;J,3D2J'4V.<[,CY0V3/*)>[Z<+EZZCK-6.^Z7 +M?@4@TG/`*UZ%1M2D)$D[A>?],OG/N@ULS\G9==0J.IV8<(EWNM2\.=XK>MPQ +MFI[2/H5:97]49C]UA=*K.JB,GYY5FI=EC\DAW8JR+[).IU`XF0-^5E=7Z1;7 +ME(L

    K*DZK=--,&23\IK*O4J.$\>ZQE_KI*X[K7X=LN-3Z(ATJI2_#6NZD& +MAH:!S.Z];MS3%LQK@)(S*FHUJ+1,1"LEZVZ3S61X_5\"%CJ=)]-H:S^H#+OE +M=3X=\&6=HYM3R?4-B0NHJ%E2Z!#>58K564P,PI9;Q:7RVK]E:6MK:M+:8!(Y +M2-^QC/Y9,MX"R;SJ;74M,RJHNV`Q*MLG#G.>URYZH75C)52[NP\ZM655O&:S +M+"&%KB09Q*X^_QK2QZY;PM2\QH;J))7:]`L:E(X^JU).TMXT[ +M'IU2F&`#$J[YX#=\++Z?:52P1)6I9](NZ[L@@+K+\7QB^3&.2J&XJ.@`Y3#IM>J9=NNG%I2!.EH +M1,H-G\L+>/Z>WMB^;\,&UZ&TP7"?E:-CT2D'`BGMW"V+>BR>,*[;AH'$+T8_ +MI\8Y9>6U4M+(TV@-=MV4E>W>6@-*O4V:L@Q[*5C`)E=ICKIC;#=T^JXYRAJ4 +M*MN=0^RZ-K`L_J3FG`[K4P9M8E2\J.=!D`=@H.J>)[?I]-IJU`/;_82\075. +MSMG/YX7E'B^[N^HO>:;"6@K>YC/;)PSMZQ>DV?X@]+J5=)KM!^O^2Z#I_7K> +M]IAU&H#.<%?*U6G5J7]2F7O8YIG!73^#_$'4>D5!3J/+V#:5G]W&W34E?1_\ +M4',`)RHZE8/V,KB/"OBVVZBQM-]0!T97327MUT7RU=$V.]>=!@A8%)Y_CG$@ +M22KO4KE[00X$++L:[7WD#E6])]-X@;-$X^B\U\5TCYSH:!!X7J75!KHG'T7G +MWBVVRXYP5J.=['^'%V^7473@?W78R8_U7G/@ZLZWZL!,:L'*]!+R:8(^\[K' +M^-"J.`;D*E3Z9E`69G909O5:6J@[.%1Z82&.89QMA:O48-$\@<+&L"16>$ +MO42?5DAAV'R(2:P`AP">F`XR1A3M8W3@04%&YSB)16M,@SIW4KZX2;HC;]4O3V_59TZ.:94'4>JN8XC0P_=#U6A2I5 +M2`0.T*#I3?(NJM7,%1]7>XN:^"5?Z0X:0 +MP5/:>ZU.F:ZBP?',+H>DW$4XQ\KDK*J`X;SW*W>G58@DXC9(O;KK!P(&=QDJ +M6O4#M-!I!)W6=T^J74QZN%/T]X?=NJ$&!LI81OV+6M8!V5ZG^2(*SK)PF!`5 +MZF^!NHTM429W*EIB8[*O3<)B=U9;@"%%3,_+`W4C6X'WE14\22I9$1.%%/F, +M#/RBI@_U94-2LVGDN`4)OJ0$`?571M8KVQ)U,*@KUBRF14G'*=G46:=L+/ZK +M>'Z +MM&KJI20F[]2R?%&_Z?0N*9.D+E^K=!8ZF][6R`K2UNTJK=='<:&?EV_=KA[*W=1J@D!L8GNM6ZZEHH"'Y'=:0L*=1I&`%G]5Z:#3 +M);&3O"YY>*QN>297E?Z)>NI40YQ;!&X4M[=MK/:01)]]ED68G5`:'2`!O/*EI5W5'[ +MRUJQMN.CI7CG$MG"G_B(GU3.ZR*%9E%AAPF%4N;\@N>"M^Q&ZRZ:VO@SW17E +M?73UMW/'9<]KFY]N5IV5`LM]>K$8PL[I]J\7D%OY<# +M*ZNTL:E2ES'*LPW>&SI!KFQ`V^Z]7B\4MU7G\GDNN&_TKIE*E3:"`5JQ1H4Y;I4%K3?H#LA +M!>M<&Y)7OP\>./3S7*U6N[MU1Y:W;N%4KU''!XW*FH#+DSK6K5K:H,+>^&5< +M9,P$3`XG`6C0ZRD&71I.DR,*W3MW2M-EDT$G=2MMVZIE/98=[<>6"3]ET'5"&4\[E'NGVE>V=J:-495^WZ9K::CQ^9+H-D:5Y4` +M/I/"X>3^4W6B(U'98G7/#%U9G#-0!WA>ULLAIU-/Z*M=] +M/;5:6/:#VE9GBUS&Y>-/":1K6=>6RQS5VW@OQFZ@YEO>.G&Y4GC7PN&36H,@ +M@SA&5Q,IM[O5JVO5;'72(DB5R5RVM9=3)$Q*X_PCXMK +M=,K>35J33(@2=EWEA=VW5XJ4RUQB=_\`?9=]RS;EK5%_Q!M1FEXAWV7.^)F- +MJ,>=,@G=;/7K(T3YC20?98EW7<:#V.`U'&1LNDD:=(2V=X[*3;`5>W=``" +MLTFF>9]U%-1:#5]0(A3/`!E$QL"2<]D-P0,_HHJ6F\!@&4_F#W4+3Z1ZH]D\ +M_P#6HUIS=9WH;3(`,969U!AT$QE2U;DFLZH1`.TJM&:S:;M$P1A:QM +MR_LSE).G;68``;$1PIZT"F52LGZF`RI[JJ'-#1E,NEVJ5ZFFF23NI.E4C4=J +M>=ME'6HZR)..RO\`3@&P,=LK&*XS2]28(P43FM.WZI,&(!!^JD:.\?=:;C(Z +MYTYMQ2/^+VP%SEN]UGK=7*+VD#..,KF;-[J=4TW...Y6Q;O)8,KKVQTTP6G8P.RCJL;"@IBI +M.ZE.N((6:T@K4L3&ZJNIGX6B[20,;J)P;R/NH*@!&!A#6IMJ@#WW5I],3,?9 +M`8;N84[X7I49;,INGGNF%!M5T$81N>:C](`5R@QK&#W4OX(R.H=/%1D:<+'J +M]/'FZ=/LNV\K53P%5J6+7/U1NL7%K;F[;HM$PXLRL[Q'X=HUJ9T4Q)W@+O:- +MG@`C"CO;!I&V%+A%V\AN/"M1C"6@_*Y?K?3*M'4T3\+W>ZLV"@06CZKS/QI0 +M\JY=%,@$]EBX-3)Y6\/9=%A#AGE-6B"8,CLNDONF-J.+].%B7ED6/+73'[KQ +MY^/5>G'/;+\XNJN9I!NJX8]I=`7++#3I,]E5N7; +M!Q'*IEI=K*LML*;FESV$D]UC4CK+(R+8/#C4)]+LD+6 +MIUM&F3Z>Z"[I4J,`"&G@*(.B-50_=%5ZGXAB07Q]4_<\9Z9O +M?CXBL6X\YN?^I1N\46`.:K?NOGQW4NM:CYCJP^Z.C==1?E]6H([DJ_NX)<,W +MT+1\1V53`K-^ZF/6+73+7A?/G3KCJ8KRVN\`^ZWJ?5+UC`U]5T_*OOA4UE'I +M?6^L4G-TM=)'995"B;EQ>X$MW7/^'?/O*\U2=*ZI[A0H!C#^JS\=+)Z]J +MM^\,864QD*'HC-%4ZOS%6J-L:KBYQGE2T:(:\F!]%G/IG2_;N](DRCTMDF<% +M0T8$P1*DDQD[+>/,%>_MJ55A8YLA>??B#X,IW=-U6U;I?/'T7HU0@C;*JW+` +MX$`*Y8S)9=/FCK?3[VQK&C589:2%K?A_XDK=*Z@UM;46$1GC_U@U[X7E?6NBU>GW+@]A`G=<;[8UOC)[(:E#JW3&U*3VY$X*Y#Q#:/HM=$ +MS.ZS_P`.^O/L[@6E.GDW52YU7,`@[K9 +M\*LJ7%N=#H@+.ZY1ASLPX'NM/\.G#SC3C!5RK.+7:+BD0"?96*3*[@,`+5K6 +M8.0`HV6[V]L;++2@:-P)!<$#FW#,3*U7"&B?U4%9NF85&;6J7.VP"S[JM7!] +M;/LM>Y,.R`53N2UXG2$1E?QF/5QW6=4J-=?AS7)Y5VAIF)^BPPRNS.DJS:7548&J%CVZ!Z@G\QO<*-.$NZL^GA.`/+!=E1U634P +M/=2L:U]/2.%V<5:H095:J=0CG967`ZCC95ZS03'ZJ:5E]8I`T-``E9UFP`.: +M0/HM/JC9JM9V"IT*(:\P))25FHJC21#A\:5=L:CJ+@W8#@R%7SKCCOPK)IEU +M-N-7N$&O85IK-DF"NJL:HAN9PN#L*FF[%,SA=/T^O#1"U.5=/:UB7!H^RV;* +MI#1U`5`8DY69=9+>G4VEPQM)LJ;D1 +M&RZ;I5(LI9Y4SO.G.Z&V)#O4%/5&H?Z*!PAPSE633JT:)$-RI9RJU +MLZ6@&`58:"8[(T51H&905F![()!"F+0/IYM,&%B7UO^+9MM6M5KP,R2.%;`$9Y7 +M,](O@3I(R-UMT*NH`@[KK6)5M]-I]E&ZU!R$;*DP.49]+20<]EC4K6V=>L-, +M8*I-IU:C@'#'>5HO'FU2(Y[JRVB`T#3"S_D5FV])E-V55<2",8[J1E8!%70UH;`E#4:"S*A%6=M_E.'M(R54>A52]S(Q*Y[ +MQ7X?NJ)+@TP3_OA>P4NFN;5-7RR0[L%'U3I-.[9#J6X[+A<-NLRT\";1J4_3 +M4$_*MV?3&5R-`A>B^(_"5%E$O:T`_94/#/0CYI#FX"Q<-\6+[:YC`M_"DT-? +MUCLLWJ/3S0FF*9G9>K'IS@T4VTXGE"/#--_JJ,U'E+XI.B>2WMXG<]'N*KQ_ +M*<0I+3H=Q(:6GY*]J'A^V;Z13_15+SPZ)!8T1\+$\N#Z'T>+F2["[CI%G2I:-3H5YGA +M&L!+"1[PM&T\)W3J0ESI[PM8R8LY6UK]!JVK&CU`'NNCHWM!K``]H7`7W0NI +M6DF@]Q473K;KSW'4XPO1/)XYVY^N5=U>=2MV/!+Q]%/2ZM;>0#J'W7#5>C]6 +MKN#B]TCLIZ'0^JD:75'1]4_=PV>F3H[_`*]0H_\`Z1L?*CL+\WSBX&0L^S\+ +MU:@FKJ=\K>Z7T06S!N,*_N;XD/37U%>V%KP_R5O_RY9-;'D-(^ +M`N@JQ*@KNU+8ITQ]%U^E]3$84M*U! +M;D9*7Q8_#VKSEWA]U(D"F`HO_+UQ5J`Y#5Z3<65-PF(*SKLMH'3`,]E/V[\I +M[,KI=HVQH``>H"%;HT'U'R9,J6A2=6=J<,%:-O1#0!"WC-349O/**WHPS+8^ +MJCN&:8M+78S*1,$J:MFB#'U55\SE2<5DG.TG +MY4535F"C)$@'"9\&8*TJK5;JF2N;\3]"HW])PT#5W74%A)V0OI:FQI4N,IMX +M7UGI]QTN])@B#Z2N\\!=7;U'I9MJSO6T`>I:7CGH-.\LR]K1K&<+S[P]UITN."%E>`JOE=4+"XYXE>@>)[6GU/H +M@JL&0)QRO-^AAUKXA@-YA>B_U<9V]4I`.IC!P.2HW,R5-8Q4MV$DB0AK@#(4 +MBJ58.S.P4%9TM^5;J@0>52KG!C"(I7,D20J+R-6ZO5RTX"I730(`PJB"X.#( +MGLLDLF[U`+3N7.GV673,7I(VY4O5)VO,$S_DIZ+!AT#"CI`;S$\J>FT3@J*" +MM1IO&VRK5;5IR'*XX$-R@=!,CA-$0LM:VD14PB_A:_\`\BMTP-`S">!_B4:< +M"XESH."$=$D3!D!0L)#2,SA155K)'<'LK-`ZTZ)S1_$-)D&-PM.QK.:((.>5E7NJE4:YAF3$'A7K" +MIKPX3"16]87!'($KH^DUM%,$'=<10JNI51.&KH^B7(>T'5*TS766+Y=RM:W< +MV,RL#IM4$3NM:V>20I2-$U64J9$QD&0-^Q4K#QV35#`C)*:5-:N.L$G`V5ZFXG/&^4WL#ZC01)W6,HTH^&+-U"V;K! +MD[KI:+=#`J=NP`-``$*9]R&D-E8QYK&.EID'!450#5A/1JM)B4540<+I72#M +MR!LK=%V),+/8=.T^ZN4G`MXPBQ+(WWE(Q_LI-!/;'9"T0XP5&C.`TD2J74*- +M.I1+7KTRH;?_`)REHVC'0(5ZI:U'$P"FM[=]-TP5C*S>ED9]QTX%X@<\*:GT<.8"6+:L;37 +M4!<%K4K6F&Z>RSCA]:ZO5:S&LW.%F79J57P-N%9C(EY0/8VK4RR>ZFZ-0&LOXE,%7*-N7G4XRK+*``@<)645O1TMPV% +M*&CD*4@S`,)0"?=601D'Y_LJ74Z0@&/HKYDG!5?J(]`D[*I4=`:K<3!`4;J0 +MG"L=/&JC.T(W"#')6/\`4RXK.J4(<9"C-/@K1J"./E15&3D05L4_+$8RDQD- +MSCY5O2(E1$;@B$%2XHM7_`(E]'_AKD75`$23,!>JOP")E8?B^PIWE +MBX.:"8*93<3>G,>![L7O2G4'.ES1&3[+D.J6O\)XK((_,XG]5T/@B@^TZI5I +M%IB?@)O&]H1U>C7:`?5O]5,,MXV,Y363H>GD?P=.,X&R>XVSA*P'_HVF!D!# +M=P`,K>*5!5V/"HW!,D#]%/6J0)!E4Z[B3+9515JCU($[*O0;YUPZI,M;@+-6'>P>3@Y5.L``2<=CW5\!KG$=N5!>4Y9EON$JL: +MH)J`D$CLI:!)<``(]U)=42*0=F?904FD.F00#L"D2Q)>M:6M#@"?CE'8.#'X +M&?V454&I4B<`FZ'"00-B4B5IL+:A!&/E7>GW+J#X;^4\K,L7S5+85YD: +MM)C/Z*SAJNQZ+=M?3$>PRMNG<::)*XGICWTP"PB)6W:7IJU&42XQO"U6>G4= +M%8\36=C4M:VENY]UFV-1OE-`.!'[+1HN$3,+&FEEASE&X225%1@Y)4\0T&8! +M4L:!)!`"M6U0$Q]%3<,GD_*DMW:'=Y1&K2)B8A-#7OGLH#6TT9$!3V)+J>HQ +ME8S+4VK13+BJCGMJF0=BH?$UT;:UP=U1Z1BX0J=%X=$JS2QSNHTM!P`ALGW2/ +M>4+-.F!^J*0!D*:4%:&LU$!5*`-6L29@84EZ_P!):'&45C3AD]TJIF@2#V5# +MK-DVYI$`96BXP0(3.`TZ5,IM8X*X8^SN""#$JW:70\T21D2MOKG3V7#"=.RY +M.X94M;C27>F=UG&WJLY3['96E753W5JG4).-AV6!TBZ#FB7+9MWR)E;TDJVP +MR(/=3,@`S/95J!>7^IP(XQLK$<\J-G:)R#(1`RL`->T84;J(>9[%76A +M(QP>-]E7ZA#:>#**K2=3RT_=4:M74_0\\[J\!J-)U0YF%890:!NI:+0U@&_P +MIV!H"FOR*OD-[;G=%Y`U1"LD-F>4_I@^AW]M2;#IV04:[:=.&!0-K/N0"\DCWX4U*FP-RDQDZ2VWL%4U +M:SX)PCIV^@[`^ZL,\L#>041@[%:TR&FP!IGA.-_A.X`#TF4$#5NJ'?G(*$3` +M)^$SS,]PA>2UL]T!8&(S\JMU""S&2IM7V4-_`IRWZJQFGZ8TZ3&RDK$:@=H4 +M/2\-,E2UXF9P5SLX3()<")(]D#R`(*7[#*$YAP*W.E"8TX0.&9`GY4D3_4AB +M'^RHKUJV%IU8O:/S'^Z#Q/0\SR +MGZ3W*UNI4`ZX#SIE4>OF&,`B9W4DUMF\E;PR@P#``4%TZ2OEWM[JM4#OS<=E8N +M#J]H*A<($`_=!3KM9I)DY53IP'GO),$<*Y/4*CJ;]1)<.%KVM21,P>RR[?3IT.SV4],NHF=Y^Z[ +M;_+RK=P]U)AP>PRKG3F>7:^K!(G*RJU7^)N:=,8:W)6L'?R2W[*::@0"PD\( +M+C\H$3/Z*5Y/E1$DJ/3.\[(TJ5VX`@[S*I!A95(G[K3J`D9:%0>#Y\:02HE5 +MVG_U;A)!`P%-J(.9]E#/_JR,R,;84]P"TSIGXE$Y%0<:;I#MSW6@Q[?S+*HE +MSJ@!&^P"M^8-@[E58W.GUG>6%J4CJ;PN;Z/<9`G*W;>HV`9)6S%8JLVV"-\+-QVNW#V-1U"KI=N/==!TZZ!8)/LJ/6[!K'ZX&%5L;G2^. +MWNM2[<[-.JMZDG#L*SK$]UCV=QJY6C1>#C=-+*OL)+)E24CE5Z1ALD>TJ>B9 +M(SMP%&ED$$`;]T1_+,[**8*)YTL10T0'5YD8'=6JL0%7LBV22`K+&!SO]5EH +M]"G!E7K6F&[0@HTP8PK--H:`"Y%AW`!D2H;HPS^RF>0!G?Y5.\)TQ/NJE0V@ +M'F&45P8YP5%9_F),[JQ<4R1A94%"M!A7:3FGZY654)IU([*S0J>D=RM)%NZT +MZ3`&VZQ<&N8V6A7J$TX<#"S[9NJL7`*6+M:+](QPA_B-)DIBSDG'9`:8]\\J +M@_XKD9A+^+&5`:?J@=^`F92`=D%-HE_BS)]TOXP\%0BG\I"D,%-B2I7J$1)4 +M%057XU8*L-:`$X89SB%-BF+5Q,.$1"VYP9' +M$)V5Z9`(*9]$'X41M@#@P$1/K;O,T^DJ-[JH]U=C0])&-P +MJ]_4;Y<$A5Q=N!R%6NZFL:M7W59J[TUQ`#E4[PC +M3."%8JN),-5&[<6X,JLUD=3J,;5!,?*Q.MW-.I48UI$K9ZM0UTBXN`PN.>QP +MORTN)SS\J\:VQ]:A<^Z"@P,I +M!@R.4C0TN)&^ZSTWI>)!@`(7,(4/3K@ZB'JW4#33F55BM6U:2T`'4%GO]%:) +M(/Z+3=3BFXSNLRZ#6.)=R,+/TO2L[2ZL7N`[*\UC74X':!E5K>D#1U%NYY4U +M":9`F0>2D$%9HHUO?=*K^77,%3WC&N]>F>ZJD#3I,P$5;L7M-,ZCQN%L]`J^ +M6S5.YY7-V=3^2X@''"U.EUY8`>/=;B1WG2K@$`D_9;UE5#V@E<3T:YD!DKI+ +M&X``$E+$Z;HIAX)8`3Q+E:M0^F1G!5+I]68]2U*+@6C"SIK:W;W`C2XY/NGJ +MP&EP)4'D2-0W[H;ASVLT[GY6+56>F4O,?J$[K9HP*<3LJ'1O10]6>5/5KR=` +MY7/&;J3M!U-IKO#&G"Q.K4-!CLNGMK>*9>[<[++ZQ;R#CZJUUTQNG5?+JPZ5 +MT=A5+V@`Q]5R[V^74Y"U>E7&(E=)S&.JZBW,B)'RIW?EG*S[-X+9F58K50QD +M24TW*@OJ@;LPXRN5ZA3\FXD8GW7:5@'",K`Z[:C27#CE2\%Y4^FW):()6S:5@ +M1)*Y6D]S'D=BM;I]>0`=EISZ=-;U1Y6\PK5JZ3LLFRJ2)F%HT*D[%--RKP=* +M&L\!D3/U0-*&X+@WY45-8"3NM.U8/^ZSNEL<6:EJVH)B2/A9;6:;0.,A%(.$ +M&2-PD>$43^TRJMZ`*9(W5C;)A5;QTMP/F54J.Q:1)5MP!'!56RGZ*RXB5%5+ +MFE+I4+':7Z0"5)`TX(4-%T5HW,H+1[$2% +M%IWR84CL9P4SLA`,`@;X]T@V$1_+,(3G?ZJFS?LD`",<).$#!320`-,('#<3 +MRD02(U$)]1_[II_W*!RK=1ANG/U1**RHFG0])*"X:\OU! +M6*+HM1/*$9V"QC$O:G-5IR20=E+2KN&3LI7@")3M:TB0/NNF@S;@!LN3>=JF +M(2JT6N,!/2HM`01OJ!K3/[JE5.H%Q..ZM7H#1M"P.M]290IEK'"0K)MFW2KX +MEZ@RA;%K2"3[KF>G!U6H:A$F9RH^KW%:M5-1P,#Y1V5RT,R(E7.SB1B;[JV_ +M>0%`]I.VZD=7IEH@P9V4?FLF0X#W01OUJ`0@A=CZJ +M-X`._P!U-4B%"1G,HBMD0+I\DY/=6KD0L,X4)@G(W5BL0!$[Y5=\[?W1",QJ#20.?91U#J=+?DIR^&1_=1%X@D['& +MZ*E#V`;):V=D#64M(EZ6BE_C4TKP6RJ.=4`)F.ZU^D5/-O9T@Z%SMN[RP3R- +MY6OX5KZ*+]0`W.Y4_XI$BJP1/NL[J@T-/I$*U4:^D^!.RI]4J +M"H!3$R=PE4]L!_#"#S*CR:F&F%.&^4P-X]E6I:C7<9(XD8E/J?%QH#J<1,*G +MWT%X!C'!16-=S>25#F6U)3'AG*.D +MZ;=`L!R/E60\UZX:#(Y7-VUWHI[Y6_T&IJ9YA,F5K),:VK9C6TX&X4A@;**@ +MZ1DB%)CV'PLNAJ3C)P5-3,NS*!C94C(X&%%%H8[?"B=0G,*8D:1.Z)H&TQ*: +M7:J*;QWA-JJ,<1RK;?S1PGD:A@JI +M4]CLK#`W5E5[/##*DU2[!A9X5)5$[*K69ZIX4SW$Y`RA<)YA+5T@J,=C2J-= +MYI5IM4\2-PB5T=U;$E2@F#E- +MQD)-&.4Q'ND4YC>4+R3]$VXG8)I;R@/)$(9XA,#`W3:H!$H@I/('LJO4/R8, +M'MW5C5[_`'5;J1:&AP.?96)36GY.WPI`9)4-HX&EN4^J#`<2D*)YEVZ1SNY, +M82;AI&Z!W;;H,3_FDXD&>4+B1F50G$`PA<(.^2FY]3D-0R\"9A$.YPVC/RJ- +M\[4\-/W5RI@;Y6?=NU5P-XY3XB]3;_(!S]TB0#A$`?X<0O"H=%&2?99++>KUR_Q- +M2,'J]*FQS6!H3LLZ;J8AH4_5VS6;D8*F9I%,-VE+VDZ9=Q9-.Q`52M9N:8:Y +MRVJNDC;E0N;JR)51CNIUVJ8]NJK$%N^%"20W.RH-K5O*!T\*$WE0$M+AN +M:VBWM/)7-5W/\QI+0X.,#NMZPK^50:<^K@B/U7HG+AG/PZ?I]1KR`=S^BU6' +M`$GZ+!Z56@@XSB5LVQ+@-UFLXK31G)4OJT@`?51")D'Z*3U&F`0LNAVL:\$N +M"RKFBX7\TYPHE]$U';.*E(I/K-=Z9D]U&_\Y!,8[J2[H$5 +M"]@)X@*J'Q(,[[#9)R7<7;9N"=D;YP*FM*L +M-`)6H1W71+@%C3JRNGZ;7D`2=UP'1K@!@`HUVB@!,:N5T/1V_\`I@[NN&<^&]KE=@(/[(NG.#'@2F+01NHZ/HJ@ +MY2<.K?H'4T$.2O6C3)W473ZC74\%3U1(D\)6XPNJ4SJE8E^P]ETO4J3BQ8=[ +M1,%PS"R5B7#GC=Q71^':Y\@#5^JYWJ3"!($?*T.AU7LIB7+RAIOYVA22`#.RC21CI.1A&3] +ME#(#2`G:??;A%2B)WD]T61B?LHVD;''PI0#&%E35`",F0LZ_C6&@Y6C4.EA) +M,?"S6M-6ZB9'=+T`KT/Y.DB5S/6;?2^=.W9=A480-IGE8O6:1F8GW4TETRRIQ)W*L=)N0QX!=.5JB[5=MC:4:CJNG@>0(_16@Z/8?*K63HH`@B5.YT`3"SIT@Y!'"37" +M(.Z`NGLGRTA#L0L[K#0)D<=TB5E +MT029&ZLV]32?4HNG`Y!;';*>NW2[5)3%*T:;Q(`.Z-L]BL^UK1)<-E=H5`6^ +MGE4V+3B?T0.W_P`U(_NHW$``P44B0-DP,`2GYG2?E"3/QV*B"+LQCZ*MU*#3 +M[J5[VXB(4%[4!I20K"HK7\ASGV1"=?S[J*T=Z20$;3)F$A4T3W*8$SC]4['" +M"!PFD?EC!50GNRHW'NB>8X4;CE`_]/NHR9=(Y12W3N<(,.$Q]4`UC)A4:\&X +M:-2NDR8./94;@`W(R$O2?6I3]5'_`#59PTO+295B@[TCD?917C3(.RG255KG +M.ZK//T4UP02JM4B,GZ+:!JNE0U?R[?52$MX*BJ?EW05G_G3.YX1N#2<2FTG3 +MC[(C$ZP'>U]%IC"CN:3)P +M(!3=+<'6HD9/NBJ%PQJ6<>BH/(I%OY<_94[NU8X%TP>5>&3O!5>Z$-R95TLJ +MJRU>&@-=A/\`PU3NK--P#``#]T^O_I6--OFRL\%U,F"),9D+2MJWE46%L25D +M6]1QN00=4;85ZFXEY$@C<$8XRO5'/*.IZ74U071@\%=%T^JT;F5R/2JCF@`. +M#F]PNAZ;6AVDY@;I7GG%;K2"V8B=BI'.@1S\JO0<2R(V"L`$MC$!8KK*K=2> +M!1#`8<]7+-I9;@"1`*HN:;B_V]-,85^K+*9C'UW655(EQU?94.I4"'!S)$[K +M3:T:9,2H7L\QVV9P+J30ZF0YQ(CE8K612).-6(6W6+:EE+I$X*K.MVFF(:#"EFE[9MNXZH8V +M#/)4VKR\.,_W356.%:`2)454D3[;95EVS9IL=)NF@`.)$''NNIZ1=%S!GEF78:WTSGB5M([SIU<5+RE3F<_"[OIL-MPWO[KS+P54-QU$' +MM&?NO2*#]+!G"XYMW0_!P%J6U:&Y,(W!7K)D1A9%]2(:0MUYUTYD!9G4&3(V^%FM.8 +MZC3_`)>)^JALJA#8$"%I=3H^@[8652@2!NK&*W^F7&T\\%;%G5U-B8"Y2WJN +MIQN?%-+LUV^!'*"S9$N)RH*8\^MC(5Y +MF`!P%+VLZ"ZZRV-#:@>.%T +MW6;?4TB..%SMRPM?&PY4C-;_`$DEU$96G8!PO!/"Y[H%0T;J.D:0?'^92U0-RL]MWJ$DS\)VW8` +M[&47:]4?Z2>2%EUG?SQ.41`!.<>Z!T"2,2@!Y'!*@O'>C'&V5,\S_HH+LS2.\K42H+)X(R= +MU8:9)AQSQPJ=G!,?NK3(F`T!2%2?TX3SP<2HW.(P-D[7%Q"H*3![*.I,P70B +M).GM"#5ZT"QHW2,`1.R=WY=Q@(()!,R50!B2`250N#INACGNK9_,8(RJ-VXF +MZ"EZ3ZTZ>6M]MD;B'TR"H6$!@/9%4=Z-RFMI5*X&DQ./=5JK3J@*W7`)SQNJ +MS\XP4B17((.(0UL#<%2EHE1U&@B()(5$%)L@DC)3$>HC92AIG/V2+1N$1B]; +M!!F$5*'4`8"DZXTFB2,$#=5.F/#K>!CV5O;,$]PU>W)4=1@=&DX2=.J"(^$X +M<-,;=E16KC)!W"AJ/AT$*6X/K.256J&0W0'$B=ENO-DZFTJ-=3W +M`]E9?5TT"XC99O3Z@-,,]E)6>^K=T[<'$R5BS2XU>Z73_D:_5+E9KSH`.=\I +M42&-T[`;IJH:XQE9TZ2A8!`!(PHJI]4@XYA2M`CDJ!Q]LS6T2J-)@KWT$0&^ZFNFFE +M6D"8@)WVR*]IM\T;*G=LTLD.$*[2+'TSJ'JW454!U,YSP5-::WMF$`D:'1W* +MT^GW/I`:<=E1=1)!(`QRH:%7RFNP1GG8K4K%>G_A:\N]7_5]MUZ'YS=($PO+ +M?PGN`ZDYWO/[KNZEP=8.K[K&N7/&\MNA5EX$A7J#@6[_`%7/V-?.#]5KV521 +M\K5CO*N#TO!!*TK3348%F_F9A6.G57!\3CW6-?&]KSWN83,PH*SFU,X'=7G- +M#V9"I7=+2/3LLUME=69%-T9`"Q6LF1L#WX6QU1Y%-P&)"SZ--II&3]D1")D@ +M&85JPK>7'=0-I%K^W*3AI=^:0KM'16MQJ8,G=7Z%3T8."N8L:Y;`U+9MJXC! +MW5TLK8I/)&\_*F:Z,`X6?0J3_4K-*H8_-NHU*M:]B0J]W6]6DY!..5D=3I&/RY42L2U(I58SA;W07BO4!^JBNAKIQRD2HVU=>=_JF/'<(;1GELR[/[J0C,I.C2*K@J,>H'( +M"DJ\XCV40D"`(E4"X0XC.?JFJMC:8'=%$$H71O\`NB,_J@_E.!Y"Q^FU-+W- +M@A;G4&!U,SD$+G+8Z.H$#<[JWIF=K]1LFI?R^JM>"`!RKE +M9XJ-#@GVK>9"<8.3,(:KMYW"![W:#&Z!SG%GJ;!0@J8]`X3Q[H&5'!H&H?9/ +MYKO\0^RSPV^3`XT[@M(TP>2M*RJ!SA)&>52\04G6_57B``?=*TJG!C=:\>6X +MZ>3%U73GAQ$'!,;K>L7:G""<87*=%KM:R9]/.F75GU=,294 +MCVN!![I.D#4ID-TM%)SHB1"TK<@M@`PFZC3#K5Y9G'"6Z339_"2MIH.&6GG]5VG\9J>?5/NN` +M_#:6TCP5T3KDMNBV2IC=UQDYKJ>G7/JP2NCZ?5!I#,%<%TR['FAL[KK.DW&H +M`+I8Z8UTMLZ`#RI@[34!&%1M:LQE7(!9@K%=8V;)X?2&4=5@.ZS>FU8=!,1P +M5HNJ!M,PX+-;E87B"C+]`&5GFDZDP!TB.RV:X%>[WD!1WULTL,#(V)6-ZJZ8 +MU,MU[D^Y0W+9.,#N%+6I.IU%'4>-B +M0))B.RJ.AMJH+!ZE>H50(Y7.V=?.ZTZ%Q#-6T(LJ]>5Q.D&"5/T]NFG/DX!D8@>R3AJ.5`#HHSL/=2+5B01\I.`)[J)K]N$X=ZXVE4#4I`@Z5&T%IV*L.<2-T +M'YO=30=M=^,?*=U8Z<@X2`;&=RC+&'$A!`;G,1]E&^X&))RI32;MA15*(&QE +M7E%&YJQ<"(A6VO#VZEG=29IJ!P,0C8][:8$E/J-!CNY4S"2/[=UF,N8)#E:H +MUPX`2J+<^D]U#5._!"<5!W4=4C:440=.Z?4)WV46J!$I!W(1!/P(&RS+V/-! +M.RT:A=!!/T6=U&=8DCX3XE7J('E`C8>Z"H01&?NAMG?R(0ETG*3I:>(9)2ID +M%N9"$N@1O\IFD:>RJ(ZL%Q`.$+\#L$3_`,RB>X]P40HR$U68PG),25$Z9,_< +M((+PM\LCV7,51IZD-]UTET'%IPN:ZK++L.`"U>F?K5>6Z!C?NJ=4EM0S'PIJ +M;II!P,JM>._F$@_5(@*I,F1NJQ$O#I/NCJ.)`,('.,1C*(:H6G$?JJ\Z26G8 +MJ6KC(,_"KU<9B?JFBH*NVD?=0L=O.$=PXD_YJN7DNW,!5&5UP@W#3SW5FG/E +M`\_NJ?6S-P#LK5)W\EI:F7]B='.7GE)SF^7`@>RCJ.=(+HREK+A)<-ONI5A` +MXPV0GD_X/T4)J'M/NF\P_P"%&]/G7\3K1U#J!JMD-/8KG+*J69:8E>A_B=:" +MI0D4B33;F=I7FK*FG^61)#MYX7+"ZNG:?RQE;G3*HD#_`&%T?3JQ+6F3(W7) +M=+K%WHG![E;_`$JX`IZ&G;D+UX7CU75>J-$X;P%VG3G.=I+CMC=< +M'X8=_P"L<^",KL^F58TD#;NK7GO%;1(:R2!E%2;B8^O"AI.+QJ+I4K"XG$Y7 +M-T!4R3RFEL<[(JC2#O\`W4%0%KMPR#J)T6QAVZ>D\Z(U3*@O' +M:[BFP3[I4/2`;;-$"2)4-;43'?@*^YLB(&.RK5&Q6$;J=*B$M#02E=-'EF#& +M%-4_F;B"%7N\-W)0X-94&NIG.4UV"V@\$3(X*DZ406D@G>([*W<40^V?,S&R +MF71`^!7:V]R0X=@NC\/7\.:"9GZ+TSE7IW3J^K25L4'@LCNN3Z +M%HSGNGN&G5Q$*6E&@:3'U2J@&9(E8UIT95U1#G$EJS+RA!."MVJP'_54+ +MQD-/)[*#`?-.MA&UVK\RN5K=KP21!Y5&LQS3`.`DK.DU-^G'NK#[K13^5G:_ +M?9-=51Y>J<^RW*E;O0JFHR5N,J;`F?A?HHUM<8[U8^%)J(,JNUX.?V4DPV>Z*)[OJH*Y!, +M']$;G=B@<&D&5!GWP]!PI?"P)J?7DJ'J`ACC)]D?AA^DR2D1T8P,Y'=$"-U& +MRH"S@2A+@2(2,Y5J3MNM.-T8=`_P!55UX&8]DFOG))459+S.\A)K^2?HH" +M9P$.HPBK?F-R!CNLKJCLF"85DU#!S/LLSJ50_E,2JB2V>`TD291.?F05!;._ +MD[_5$TB?41)YV4@LM>0-YY1!\G=5R[:<)P[.=D$X?G=&Q\#C*KL>"-]D[70X +M9^J;%EQ.-DB\]U"7\&8*<.X!_54$YY&9E`7DNVW35'@;G*&0[Z>ZNT5.HG.4 +MJ8'D[8_9-U+4!N82M_\`D`[J7L+RVDX*3:3ID(FN]4(VNAW"I`/UM[X4=2X< +MP9G/Z*V#+5%5I-.[=]U!"VY$_P":E;<-)`U0H*M$<*$TG;#A!H>:TM]+I5/J +M)`$G"B:VJUQSA0=2-9M/97:5I6;@:`)=$(7D`K/Z;<5?X>'`X[(GW1+O4DUH +MJ\'`P#PA<3&VRJLNFZO[(S781C'=42U'2V3NHAOLA\YFG\WU0"H)W.564Q/I +MRHJFQC"=U1L;J-[@6SJPFC:O=.,?(6!UO)+APMN]ZK=7ES/92=/(;:-!S\E3+N+.DI+6M)(CA"8%,$'"5:" +MTXSPAI@^5I!!]U%@FM!;)A/H'M]T+#Z1A%/LHV\H\54&UZ%9KID-/RO)NK4' +M4.I50T`M!R9VRO;.I4P]CG')CO@+R?Q[9NI]0>Z<3,1[KGGQE*O@O<9EKEH+ +M0=.X^%K=-K@4M((_NL*SJ/IO:`>^3PM2E6UR74Q(WC"[X7ZN4VZGPW6+*+[41OV3&2 +M3P2HT3JFEA."!N`HNG@5*KJAG?"#J-0TK8GDX1],+V6K=49[IVB_JVF=E%4$ +MG494EN\$?/":K),D;84L:B*W'J)WE07;7:S&/W5JF"!,;SRJU1NMSL\[H([3 +M4PYG)VA7GUO_`$;@,8YG"JZ((+)!XRGZA4A]!O= +M=-I!6\HDKJC6#:;CJW]U'9U7&[!`QW6>^Y\RJVDVB@)B>5RRNN(ZX_ +MEMVM<&G'>%8W&3/NLBUJZ7`$C_):-!VHCU+-CI*-S1I,`RJ=VQI?[_"O'/[* +M"HT203)E8L:9=>FT$B"J=>CC;'*U+ML$@`RJU>GB2D1D7%N#)!R?T5&^8YM* +M"86U780TJA?M#J#I'"L2JG3*^FGI!S^ZV>G78TCDA8%M3(!(5BA6-+>!E:E9 +MKK+6X!;DQ[*];U/2,Q*YCI]WL)_5:MI<:B#@_5+&I6W3J>H02A)!Q@%#4)V. +M%-"O>F1OLJ_3?^;GNBOG>@J'I9]9DR9PK?B1L:A&_P`)M>(*B:XS&(A,>ZBI +MVU1.Z(O:3,CO"JD'![^Z3@[28)E-B!R +MK\%RS>?+!"F+O>51M"?*!,A2TZDNW*S%6'.)_IPEN,&"HW.!.1A#J'?'""P- +M38!VB9]U%YF-T@Z>51%U%WH*&S(\D9^B;J+OY1SCY4=B[^5OE*BP9!D)&0Z5&YW +M\R9^B?428)Y06&ET`IY)89CWRHV.QI"9S^$#5=\)##8[H7G.#$IJ;G28*"5D +M$[1]5%?-#J9D3[2B:XYXY0ULTR"58*E@QLN`:BK46.>3&>RCM'1=.!.)4]0R +M3"D*K/H>J02F=0<6G=3EQ`"?4-)Y*ND4'4G`8)4(-459E7RX:C.Q*!S0'3CZ +MHBD]]4&0#!*%U:H&Q!5\M#C^7Y05J8#<-'U5FRZ8M]J1."5:K63 +MB-33"F]6GP5Q7'ED[PJ8JM+Y!W2K6]700"9A9U5M:F2-/RJC4+\&#]%!Y7H +M5=S2")XW7,^*K8U*%0;R)SPKY)N.'COKE'E#7Z*A:!B<%:%FX/8T["9A4^JT +MO(O:E,-(@]]U-TYWY6C`:5,+N/7G&S1=H\J3G<05U7ARZ#FX<&D#OGA3'<>@]-JM--H[[S\+3M*Y+1,&-ES72;IKVL`)' +MN5MT*LZ<[*6:>>72^QS#4DD[X4FN2!G[JJTOB8GLI2X8<=Q@SA8TZ2JW5'M? +M=MI-<7'!(4U`C0&;`=E7HM-;J#JN(;C]58JC0>T_HH)Z=8!P`/U[JVW2ZGD; +M+,HN+KAH)P5ITX-(-[CE6K#`'1@G_)02!4(GE6)`:0)PJE4^H_=1=I6YR3[R +MHNJ`&R?C=34W32$MVPJ?6ZFBV&PEP^J6);PZ3PSZ.D4LQ#0._P!$_6&R0^9` +MX1=!+?\`@E$[2T)^I#52U8@'"XSMQPO+.K-8^CI`XA<_URSECM.^\+HJ;'`C +MW5>_HM-%T@+=_+O'+=(N'6U=K3JP$P@YG*J +M6U<.&2(4X>"!$9]UG3ZV;FFPZ@=BLKJ[!Y+@WZ*Q*SK.F8U`XF)1U*32XQ"EZ?2/D`]T=>G#HXX +M1&<7NI'\V!Q"N6=X6ELF9S!45:D2Z`,E5JE/2[&",K4J5U%E=A])L'?]%HV] +M66@3NN+M+MU&J`[8+>Z;?->&RX!+$E=`Q_$J859:/?A9M*J'`:73/96:3IS. +MRPZ'OS-%P!E'TADT_A17#AY)4W29%(P0I!?;@'V1-=GE1S]$3=.)("JI(,S^ +MZ%QW#M]DY+8WW4;S`B1\H*G47``CE1],`UDCOPBZ@X!AR%%TQ_/<\*4:E-V) +MTHO4<[*)CL"%(TXGNFC9.<`(Q/=$'PTB5&Z9G&$%28[JB34P-=.>ZR>JN:*G +M;*OU'::1XX63U1\U0`('LH59MG#R0)&`DYWJWP5#1GRP,YY3N,.P3ME)2IQ4 +M'!^B37^M0%VT)B\@S@#A!:+AW3L><*&0<1N$F'2X23'RE%L.YF>Z;4`2?[JN +M7^DQ*(/P)@H)=?`!^4=-X+<[RH`Y)K@,JANHP*9SB%'8QY>#LFZ@_P#DD$'Y +M4=@[^6=]E:D67:B9G,951#6$_P!U488=,QRJ]1WJQVV5T;8M\VNRA4D$X5'I=W +M4;4<#N"8"Z&[:W09SC*Q:%)C>H/$R'$J7>EG:9MV7&2WY4E&Z:1$[)A;L\QQ +M@9PDVT&J1O\`NFUFEFFYI9.I%+?\85=ML^-T_P##/[K&W3U>?U'.IO`/T69> +MO\T/#I@<+7T4WTGM>\-%S=*J]M00/RY/NN&/%T]TN\8WK<^EIG&N&3I>FO+;A@:YP&"(."NBMKJ:@; +M+=+<8*YKHU:=,P=(6E;^:UX>X`P9PMWAYLG46Q,B?YD.:5=M7%D#@H;'6UBF2=O90522PQO +M&P5BK4EL$*O6)R-(AR+L]&12C:5E^(7PRF`[=X!$;Y6C.BC)9!]C,K)O#YE7 +M46R`X1/=3+IFV.SZ"7'H]$$02!CA7*P+J7T5;H'_`.44]P(5UP::6VZY3MSP +MJC5;#Q,#B945>D#D;=E<(!(&)35F12F1]%T=]N8Z[9BI,M&W*Y:Z;4MK@B3H +M:X;KT"ZH!U-Q+J(`!D[X4XJ$C$A9-K +M7Q\8PKC*DLP9D+C765?H7!:[2=CRK]O5&D#NL4/`$SE6K.YAP`4:VU]6(E-N +M#PH*+PX27$`YW4@>"["S6Y456F223A9G5VC0["U:SN%E]0<'5`SDE016E/3; +M"!&.Z&H-1DC?=6PS32;.T0HG!HRT*K?48C?ZJ* +MM3EL@_,J[33*?3.K41"*G6=3J`M5FK3(SLJSQ`WRK*EC9Z;?D:6..8W6S;7; +M2!#IGW7&4ZFDB)'LK]M=EH&8@)4G#I;JN#2)D#ZJWTJN/(&09]UR]3J`>UK- +M6^`MSI&;=N8E2\++MK^=VVV1LK>KC*H.IU/1NAZ62*8,[E5NIU"6&"$73'N=2:`=^4J +M1K4ZO!/ZHV5H'YC$JD")"/6",G=1I*7[ANZ1=&5`7PW!A(O^I518;5)[(M6TE56N``(")M01ML@N!P +M@0=TXRV9"K!\B$8?!03AS28!D]D;2.3]%5UQSGV1!Y@[_P":H74'?RS$=H45 +MBXMIP"`=U'?/EARFLG2W$B$OPBTY\&-^4P=F4$CG?N@U0X[0B++7$'Y2>[B5 +M`U_<)R\[$G"HDJ.(;,IZ;QIB,PH''N8RE3)F)*@G#R3'',*<&6B`53U28W^B +ME;4<&C*HK=5!:=4;*6SJAUL#]"HNI^JD>?[*'IK_`$P3LE2+-5^ZAJN +M$$QE6%!4_.CZOUI`(!PJ542\R(5QS<;Y*IW1C$F=E +M652NS\QF>5%2=#H.WRK#SCW5:!)SLBCK-;HB9"INC.^^59>3IWSL0H:[=+"1 +M^Z(K5(/YLK)NJIHWIIZ1I>9)T@G[Q*UZPEL3GV67UNBXT!4$XSNEG&EG%3R" +MT%G92VY)!(WXA4[.MKMF'^IHC=3VKH):5)>%URL!S>93ZF^ZCAO8E*&]BG#; +MSU].##9PH:E%AR>-YQ*NG7%+6#('TE0=*+_.?4<##R0`5E'\K?A:5CO]%?B]4]=O\V3NK%$0S)GLJ];=6:/Y6_19 +MC6^3U`00.Z3@=6G.VZ=WYDF_\QORFC?*&^;IHR"1'M*RJM)PI"I/YGXE:W5/ +M^0LZO_[+_P#&%G*_$RX==T)I;TFG)G&5=R:>TJGT7_\`+6?`_966;!8P[KEC +M"PT^Y4PIZJ$]U!5W5NG_`,KZ+HZJ5:B13.096%U2U+R8`RNDK?\`*/RLFZV* +MS>G2.#ZO;.MK[S`3`,KJO!?5X;387Q[2L+Q9_P"X8@\'?\_ZKKX[PQGC]>Q= +M&O&U*;3KS&RV:%0:1ZOU7(^'/RM736WY&K.4Y7%?U%WI_9)KG-=$_5#;[!)_ +MY'+G6XT+2O,`NV]U=8_TR#ORL:WV/PM*A_R6I5B6I4'EJA3FK>DQLK5S_P`L +MJ/IGYS\KG;J-3E.6C1![1"@>V1&_NK+]C\J`_F5-*[VD/.,;[H'@.:0)^B.X +M_*F=_P`GZ(:5*U,M!Q/RJE5AR5H5/RGZ*H[^KZIM*I5&&<843JKV'NK=;\BI +MW'YEK:6!97?_`!5/W*[/I%QIM&#&RX1O_O&?*Z[IO_MF_16I.&UYX+2F+F$` +MJK3_`.2/E)OY?J5C36UN*D^K]*I#!&Z/63_4HJ?_`"_HC;^8_`5THR\8@)]<[2@& +M[OA*EL4T"-4#&X"0>.^_91'_`)A3MW;\J"PUY`B81!Y.02H'?\M'0V^B"5KB +M#*E;4QO!]E`/S?1,W?F^BDZ?^1+\2+#R4QC5,IG +M[_5#4_YGV5@<.`,GZ(I,@]U$/^8%,>/HJD,YQWDIVNS$H*WY/JDS\P45('>K +M!PI`YI&V-L*!OYDXW*J&OS%$MD0JG3':JQ$JS=_^VHM?L"5/PAY*#%LIIWCJ)(`) +I("O4!#X(DJA<_P#YE_\`B6G2_P">U9ZNFXE:#I_,$^EW^,*4;)(T_]EK +` +end + + diff --git a/rt/sbin/extract-message-catalog b/rt/sbin/extract-message-catalog index af7b2c733..a7ba6335c 100644 --- a/rt/sbin/extract-message-catalog +++ b/rt/sbin/extract-message-catalog @@ -41,7 +41,7 @@ $DEBUG = 1; $FILECAT = {}; # extract all strings and stuff them into $FILECAT -File::Find::find( { wanted => \&extract_strings_from_code, follow => 0 }, '.' ); +File::Find::find( { wanted => \&extract_strings_from_code, follow => 1 }, '.' ); # ensure proper escaping and [_1] => %1 transformation foreach my $str ( sort keys %{$FILECAT} ) { diff --git a/rt/sbin/factory b/rt/sbin/factory index 8abb1922f..64b0ae337 100644 --- a/rt/sbin/factory +++ b/rt/sbin/factory @@ -61,6 +61,7 @@ my $LicenseBlock = << '.'; # # # END LICENSE BLOCK + . my $Attribution = << '.'; diff --git a/rt/sbin/license_tag b/rt/sbin/license_tag index 33da2e026..689b246ef 100644 --- a/rt/sbin/license_tag +++ b/rt/sbin/license_tag @@ -5,7 +5,7 @@ # # Copyright (c) 1996-2003 Jesse Vincent # -# (Except where explictly superceded by other copyright notices) +# (Except where explicitly superseded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -29,7 +29,7 @@ my $LICENSE = < -(Except where explictly superceded by other copyright notices) +(Except where explicitly superseded by other copyright notices) This work is made available to you under the terms of Version 2 of the GNU General Public License. A copy of that license should have @@ -57,7 +57,7 @@ File::Find::find({ no_chdir => 1, wanted => \&tag_pm}, 'lib'); File::Find::find({ no_chdir => 1, wanted => \&tag_mason}, 'html'); File::Find::find({ no_chdir => 1, wanted => \&tag_script}, 'sbin'); File::Find::find({ no_chdir => 1, wanted => \&tag_script}, 'bin'); -tag_makefile ('Makefile'); +tag_makefile ('Makefile.in'); tag_makefile ('README'); diff --git a/rt/sbin/rt-setup-database b/rt/sbin/rt-setup-database index f84f290b7..58f882f6e 100644 --- a/rt/sbin/rt-setup-database +++ b/rt/sbin/rt-setup-database @@ -80,7 +80,12 @@ if ( $args{'action'} eq 'init' ) { $dbh = DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr"; print "Now creating a database for RT.\n"; + if ($RT::DatabaseType ne 'Oracle' || + $args{'dba'} ne $RT::DatabaseUser) { create_db(); + } else { + print "...skipped as ".$args{'dba'} ." is not " . $RT::DatabaseUser . " or we're working with Oracle.\n"; + } $dbh->disconnect; $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) @@ -89,7 +94,7 @@ if ( $args{'action'} eq 'init' ) { print "Now populating database schema.\n"; insert_schema(); print "Now inserting database ACLs\n"; - insert_acl(); + insert_acl() unless ($RT::DatabaseType eq 'Oracle'); print "Now inserting RT core system objects\n"; insert_initial_data(); print "Now inserting RT data\n"; @@ -137,8 +142,9 @@ sub insert_schema { open( SCHEMA_LOCAL, "<" . $RT::LocalEtcPath . "/schema." . $RT::DatabaseType ); my $statement = ""; - foreach my $line (, ) { + foreach my $line (, ($_ = ';;'), ) { $line =~ s/\#.*//g; + $line =~ s/--.*//g; $statement .= $line; if ( $line =~ /;(\s*)$/ ) { $statement =~ s/;(\s*)$//g; @@ -147,10 +153,13 @@ sub insert_schema { } } + local $SIG{__WARN__} = sub {}; + my $is_local = 0; # local/etc/schema needs to be nonfatal. foreach my $statement (@schema) { - print STDERR $statement if $args{'debug'}; + if ($statement =~ /^\s*;$/) { $is_local = 1; next; } + print STDERR "SQL: $statement\n" if defined $args{'debug'}; my $sth = $dbh->prepare($statement) or die $dbh->errstr; - unless ( $sth->execute ) { + unless ( $sth->execute or $is_local ) { die "Problem with statement:\n $statement\n" . $sth->errstr; } } @@ -168,6 +177,16 @@ sub insert_schema { # {{{ sub drop_db sub drop_db { return if ( $RT::DatabaseType eq 'SQLite' ); + if ( $RT::DatabaseType eq 'Oracle' ) { + print <do("CREATE DATABASE $RT::DatabaseName") || die $DBI::errstr; } } + elsif ($RT::DatabaseType eq 'Oracle') { + insert_acl(); + } + elsif ( $RT::DatabaseType eq 'Informix' ) { + $ENV{DB_LOCALE} = 'en_us.utf8'; + $dbh->do("CREATE DATABASE $RT::DatabaseName WITH BUFFERED LOG"); + } else { $dbh->do("CREATE DATABASE $RT::DatabaseName") or die $DBI::errstr; } @@ -248,6 +274,10 @@ sub insert_acl { do $base_path . "/acl.mysql" || die "Couldn't find ACLS for mysql in " . $RT::EtcPath . "\n" . $@; } + elsif ( $RT::DatabaseType =~ /^informix$/i ) { + do $base_path . "/acl.Informix" + || die "Couldn't find ACLS for Informix in " . $RT::EtcPath . "\n" . $@; + } elsif ( $RT::DatabaseType =~ /^SQLite$/i ) { return; } @@ -287,6 +317,10 @@ sub get_system_dsn { elsif ( $RT::DatabaseType eq 'Pg' ) { $dsn =~ s/dbname=$RT::DatabaseName/dbname=template1/; } + elsif ( $RT::DatabaseType eq 'Informix' ) { + # with Informix, you want to connect sans database: + $dsn =~ s/Informix:$RT::DatabaseName/Informix:/; + } return $dsn; } @@ -302,7 +336,7 @@ sub insert_initial_data { #Put together a current user object so we can create a User object my $CurrentUser = new RT::CurrentUser(); - print "Checking for existing system user..."; + print "Checking for existing system user ($CurrentUser)..."; my $test_user = RT::User->new($CurrentUser); $test_user->Load('RT_System'); if ( $test_user->id ) { @@ -330,7 +364,7 @@ sub insert_initial_data { exit(1); } print "done.\n"; - $RT::Handle->dbh->disconnect(); + $RT::Handle->Disconnect(); } diff --git a/rt/sbin/rt-setup-database.in b/rt/sbin/rt-setup-database.in index e49a32ed9..9e990e5b8 100644 --- a/rt/sbin/rt-setup-database.in +++ b/rt/sbin/rt-setup-database.in @@ -80,7 +80,12 @@ if ( $args{'action'} eq 'init' ) { $dbh = DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr"; print "Now creating a database for RT.\n"; + if ($RT::DatabaseType ne 'Oracle' || + $args{'dba'} ne $RT::DatabaseUser) { create_db(); + } else { + print "...skipped as ".$args{'dba'} ." is not " . $RT::DatabaseUser . " or we're working with Oracle.\n"; + } $dbh->disconnect; $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) @@ -89,7 +94,7 @@ if ( $args{'action'} eq 'init' ) { print "Now populating database schema.\n"; insert_schema(); print "Now inserting database ACLs\n"; - insert_acl(); + insert_acl() unless ($RT::DatabaseType eq 'Oracle'); print "Now inserting RT core system objects\n"; insert_initial_data(); print "Now inserting RT data\n"; @@ -137,8 +142,9 @@ sub insert_schema { open( SCHEMA_LOCAL, "<" . $RT::LocalEtcPath . "/schema." . $RT::DatabaseType ); my $statement = ""; - foreach my $line (, ) { + foreach my $line (, ($_ = ';;'), ) { $line =~ s/\#.*//g; + $line =~ s/--.*//g; $statement .= $line; if ( $line =~ /;(\s*)$/ ) { $statement =~ s/;(\s*)$//g; @@ -147,10 +153,13 @@ sub insert_schema { } } + local $SIG{__WARN__} = sub {}; + my $is_local = 0; # local/etc/schema needs to be nonfatal. foreach my $statement (@schema) { - print STDERR $statement if $args{'debug'}; + if ($statement =~ /^\s*;$/) { $is_local = 1; next; } + print STDERR "SQL: $statement\n" if defined $args{'debug'}; my $sth = $dbh->prepare($statement) or die $dbh->errstr; - unless ( $sth->execute ) { + unless ( $sth->execute or $is_local ) { die "Problem with statement:\n $statement\n" . $sth->errstr; } } @@ -168,6 +177,16 @@ sub insert_schema { # {{{ sub drop_db sub drop_db { return if ( $RT::DatabaseType eq 'SQLite' ); + if ( $RT::DatabaseType eq 'Oracle' ) { + print <do("CREATE DATABASE $RT::DatabaseName") || die $DBI::errstr; } } + elsif ($RT::DatabaseType eq 'Oracle') { + insert_acl(); + } + elsif ( $RT::DatabaseType eq 'Informix' ) { + $ENV{DB_LOCALE} = 'en_us.utf8'; + $dbh->do("CREATE DATABASE $RT::DatabaseName WITH BUFFERED LOG"); + } else { $dbh->do("CREATE DATABASE $RT::DatabaseName") or die $DBI::errstr; } @@ -248,6 +274,10 @@ sub insert_acl { do $base_path . "/acl.mysql" || die "Couldn't find ACLS for mysql in " . $RT::EtcPath . "\n" . $@; } + elsif ( $RT::DatabaseType =~ /^informix$/i ) { + do $base_path . "/acl.Informix" + || die "Couldn't find ACLS for Informix in " . $RT::EtcPath . "\n" . $@; + } elsif ( $RT::DatabaseType =~ /^SQLite$/i ) { return; } @@ -287,6 +317,10 @@ sub get_system_dsn { elsif ( $RT::DatabaseType eq 'Pg' ) { $dsn =~ s/dbname=$RT::DatabaseName/dbname=template1/; } + elsif ( $RT::DatabaseType eq 'Informix' ) { + # with Informix, you want to connect sans database: + $dsn =~ s/Informix:$RT::DatabaseName/Informix:/; + } return $dsn; } @@ -302,7 +336,7 @@ sub insert_initial_data { #Put together a current user object so we can create a User object my $CurrentUser = new RT::CurrentUser(); - print "Checking for existing system user..."; + print "Checking for existing system user ($CurrentUser)..."; my $test_user = RT::User->new($CurrentUser); $test_user->Load('RT_System'); if ( $test_user->id ) { @@ -330,7 +364,7 @@ sub insert_initial_data { exit(1); } print "done.\n"; - $RT::Handle->dbh->disconnect(); + $RT::Handle->Disconnect(); } diff --git a/rt/sbin/rt-test-dependencies b/rt/sbin/rt-test-dependencies index 637d33a32..c1591b189 100644 --- a/rt/sbin/rt-test-dependencies +++ b/rt/sbin/rt-test-dependencies @@ -36,10 +36,14 @@ my %args; my %deps; GetOptions(\%args,'install', 'with-MYSQL', 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', 'with-ORACLE', 'with-FASTCGI', 'with-SPEEDYCGI', 'with-MODPERL1', 'with-MODPERL2' ,'with-DEV'); -if (!keys %args) { -help(); -exit(0); +if (!keys %args) { + help(); + exit(0); +} +if ($args{'with-MODPERL2'}) { + warn_modperl2(); } + $args{'with-MASON'} = 1; $args{'with-CORE'} = 1; $args{'with-DEV'} =1; @@ -49,10 +53,20 @@ if ($] < 5.007) { $args{'with-I18N-COMPAT'} = 1; } +sub warn_modperl2 { + print <<'.'; + NOTE: mod_perl 2.0 isn't quite ready for prime_time just yet; + Best Practical Solutions strongly recommends that sites use + Apache 1.3 or FastCGI. If you MUST use mod_perl 2.0 (or 1.99), + please read the mailing list archives before asking for help. +. + sleep 5; +} + sub help { -print <<'.' + print <<'.'; By default, testdeps determine whether you have installed all the perl modules RT needs to run. @@ -81,18 +95,18 @@ sub _ { } $deps{'CORE'} = [ _( << '.') ]; -Digest::MD5 -DBI 1.18 +Digest::MD5 2.27 +DBI 1.37 Test::Inline Class::ReturnValue 0.40 -DBIx::SearchBuilder 0.86 +DBIx::SearchBuilder 0.97 Text::Template File::Spec 0.8 HTML::Entities Net::Domain Log::Dispatch 2.0 -Locale::Maketext 1.04 -Locale::Maketext::Lexicon 0.25 +Locale::Maketext 1.06 +Locale::Maketext::Lexicon 0.32 Locale::Maketext::Fuzzy MIME::Entity 5.108 Mail::Mailer 1.57 @@ -102,7 +116,8 @@ Time::ParseDate File::Temp Term::ReadKey Text::Autoformat -Text::Quoted +Text::Quoted 1.3 +Scalar::Util . $deps{'MASON'} = [ _( << '.') ]; @@ -113,9 +128,9 @@ HTML::Mason 1.16 MLDBM Errno FreezeThaw -Digest::MD5 +Digest::MD5 2.27 CGI::Cookie 1.20 -Storable +Storable 2.08 Apache::Session 1.53 . @@ -138,25 +153,25 @@ WWW::Mechanize . $deps{'FASTCGI'} = [ _( << '.') ]; -CGI +CGI 2.92 FCGI CGI::Fast . $deps{'SPEEDYCGI'} = [ _( << '.') ]; -CGI +CGI 2.92 CGI::SpeedyCGI . $deps{'MODPERL1'} = [ _( << '.') ]; -CGI +CGI 2.92 Apache::Request -Apache::DBI +Apache::DBI 0.92 . $deps{'MODPERL2'} = [ _( << '.') ]; -CGI 2.89 +CGI 2.92 Apache::DBI . @@ -175,6 +190,23 @@ $deps{'POSTGRESQL'} = [ _( << '.') ]; DBD::Pg . +print "perl:\n"; +print "\t5.8.0"; +eval {require 5.008}; +if ($@) { +print "...missing.\n"; + eval {require 5.006001}; + if ($@) { + print " RT is known to be non-functional on versions of perl older than 5.6.1. Please upgrade to 5.8.0 or newer"; + die; + } else { + print " RT is not supported on perl 5.6.1\n"; + } +} else { + print "...found\n"; + +} + foreach my $type (keys %args) { next unless ($type =~ /^with-(.*?)$/); @@ -196,17 +228,17 @@ sub test_dep { my $module = shift; my $version = shift; - print "\t$module $version"; - eval "use $module $version" ; - if ($@) { - my $error = $@; - $error =~ s/\n(.*)$//s; - print "...MISSING\n"; - print "\t\t$error\n" if $error =~ /this is only/; + print "\t$module $version"; + eval "use $module $version" ; + if ($@) { + my $error = $@; + $error =~ s/\n(.*)$//s; + print "...MISSING\n"; + print "\t\t$error\n" if $error =~ /this is only/; - return undef; + return undef; } else { - print "...found\n"; + print "...found\n"; return 1; } } diff --git a/rt/sbin/rt-test-dependencies.in b/rt/sbin/rt-test-dependencies.in index 6951290c4..7a1508010 100644 --- a/rt/sbin/rt-test-dependencies.in +++ b/rt/sbin/rt-test-dependencies.in @@ -36,10 +36,14 @@ my %args; my %deps; GetOptions(\%args,'install', 'with-MYSQL', 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', 'with-ORACLE', 'with-FASTCGI', 'with-SPEEDYCGI', 'with-MODPERL1', 'with-MODPERL2' ,'with-DEV'); -if (!keys %args) { -help(); -exit(0); +if (!keys %args) { + help(); + exit(0); +} +if ($args{'with-MODPERL2'}) { + warn_modperl2(); } + $args{'with-MASON'} = 1; $args{'with-CORE'} = 1; $args{'with-DEV'} =1; @@ -49,10 +53,20 @@ if ($] < 5.007) { $args{'with-I18N-COMPAT'} = 1; } +sub warn_modperl2 { + print <<'.'; + NOTE: mod_perl 2.0 isn't quite ready for prime_time just yet; + Best Practical Solutions strongly recommends that sites use + Apache 1.3 or FastCGI. If you MUST use mod_perl 2.0 (or 1.99), + please read the mailing list archives before asking for help. +. + sleep 5; +} + sub help { -print <<'.' + print <<'.'; By default, testdeps determine whether you have installed all the perl modules RT needs to run. @@ -81,18 +95,18 @@ sub _ { } $deps{'CORE'} = [ _( << '.') ]; -Digest::MD5 -DBI 1.18 +Digest::MD5 2.27 +DBI 1.37 Test::Inline Class::ReturnValue 0.40 -DBIx::SearchBuilder 0.86 +DBIx::SearchBuilder 0.97 Text::Template File::Spec 0.8 HTML::Entities Net::Domain Log::Dispatch 2.0 -Locale::Maketext 1.04 -Locale::Maketext::Lexicon 0.25 +Locale::Maketext 1.06 +Locale::Maketext::Lexicon 0.32 Locale::Maketext::Fuzzy MIME::Entity 5.108 Mail::Mailer 1.57 @@ -102,7 +116,8 @@ Time::ParseDate File::Temp Term::ReadKey Text::Autoformat -Text::Quoted +Text::Quoted 1.3 +Scalar::Util . $deps{'MASON'} = [ _( << '.') ]; @@ -113,9 +128,9 @@ HTML::Mason 1.16 MLDBM Errno FreezeThaw -Digest::MD5 +Digest::MD5 2.27 CGI::Cookie 1.20 -Storable +Storable 2.08 Apache::Session 1.53 . @@ -138,25 +153,25 @@ WWW::Mechanize . $deps{'FASTCGI'} = [ _( << '.') ]; -CGI +CGI 2.92 FCGI CGI::Fast . $deps{'SPEEDYCGI'} = [ _( << '.') ]; -CGI +CGI 2.92 CGI::SpeedyCGI . $deps{'MODPERL1'} = [ _( << '.') ]; -CGI +CGI 2.92 Apache::Request -Apache::DBI +Apache::DBI 0.92 . $deps{'MODPERL2'} = [ _( << '.') ]; -CGI 2.89 +CGI 2.92 Apache::DBI . @@ -175,6 +190,23 @@ $deps{'POSTGRESQL'} = [ _( << '.') ]; DBD::Pg . +print "perl:\n"; +print "\t5.8.0"; +eval {require 5.008}; +if ($@) { +print "...missing.\n"; + eval {require 5.006001}; + if ($@) { + print " RT is known to be non-functional on versions of perl older than 5.6.1. Please upgrade to 5.8.0 or newer"; + die; + } else { + print " RT is not supported on perl 5.6.1\n"; + } +} else { + print "...found\n"; + +} + foreach my $type (keys %args) { next unless ($type =~ /^with-(.*?)$/); @@ -196,17 +228,17 @@ sub test_dep { my $module = shift; my $version = shift; - print "\t$module $version"; - eval "use $module $version" ; - if ($@) { - my $error = $@; - $error =~ s/\n(.*)$//s; - print "...MISSING\n"; - print "\t\t$error\n" if $error =~ /this is only/; + print "\t$module $version"; + eval "use $module $version" ; + if ($@) { + my $error = $@; + $error =~ s/\n(.*)$//s; + print "...MISSING\n"; + print "\t\t$error\n" if $error =~ /this is only/; - return undef; + return undef; } else { - print "...found\n"; + print "...found\n"; return 1; } }