This commit was generated by cvs2svn to compensate for changes in r2526,
authorivan <ivan>
Tue, 15 Jul 2003 13:16:32 +0000 (13:16 +0000)
committerivan <ivan>
Tue, 15 Jul 2003 13:16:32 +0000 (13:16 +0000)
which included commits to RCS files with non-trunk default branches.

369 files changed:
rt/Changelog [new file with mode: 0644]
rt/HOWTO/README [new file with mode: 0644]
rt/HOWTO/change.txt [new file with mode: 0644]
rt/HOWTO/release.txt [new file with mode: 0644]
rt/HOWTO/version-control.txt [new file with mode: 0644]
rt/Makefile.in [new file with mode: 0644]
rt/aclocal.m4 [new file with mode: 0644]
rt/autom4te.cache/output.0 [new file with mode: 0644]
rt/autom4te.cache/requests [new file with mode: 0644]
rt/autom4te.cache/traces.0 [new file with mode: 0644]
rt/bin/mason_handler.fcgi.in [new file with mode: 0644]
rt/bin/mason_handler.scgi.in [new file with mode: 0644]
rt/bin/mason_handler.svc [new file with mode: 0644]
rt/bin/mason_handler.svc.in [new file with mode: 0644]
rt/bin/rt-commit-handler [new file with mode: 0644]
rt/bin/rt-commit-handler.in [new file with mode: 0644]
rt/bin/rt-crontool [new file with mode: 0644]
rt/bin/rt-crontool.in [new file with mode: 0644]
rt/bin/rt-mailgate.in [new file with mode: 0644]
rt/bin/webmux.pl.in [new file with mode: 0644]
rt/config [new file with mode: 0644]
rt/config.layout [new file with mode: 0644]
rt/config.log [new file with mode: 0644]
rt/config.pld [new file with mode: 0644]
rt/config.status [new file with mode: 0755]
rt/configure [new file with mode: 0755]
rt/configure.ac [new file with mode: 0644]
rt/docs/design_docs/approval_notices [new file with mode: 0644]
rt/docs/design_docs/approval_template [new file with mode: 0644]
rt/docs/design_docs/cf_search [new file with mode: 0644]
rt/docs/design_docs/delegation [new file with mode: 0644]
rt/docs/design_docs/groups_notes [new file with mode: 0644]
rt/docs/design_docs/recursive_group_membership_algorithm [new file with mode: 0644]
rt/docs/design_docs/rql_parser_machine.graphviz [new file with mode: 0644]
rt/docs/design_docs/string-extraction-guide.txt [new file with mode: 0644]
rt/docs/design_docs/ticket_templates [new file with mode: 0644]
rt/etc/RT_Config.pm [new file with mode: 0644]
rt/etc/RT_Config.pm.in [new file with mode: 0644]
rt/etc/RT_SiteConfig.pm [new file with mode: 0644]
rt/etc/constraints.mysql [new file with mode: 0644]
rt/etc/initialdata [new file with mode: 0644]
rt/etc/schema.SQLite [new file with mode: 0644]
rt/etc/upgrade/2.1.71 [new file with mode: 0644]
rt/html/Admin/Elements/AddCustomFieldValue [new file with mode: 0644]
rt/html/Admin/Elements/CreateUserCalled [new file with mode: 0644]
rt/html/Admin/Elements/EditCustomField [new file with mode: 0644]
rt/html/Admin/Elements/EditCustomFieldValues [new file with mode: 0644]
rt/html/Admin/Elements/EditCustomFields [new file with mode: 0644]
rt/html/Admin/Elements/EditQueueWatchers [new file with mode: 0644]
rt/html/Admin/Elements/EditScrip [new file with mode: 0644]
rt/html/Admin/Elements/EditScrips [new file with mode: 0644]
rt/html/Admin/Elements/EditTemplates [new file with mode: 0644]
rt/html/Admin/Elements/EditUserComments [new file with mode: 0644]
rt/html/Admin/Elements/GroupTabs [new file with mode: 0644]
rt/html/Admin/Elements/Header [new file with mode: 0644]
rt/html/Admin/Elements/ListGlobalCustomFields [new file with mode: 0644]
rt/html/Admin/Elements/ListGlobalScrips [new file with mode: 0644]
rt/html/Admin/Elements/ModifyQueue [new file with mode: 0644]
rt/html/Admin/Elements/ModifyTemplate [new file with mode: 0644]
rt/html/Admin/Elements/ModifyUser [new file with mode: 0644]
rt/html/Admin/Elements/QueueRightsForUser [new file with mode: 0644]
rt/html/Admin/Elements/QueueTabs [new file with mode: 0644]
rt/html/Admin/Elements/SelectCustomFieldType [new file with mode: 0644]
rt/html/Admin/Elements/SelectGroups [new file with mode: 0644]
rt/html/Admin/Elements/SelectModifyGroup [new file with mode: 0644]
rt/html/Admin/Elements/SelectModifyQueue [new file with mode: 0644]
rt/html/Admin/Elements/SelectModifyUser [new file with mode: 0644]
rt/html/Admin/Elements/SelectNewGroupMembers [new file with mode: 0644]
rt/html/Admin/Elements/SelectRights [new file with mode: 0644]
rt/html/Admin/Elements/SelectScrip [new file with mode: 0644]
rt/html/Admin/Elements/SelectScripAction [new file with mode: 0644]
rt/html/Admin/Elements/SelectScripCondition [new file with mode: 0644]
rt/html/Admin/Elements/SelectSingleOrMultiple [new file with mode: 0644]
rt/html/Admin/Elements/SelectTemplate [new file with mode: 0644]
rt/html/Admin/Elements/SelectUsers [new file with mode: 0644]
rt/html/Admin/Elements/SystemTabs [new file with mode: 0644]
rt/html/Admin/Elements/Tabs [new file with mode: 0644]
rt/html/Admin/Elements/UserTabs [new file with mode: 0644]
rt/html/Admin/Global/CustomField.html [new file with mode: 0644]
rt/html/Admin/Global/CustomFields.html [new file with mode: 0644]
rt/html/Admin/Global/GroupRights.html [new file with mode: 0644]
rt/html/Admin/Global/Scrip.html [new file with mode: 0644]
rt/html/Admin/Global/Scrips.html [new file with mode: 0644]
rt/html/Admin/Global/Template.html [new file with mode: 0644]
rt/html/Admin/Global/Templates.html [new file with mode: 0644]
rt/html/Admin/Global/UserRights.html [new file with mode: 0644]
rt/html/Admin/Global/index.html [new file with mode: 0644]
rt/html/Admin/Groups/GroupRights.html [new file with mode: 0644]
rt/html/Admin/Groups/Members.html [new file with mode: 0644]
rt/html/Admin/Groups/Modify.html [new file with mode: 0644]
rt/html/Admin/Groups/UserRights.html [new file with mode: 0644]
rt/html/Admin/Groups/index.html [new file with mode: 0644]
rt/html/Admin/Queues/CustomField.html [new file with mode: 0644]
rt/html/Admin/Queues/CustomFields.html [new file with mode: 0644]
rt/html/Admin/Queues/GroupRights.html [new file with mode: 0644]
rt/html/Admin/Queues/Modify.html [new file with mode: 0644]
rt/html/Admin/Queues/People.html [new file with mode: 0644]
rt/html/Admin/Queues/Scrip.html [new file with mode: 0644]
rt/html/Admin/Queues/Scrips.html [new file with mode: 0644]
rt/html/Admin/Queues/Template.html [new file with mode: 0644]
rt/html/Admin/Queues/Templates.html [new file with mode: 0644]
rt/html/Admin/Queues/UserRights.html [new file with mode: 0644]
rt/html/Admin/Queues/index.html [new file with mode: 0644]
rt/html/Admin/Users/Modify.html [new file with mode: 0644]
rt/html/Admin/Users/Prefs.html [new file with mode: 0644]
rt/html/Admin/Users/index.html [new file with mode: 0644]
rt/html/Admin/index.html [new file with mode: 0644]
rt/html/Approvals/Display.html [new file with mode: 0644]
rt/html/Approvals/Elements/Approve [new file with mode: 0644]
rt/html/Approvals/Elements/PendingMyApproval [new file with mode: 0644]
rt/html/Approvals/Elements/ShowDependency [new file with mode: 0644]
rt/html/Approvals/Elements/Tabs [new file with mode: 0644]
rt/html/Approvals/index.html [new file with mode: 0644]
rt/html/Elements/BevelBoxRaisedEnd [new file with mode: 0644]
rt/html/Elements/BevelBoxRaisedStart [new file with mode: 0644]
rt/html/Elements/Callback [new file with mode: 0644]
rt/html/Elements/Checkbox [new file with mode: 0644]
rt/html/Elements/CreateTicket [new file with mode: 0644]
rt/html/Elements/Error [new file with mode: 0644]
rt/html/Elements/Footer [new file with mode: 0644]
rt/html/Elements/GotoTicket [new file with mode: 0644]
rt/html/Elements/Header [new file with mode: 0644]
rt/html/Elements/ListActions [new file with mode: 0644]
rt/html/Elements/Login [new file with mode: 0644]
rt/html/Elements/Menu [new file with mode: 0644]
rt/html/Elements/MessageBox [new file with mode: 0644]
rt/html/Elements/MyRequests [new file with mode: 0644]
rt/html/Elements/MyTickets [new file with mode: 0644]
rt/html/Elements/PageLayout [new file with mode: 0644]
rt/html/Elements/Quicksearch [new file with mode: 0644]
rt/html/Elements/Refresh [new file with mode: 0644]
rt/html/Elements/Section [new file with mode: 0644]
rt/html/Elements/SelectAttachmentField [new file with mode: 0644]
rt/html/Elements/SelectBoolean [new file with mode: 0644]
rt/html/Elements/SelectCustomFieldOperator [new file with mode: 0644]
rt/html/Elements/SelectCustomFieldValue [new file with mode: 0644]
rt/html/Elements/SelectDate [new file with mode: 0644]
rt/html/Elements/SelectDateRelation [new file with mode: 0644]
rt/html/Elements/SelectDateType [new file with mode: 0644]
rt/html/Elements/SelectEqualityOperator [new file with mode: 0644]
rt/html/Elements/SelectGroups [new file with mode: 0644]
rt/html/Elements/SelectLinkType [new file with mode: 0644]
rt/html/Elements/SelectMatch [new file with mode: 0644]
rt/html/Elements/SelectNewTicketQueue [new file with mode: 0644]
rt/html/Elements/SelectOwner [new file with mode: 0644]
rt/html/Elements/SelectQueue [new file with mode: 0644]
rt/html/Elements/SelectResultsPerPage [new file with mode: 0644]
rt/html/Elements/SelectSortOrder [new file with mode: 0644]
rt/html/Elements/SelectStatus [new file with mode: 0644]
rt/html/Elements/SelectTicketSortBy [new file with mode: 0644]
rt/html/Elements/SelectTicketTypes [new file with mode: 0644]
rt/html/Elements/SelectUsers [new file with mode: 0644]
rt/html/Elements/SelectWatcherType [new file with mode: 0644]
rt/html/Elements/SetupSessionCookie [new file with mode: 0644]
rt/html/Elements/ShadedBox [new file with mode: 0644]
rt/html/Elements/ShadedInputRow [new file with mode: 0644]
rt/html/Elements/ShadedRow [new file with mode: 0644]
rt/html/Elements/SimpleSearch [new file with mode: 0644]
rt/html/Elements/Submit [new file with mode: 0644]
rt/html/Elements/Tabs [new file with mode: 0644]
rt/html/Elements/TitleBoxEnd [new file with mode: 0644]
rt/html/Elements/TitleBoxStart [new file with mode: 0644]
rt/html/Elements/ViewUser [new file with mode: 0644]
rt/html/NoAuth/Logout.html [new file with mode: 0644]
rt/html/NoAuth/Reminder.html [new file with mode: 0644]
rt/html/NoAuth/images/back_home.gif [new file with mode: 0644]
rt/html/NoAuth/images/bplogo.gif [new file with mode: 0644]
rt/html/NoAuth/images/favicon.png [new file with mode: 0644]
rt/html/NoAuth/images/head_requestracker.gif [new file with mode: 0644]
rt/html/NoAuth/images/rt.jpg [new file with mode: 0644]
rt/html/NoAuth/images/space.gif [new file with mode: 0644]
rt/html/NoAuth/images/spacer.gif [new file with mode: 0644]
rt/html/NoAuth/images/squares_blue.gif [new file with mode: 0644]
rt/html/NoAuth/webrt.css [new file with mode: 0644]
rt/html/REST/1.0/NoAuth/mail-gateway [new file with mode: 0644]
rt/html/Search/Bulk.html [new file with mode: 0644]
rt/html/Search/Elements/PickRestriction [new file with mode: 0644]
rt/html/Search/Elements/TicketHeader [new file with mode: 0644]
rt/html/Search/Elements/TicketHeaderCell [new file with mode: 0644]
rt/html/Search/Elements/TicketRow [new file with mode: 0644]
rt/html/Search/Listing.html [new file with mode: 0644]
rt/html/SelfService/Attachment/dhandler [new file with mode: 0644]
rt/html/SelfService/Closed.html [new file with mode: 0644]
rt/html/SelfService/Create.html [new file with mode: 0644]
rt/html/SelfService/Display.html [new file with mode: 0644]
rt/html/SelfService/Elements/GotoTicket [new file with mode: 0644]
rt/html/SelfService/Elements/Header [new file with mode: 0644]
rt/html/SelfService/Elements/MyRequests [new file with mode: 0644]
rt/html/SelfService/Elements/Tabs [new file with mode: 0644]
rt/html/SelfService/Error.html [new file with mode: 0644]
rt/html/SelfService/Prefs.html [new file with mode: 0644]
rt/html/SelfService/Update.html [new file with mode: 0644]
rt/html/SelfService/index.html [new file with mode: 0644]
rt/html/Ticket/Attachment/dhandler [new file with mode: 0644]
rt/html/Ticket/Create.html [new file with mode: 0644]
rt/html/Ticket/Display.html [new file with mode: 0644]
rt/html/Ticket/Elements/AddWatchers [new file with mode: 0644]
rt/html/Ticket/Elements/BulkLinks [new file with mode: 0644]
rt/html/Ticket/Elements/EditBasics [new file with mode: 0644]
rt/html/Ticket/Elements/EditCustomField [new file with mode: 0644]
rt/html/Ticket/Elements/EditCustomFields [new file with mode: 0644]
rt/html/Ticket/Elements/EditDates [new file with mode: 0644]
rt/html/Ticket/Elements/EditLinks [new file with mode: 0644]
rt/html/Ticket/Elements/EditPeople [new file with mode: 0644]
rt/html/Ticket/Elements/EditWatchers [new file with mode: 0644]
rt/html/Ticket/Elements/ShowAttachments [new file with mode: 0644]
rt/html/Ticket/Elements/ShowBasics [new file with mode: 0644]
rt/html/Ticket/Elements/ShowCustomFields [new file with mode: 0644]
rt/html/Ticket/Elements/ShowDates [new file with mode: 0644]
rt/html/Ticket/Elements/ShowDependencies [new file with mode: 0644]
rt/html/Ticket/Elements/ShowHistory [new file with mode: 0644]
rt/html/Ticket/Elements/ShowLink [new file with mode: 0644]
rt/html/Ticket/Elements/ShowLinks [new file with mode: 0644]
rt/html/Ticket/Elements/ShowMemberOf [new file with mode: 0644]
rt/html/Ticket/Elements/ShowMembers [new file with mode: 0644]
rt/html/Ticket/Elements/ShowMessageHeaders [new file with mode: 0644]
rt/html/Ticket/Elements/ShowMessageStanza [new file with mode: 0644]
rt/html/Ticket/Elements/ShowPeople [new file with mode: 0644]
rt/html/Ticket/Elements/ShowReferences [new file with mode: 0644]
rt/html/Ticket/Elements/ShowRequestor [new file with mode: 0644]
rt/html/Ticket/Elements/ShowSummary [new file with mode: 0644]
rt/html/Ticket/Elements/ShowTransaction [new file with mode: 0644]
rt/html/Ticket/Elements/Tabs [new file with mode: 0644]
rt/html/Ticket/History.html [new file with mode: 0644]
rt/html/Ticket/Modify.html [new file with mode: 0644]
rt/html/Ticket/ModifyAll.html [new file with mode: 0644]
rt/html/Ticket/ModifyDates.html [new file with mode: 0644]
rt/html/Ticket/ModifyLinks.html [new file with mode: 0644]
rt/html/Ticket/ModifyPeople.html [new file with mode: 0644]
rt/html/Ticket/Update.html [new file with mode: 0644]
rt/html/User/Delegation.html [new file with mode: 0644]
rt/html/User/Elements/DelegateRights [new file with mode: 0644]
rt/html/User/Elements/GroupTabs [new file with mode: 0644]
rt/html/User/Elements/Tabs [new file with mode: 0644]
rt/html/User/Groups/Members.html [new file with mode: 0644]
rt/html/User/Groups/Modify.html [new file with mode: 0644]
rt/html/User/Groups/index.html [new file with mode: 0644]
rt/html/User/Prefs.html [new file with mode: 0644]
rt/html/autohandler [new file with mode: 0644]
rt/html/index.html [new file with mode: 0644]
rt/html/l [new file with mode: 0644]
rt/install-sh [new file with mode: 0644]
rt/lib/RT.pm.in [new file with mode: 0644]
rt/lib/RT/ACE_Overlay.pm [new file with mode: 0644]
rt/lib/RT/ACL_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Action/AutoOpen.pm [new file with mode: 0644]
rt/lib/RT/Action/CreateTickets.pm [new file with mode: 0644]
rt/lib/RT/Action/EscalatePriority.pm [new file with mode: 0644]
rt/lib/RT/Action/SetPriority.pm [new file with mode: 0644]
rt/lib/RT/Action/UserDefined.pm [new file with mode: 0644]
rt/lib/RT/Attachment_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Attachments_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Base.pm [new file with mode: 0644]
rt/lib/RT/CachedGroupMember.pm [new file with mode: 0644]
rt/lib/RT/CachedGroupMember_Overlay.pm [new file with mode: 0644]
rt/lib/RT/CachedGroupMembers.pm [new file with mode: 0644]
rt/lib/RT/CachedGroupMembers_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Condition/BeforeDue.pm [new file with mode: 0644]
rt/lib/RT/Condition/Overdue.pm [new file with mode: 0644]
rt/lib/RT/Condition/OwnerChange.pm [new file with mode: 0644]
rt/lib/RT/Condition/PriorityExceeds.pm [new file with mode: 0644]
rt/lib/RT/Condition/QueueChange.pm [new file with mode: 0644]
rt/lib/RT/Condition/UserDefined.pm [new file with mode: 0644]
rt/lib/RT/CustomField.pm [new file with mode: 0644]
rt/lib/RT/CustomFieldValue.pm [new file with mode: 0644]
rt/lib/RT/CustomFieldValues.pm [new file with mode: 0644]
rt/lib/RT/CustomFieldValues_Overlay.pm [new file with mode: 0644]
rt/lib/RT/CustomField_Overlay.pm [new file with mode: 0644]
rt/lib/RT/CustomFields.pm [new file with mode: 0644]
rt/lib/RT/CustomFields_Overlay.pm [new file with mode: 0644]
rt/lib/RT/EmailParser.pm [new file with mode: 0644]
rt/lib/RT/GroupMember_Overlay.pm [new file with mode: 0644]
rt/lib/RT/GroupMembers_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Group_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Groups_Overlay.pm [new file with mode: 0644]
rt/lib/RT/I18N.pm [new file with mode: 0644]
rt/lib/RT/I18N/cs.pm [new file with mode: 0644]
rt/lib/RT/I18N/cs.po [new file with mode: 0644]
rt/lib/RT/I18N/de.po [new file with mode: 0644]
rt/lib/RT/I18N/en.po [new file with mode: 0644]
rt/lib/RT/I18N/es.po [new file with mode: 0644]
rt/lib/RT/I18N/fi.po [new file with mode: 0644]
rt/lib/RT/I18N/fr.po [new file with mode: 0644]
rt/lib/RT/I18N/he.po [new file with mode: 0644]
rt/lib/RT/I18N/i_default.pm [new file with mode: 0644]
rt/lib/RT/I18N/ja.po [new file with mode: 0644]
rt/lib/RT/I18N/nl.po [new file with mode: 0644]
rt/lib/RT/I18N/no.po [new file with mode: 0644]
rt/lib/RT/I18N/pt_br.po [new file with mode: 0644]
rt/lib/RT/I18N/ru.po [new file with mode: 0644]
rt/lib/RT/I18N/zh_cn.po [new file with mode: 0644]
rt/lib/RT/I18N/zh_tw.po [new file with mode: 0644]
rt/lib/RT/Interface/Email/Auth/MailFrom.pm [new file with mode: 0644]
rt/lib/RT/Interface/Email/Filter/SpamAssassin.pm [new file with mode: 0644]
rt/lib/RT/Link_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Links_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Principal.pm [new file with mode: 0644]
rt/lib/RT/Principal_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Principals.pm [new file with mode: 0644]
rt/lib/RT/Principals_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Queue_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Queues_Overlay.pm [new file with mode: 0644]
rt/lib/RT/ScripAction_Overlay.pm [new file with mode: 0644]
rt/lib/RT/ScripActions_Overlay.pm [new file with mode: 0644]
rt/lib/RT/ScripCondition_Overlay.pm [new file with mode: 0644]
rt/lib/RT/ScripConditions_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Scrip_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Scrips_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Search/ActiveTicketsInQueue.pm [new file with mode: 0644]
rt/lib/RT/Search/Generic.pm [new file with mode: 0644]
rt/lib/RT/SearchBuilder.pm [new file with mode: 0644]
rt/lib/RT/System.pm [new file with mode: 0644]
rt/lib/RT/Template_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Templates_Overlay.pm [new file with mode: 0644]
rt/lib/RT/TicketCustomFieldValue.pm [new file with mode: 0644]
rt/lib/RT/TicketCustomFieldValue_Overlay.pm [new file with mode: 0644]
rt/lib/RT/TicketCustomFieldValues.pm [new file with mode: 0644]
rt/lib/RT/TicketCustomFieldValues_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Ticket_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Tickets_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Tickets_Overlay_SQL.pm [new file with mode: 0644]
rt/lib/RT/Transaction_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Transactions_Overlay.pm [new file with mode: 0644]
rt/lib/RT/URI.pm [new file with mode: 0644]
rt/lib/RT/URI/base.pm [new file with mode: 0644]
rt/lib/RT/URI/fsck_com_rt.pm [new file with mode: 0644]
rt/lib/RT/User_Overlay.pm [new file with mode: 0644]
rt/lib/RT/Users_Overlay.pm [new file with mode: 0644]
rt/lib/t/00smoke.t [new file with mode: 0644]
rt/lib/t/00smoke.t.in [new file with mode: 0644]
rt/lib/t/01harness.t [new file with mode: 0644]
rt/lib/t/01harness.t.in [new file with mode: 0644]
rt/lib/t/02regression.t [new file with mode: 0644]
rt/lib/t/02regression.t.in [new file with mode: 0644]
rt/lib/t/03web.pl [new file with mode: 0644]
rt/lib/t/03web.pl.in [new file with mode: 0644]
rt/lib/t/04_send_email.pl [new file with mode: 0644]
rt/lib/t/04_send_email.pl.in [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/dir [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg1 [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg2 [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg3 [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg4 [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg5 [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg6 [new file with mode: 0644]
rt/lib/t/data/8859-15-message-series/msg7 [new file with mode: 0644]
rt/lib/t/data/multipart-alternative-with-umlaut [new file with mode: 0644]
rt/lib/t/data/nested-mime-sample [new file with mode: 0644]
rt/lib/t/data/nested-rfc-822 [new file with mode: 0644]
rt/lib/t/data/new-ticket-from-iso-8859-1 [new file with mode: 0644]
rt/lib/t/data/new-ticket-from-iso-8859-1-full [new file with mode: 0644]
rt/lib/t/data/russian-subject-no-content-type [new file with mode: 0644]
rt/lib/t/data/text-html-in-russian [new file with mode: 0644]
rt/lib/t/data/text-html-with-umlaut [new file with mode: 0644]
rt/lib/t/regression/00placeholder [new file with mode: 0644]
rt/lib/t/regression/mime_tests [new file with mode: 0644]
rt/m4/rt_enable_layout.m4 [new file with mode: 0644]
rt/m4/rt_expand_var.m4 [new file with mode: 0644]
rt/m4/rt_layout.m4 [new file with mode: 0644]
rt/m4/rt_subst_expanded_arg.m4 [new file with mode: 0644]
rt/sbin/extract-message-catalog [new file with mode: 0644]
rt/sbin/extract_pod_tests [new file with mode: 0644]
rt/sbin/factory [new file with mode: 0644]
rt/sbin/license_tag [new file with mode: 0644]
rt/sbin/regression_harness [new file with mode: 0644]
rt/sbin/rt-setup-database [new file with mode: 0644]
rt/sbin/rt-setup-database.in [new file with mode: 0644]
rt/sbin/rt-test-dependencies [new file with mode: 0644]
rt/sbin/rt-test-dependencies.in [new file with mode: 0644]

diff --git a/rt/Changelog b/rt/Changelog
new file mode 100644 (file)
index 0000000..d8d73fd
--- /dev/null
@@ -0,0 +1,1286 @@
+
+
+
+Project "rt.3", Branch 0                                                 Page 1
+Change Log                                             Sat Jul 12 04:24:41 2003
+
+rt.3.D000, C0, jesse, Thu Mar 13 20:43:23 2003, RT: Request Tracker, branch 3.0.
+    RT: Request Tracker, branch 3.0.
+
+    Change Delta  Brief Description
+      10      1          Bumping the version to rt.3.0.0rc0
+      11      2          Minor CSS update. rollback fix; new database indices;
+                 copyright update
+      15      3          removing the old REST API
+      16      4          Performance work on 'WhoHaveRight'; bumping to 3.0.0rc2
+      12      5          fixing indices for postgres
+      17      6          fixing fastcgi's ability to load webmux.pl on some platforms
+      18      7          More performance work; backing out 'enhancements' that killed
+                 system performance
+      19      8          Caving in to the masses and making 'notify sender'
+                 configurable
+      20      9          finishing the notify stuff
+      22     10          Bumping to RC3; fixing the display of 'This user's n highest
+                 priority tix'
+      23     11          New french translation
+      25     12          Brazilian Portuguese translation
+      26     13          Postgres fixes
+      27     14          Postgres schema tweak
+      28     15          Further postgres tweaks and fixes
+      29     16          RT should now be less overzealous about opening and then
+                 marking a ticket 'new' again
+      30     17          Bumping to 3.0.0rc4
+      31     18          Minor fixes - Bumped to 3.0.0;
+                 2266 - postgres scrip creation bug
+                 2267 - Tickets not reopened after being stalled
+                 2265 - Fixed css nits from blaise
+                 Unreported - Fixed quick-search bug
+      32     19          Added better error checking for failed ticket creation
+      33     20          A tiny bit of extra data passing for some callbacks
+      35     21          New czech translation
+      37     22          Updated dependencies
+      36     23          Updated Spanish translation
+      38     24          Updates for RT RPC interface from AMS
+      39     25          Many users should be able to have a blank address; neew test
+                 suite to ensure this
+      50     26          Integrating rafael's failing test suite and proposed fix from
+                 autrijus
+      51     27          Changing address used in example to not send mail to author
+      52     28          More I18N testing  for rafael
+      53     29          Added preliminary left to right hebrew translation
+      55     30          #2365 Removing outdated Mason setup parameter
+      56     31          Testing fixes for mail authentication/authorization
+      57     32          Testing and fixing binary attachment corruption
+      58     33          Better binary attachment handling fix from autrijus
+      59     34          Bumping to RT 3.0.1pre2
+      60     35          SMTP and I18N fixes from autrijus tang. Updated chinese
+                 translations
+      61     36          New speedycgi support from vivek khera
+      62     37          Bumping to version 3.0.1
+      63     38          Fixing a showmessagestanza bug found in RTIR
+      65     39          Fixing an untainting bug in 3.0.1
+      66     40          Quicksearch bug fix from Stan
+      67     41          updating autrijus' autohandler patch. seems to break lots of
+                 stuff
+      68     42          Bumping to 3.0.2pre1
+      69     43          make ids clicky
+      70     44          fixing utf8 tainting issue in autohandler; bumped to 3.0.2pre2
+      71     45          Another go at fixing the ARRAY()  issue; bumping to 3.0.2pre3
+      72     46          bulk links
+      73     47          I18N patches from autrijus; bouncing to 3.0.2pre4
+      75     48          bumped version to 3.0.2pre5; attachments performance fixes;
+                 utf-8 mailgateway fixes; more extension hooks; template
+                 updates for approvals
+      76     49          [#2437] CanonicalizeEmailAddress fixes; [# 2449] html fixes
+                 for right editing; [# 2457] email addresses weren't always
+                 being canonicalized
+      77     50          Fixing bogus anchor tags
+      78     51          More performance work on WhoHaveRight; removing an extra join
+      79     52          Cleaning up RT tag processing
+      80     53          Importing utf8 fixes, _Vendor overlay support from ourinternet
+      81     54          Bumping the version to 3.0.2pre6
+      82     55          Bumping the version to RT 3.0.2
+      83     56          merge from ourinternet; one CreateTickets fix and some utf8
+                 updates
+      85     57          Robert's updated search stuff
+      86     58          Fix for #2602 - make test fails on _Config.pm
+      87     59          Including norwegian bokmal translation
+      14     60          #2539: Re: [rt-users] unexpected usage: change sort order with
+                 column headers in search window
+      88     61          Fix to honor '$LogDir' for LogToFile
+      89     62          #2603: /opt/rt3/share/doc should not be a file.
+      90     63          Merging utf8 fixes from autrijus tang
+      91     64          Fixing an upgrade bug from 3.0.2->3.0.3
+      92     65          MIME::Words encoding fixes for mail sending
+      93     66          Additional work on the SQLite port
+      95     67          Merge from ourinternet: UTF8 fixes; more configurable apache
+                 sessions;
+      96     68          ACL HasRight system replaced with an algorithm that does more
+                 looking ahead
+      97     69          A fix to Tickets_Overlay.pm to make the 'Count' methods
+                 actually do a count, not a full SELECT
+      98     70          Further UTF8-fixed from autrijus
+      99     71          Bumping the version to 3.0.3pre1
+     100     72          update layout fix
+     101     73          #2662 Fixing an overly restrictive ACL check on group creation
+     102     74          #2657 Web UI Scrip creation bug
+     103     75          #2652 - de.po updates
+     105     76          #2658 Cosmetic issue with Scrip menu listing
+     106     77          fix for FastCGI and SpeedyCGI setgidness with weird
+                 environments
+     107     78          Continued performance improvements for caching
+     108     79          Log path enhancment to deal more gracefully with absolutely
+                 specified logfile paths
+     109     80          CF defaults; fix Starts set
+     110     81          ACL cache made postgres safe
+     111     82          Fixing an acl bug in Principal_Overlay introduced after 3.0.2
+                 and a possible 'Deep' transaction issue. now requires
+                 DBIx::SearchBuilder 0.83_05 or newer
+     112     83          #2678 Fixing crit messages in RT::User
+     113     84          Bumping DBIx::SearchBuilder requirement to 0.84
+     115     85          The "rt" program, branch 3.0.
+     117     86          pass title to Header
+     116     87          Better testing for internationalization of outoging messages;
+                 slight refactoring to SendEmail to be more testable; added
+                 missing deps to EmailParser
+     118     88          Bump to 3.0.3pre2; fix a misspelled right in Queue.pm (#2686)
+     119     89          #2721 - 'id' attribute had mixed casing. this bothers certain
+                 databases (Sybase)
+     120     90          Header & Logout take URL
+     121     91          Fixes for: Bogus message headers containing high-bit
+                 characters; database handle reconnections; postgres test suite
+                 failures
+     123     92          support group & queue acl setting from rt-setup-database
+     125     93          add TakeTicket, StealTicket rights
+     122     94          Bumping version to 3.0.3pre3, bumping searchbuilder dependency
+     126     95          Really bumping the version to 3.0.3pre3
+     129     96          Various fixes from a pull-up of the ourinternet branch
+     128     97          #2605 - SpamAssassin Filter returns the wrong codes on
+                 success/failure
+     127     98          Fixes the cascading style sheet to properly reference message
+                 bodies
+     130     99          Attempting to be smarter about guessing encodings for outgoing
+                 mail
+     131    100          Fixing search navigation links (they were made to disappear)
+     132    101          #2776 - 'new' ACL cache had bad behaviour. rolled back to
+                 older cache and added tests
+     133    102          On postgres, RT didn't previously cope well with multipart
+                 messages including non-plain parts containing non-ascii
+     135    103          Efficiency tweaks for WhoHaveRight
+     136    104          Bumping version to RT 3.0.3pre4
+     137    105          #2813 Duplicate tickets created at the same time could cause a
+                 user creation race condition
+     138    106          Importing minor bugfixes from ourinternet
+     139    107          #2816 new callback to ShowLinks
+     150    108          #2799: Display URIs instead of HREFs in ticket display
+     151    109          #2797 Clean up automatich chmodding on installation
+     152    110          ShowRequestor takes path
+     153    111          SystemInternal group ACLs in setup
+     155    112          Better encoding and error checking for message headers
+     156    113          better handle notification messages containing only text/html
+                 content.
+     157    114          Bumping to 3.0.3pre5
+     158    115          More I18N fixes from ourinternet
+     159    116          Bumping version to RC-1
+     160    117          Another shot at the header encoding fix
+     161    118          Mitya's failing processing of html email
+     162    119          Bumping to 3.0.3rc2
+     163    120          Anonymizing addresses in mitya's submitted testcases
+     165    121          Better handling of malformed email messages
+     166    122          Bumping version to 3.0rc3
+     167    123          #2850 - With some configurations, users could not create new
+                 tickets with 'new' requestors - Bumped to 3.0 RC 4
+     168    124          Scrip data updates weren't propagating to parent Ticket
+                 objects; Bumping to 3.0.3
+     169    125          CustomField rights checking was overly restrictive for users
+                 without queue-specific rights
+     170    126          I18N mail testing was was being cavalier with the state of
+                 acls after its testing.  (clone of 3.0.C167)
+     171    127          Ticket Update.html fix to not doubly load content
+     172    128          Fixing postgres sortorder bug unmased by searchbuilder fix
+     176    129          Applying POD patches from ourinternet (clone of 3.0.C173)
+     177    130          UTF8, Custom Field and text message rendering fixes from
+                 ourinternet
+     178    131          #2843 Date relations were too strict in RT::Tickets searches
+     179    132          #2847: allow URI Resolver to render itself
+     173    133          ShowMessageHeaders; make headers clicky
+     180    134          use RTIR callbacks
+     175    135          Updating rt-setup-database to take acl and schema file names
+                 on the commandline
+     181    136          Refactored Users::WhoHaveRight from Chris Audley at Blackrock
+     182    137          Download link in ShowTransaction
+     185    138          Fix for speedycgi disappearing database connections
+     183    139          #2873: Fix for insufficently agressive loop culling
+     186    140          Fix for nested email message parsing
+     187    141          Split the HasRight ACL query into two parts. It's now two
+                 small and light SQL queries, instead of one big one that
+                 overwhelmed databases
+     188    142          Stylistic cleanups for HasRight optimizations
+     189    143          Relationship transactions are recorded and displayed more
+                 robustly
+     190    144          Bumping the version to 3.0.4pre1
+     191    145          Updated french translation from Blaise Thauvin
+      13    146          Bumping to 3.0.4RC1
+     192    147          Attachment display bug fix from autrijus tang
+     193    148          Bumping the version to 3.0.4RC2
+     198    149          ShowAttachments had a relative path which hurt extensions
+     199    150          README updates to indicate deprecated dependencies
+     200    151          Debugging framework cleanup
+     201    152          Bumping version to 3.0.4
+
+  rt.3.0.D152, C201, jesse, Sat Jul 12 02:41:34 2003, Bumping version to 3.0.4
+      From: Jesse Vincent <jesse@localhost>
+      Date: Fri Jul 11 23:35:03 2003
+
+      none
+
+  rt.3.0.D151, C200, jesse, Sat Jul 12 01:34:41 2003, Debugging framework
+  cleanup
+      From: Jesse Vincent <jesse@localhost>
+      Date: Fri Jul 11 22:31:37 2003
+
+      none
+
+  rt.3.0.D150, C199, jesse, Sat Jul 12 01:17:57 2003, README updates to indicate
+  deprecated dependencies
+      From: Jesse Vincent <jesse@localhost>
+      Date: Fri Jul 11 22:14:37 2003
+
+      none
+
+  rt.3.0.D149, C198, leira, Sat Jul 12 01:17:08 2003, ShowAttachments had a
+  relative path which hurt extensions
+      From: Linda L. Julien <leira@starsong.org>
+      Date: Wed Jul  9 23:33:21 2003
+      Warning: the original change was in the 'being_developed' state
+
+      none
+
+  rt.3.0.D148, C193, jesse, Sat Jul  5 17:34:46 2003, Bumping the version to
+  3.0.4RC2
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Sat Jul  5 17:22:07 2003
+
+      none
+
+  rt.3.0.D147, C192, jesse, Sat Jul  5 17:11:25 2003, Attachment display bug fix
+  from autrijus tang
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Sat Jul  5 17:09:07 2003
+
+      none
+
+  rt.3.0.D146, C13, jesse, Fri Jul  4 14:54:43 2003, Bumping to 3.0.4RC1
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jul  4 14:52:56 2003
+
+      none
+
+  rt.3.0.D145, C191, jesse, Fri Jul  4 14:50:26 2003, Updated french translation
+  from Blaise Thauvin
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jul  4 14:48:56 2003
+
+      none
+
+  rt.3.0.D144, C190, jesse, Thu Jul  3 01:48:45 2003, Bumping the version to
+  3.0.4pre1
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Thu Jul  3 01:47:25 2003
+
+      none
+
+  rt.3.0.D143, C189, jesse, Thu Jul  3 01:44:51 2003, Relationship transactions
+  are recorded and displayed more robustly
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Thu Jul  3 01:44:08 2003
+
+      none
+
+  rt.3.0.D142, C188, jesse, Wed Jul  2 21:01:44 2003, Stylistic cleanups for
+  HasRight optimizations
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Wed Jul  2 20:58:51 2003
+
+      none
+
+  rt.3.0.D141, C187, jesse, Wed Jul  2 02:48:21 2003, Split the HasRight ACL
+  query into two parts. It's now two small and light SQL queries, instead of one
+  big one that overwhelmed databases
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Wed Jul  2 02:45:49 2003
+
+      none
+
+  rt.3.0.D140, C186, jesse, Wed Jul  2 02:19:47 2003, Fix for nested email
+  message parsing
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Wed Jul  2 02:17:38 2003
+
+      none
+
+  rt.3.0.D139, C183, jesse, Tue Jul  1 23:18:28 2003, #2873: Fix for
+  insufficently agressive loop culling
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 30 21:12:50 2003
+
+      none
+
+  rt.3.0.D138, C185, jesse, Tue Jul  1 19:08:47 2003, Fix for speedycgi
+  disappearing database connections
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Tue Jul  1 19:05:19 2003
+
+      none
+
+  rt.3.0.D137, C182, leira, Tue Jul  1 16:10:33 2003, Download link in
+  ShowTransaction
+      From: Linda L. Julien <leira@starsong.org>
+      Date: Mon Jun 30 18:04:52 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D136, C181, jesse, Mon Jun 30 15:25:46 2003, Refactored
+  Users::WhoHaveRight from Chris Audley at Blackrock
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 30 15:23:18 2003
+
+      none
+
+  rt.3.0.D135, C175, jesse, Mon Jun 30 15:24:56 2003, Updating rt-setup-database
+  to take acl and schema file names on the commandline
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 30 13:41:12 2003
+
+      none
+
+  rt.3.0.D134, C180, leira, Mon Jun 30 02:19:05 2003, use RTIR callbacks
+      From: Linda Julien <leira@hawthorn.local.>
+      Date: Mon Jun 30 02:11:25 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D133, C173, leira, Mon Jun 30 02:17:05 2003, ShowMessageHeaders; make
+  headers clicky
+      From: Linda Julien <leira@hawthorn.local.>
+      Date: Sun Jun 29 23:31:39 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D132, C179, jesse, Sun Jun 29 03:06:36 2003, #2847: allow URI Resolver
+  to render itself
+      From: Jesse Vincent <jesse@eris>
+      Date: Sun Jun 29 03:04:30 2003
+
+      none
+
+  rt.3.0.D131, C178, jesse, Sun Jun 29 02:59:13 2003, #2843 Date relations were
+  too strict in RT::Tickets searches
+      From: Jesse Vincent <jesse@eris>
+      Date: Sun Jun 29 02:57:53 2003
+
+      none
+
+  rt.3.0.D130, C177, jesse, Sat Jun 28 18:17:28 2003, UTF8, Custom Field and
+  text message rendering fixes from ourinternet
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat Jun 28 18:15:09 2003
+
+      none
+
+  rt.3.0.D129, C176, jesse, Sat Jun 28 17:23:01 2003, Applying POD patches from
+  ourinternet (clone of 3.0.C173)
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat Jun 28 17:15:38 2003
+
+      none
+
+  rt.3.0.D128, C172, jesse, Sat Jun 28 17:17:53 2003, Fixing postgres sortorder
+  bug unmased by searchbuilder fix
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jun 27 01:12:13 2003
+
+      none
+
+  rt.3.0.D127, C171, jesse, Tue Jun 24 16:42:07 2003, Ticket Update.html fix to
+  not doubly load content
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 24 16:28:49 2003
+
+      none
+
+  rt.3.0.D126, C170, jesse, Tue Jun 24 16:23:49 2003, I18N mail testing was was
+  being cavalier with the state of acls after its testing.  (clone of 3.0.C167)
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 24 16:22:16 2003
+
+      none
+
+  rt.3.0.D125, C169, jesse, Tue Jun 24 16:23:37 2003, CustomField rights
+  checking was overly restrictive for users without queue-specific rights
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 24 16:18:05 2003
+
+      none
+
+  rt.3.0.D124, C168, jesse, Sat Jun 21 13:01:18 2003, Scrip data updates weren't
+  propagating to parent Ticket objects; Bumping to 3.0.3
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat Jun 21 12:55:04 2003
+
+      none
+
+  rt.3.0.D123, C167, jesse, Thu Jun 19 22:23:01 2003, #2850 - With some
+  configurations, users could not create new tickets with 'new' requestors -
+  Bumped to 3.0 RC 4
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 19 22:22:20 2003
+
+      none
+
+  rt.3.0.D122, C166, jesse, Thu Jun 19 14:25:03 2003, Bumping version to 3.0rc3
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 19 14:18:19 2003
+
+      none
+
+  rt.3.0.D121, C165, jesse, Thu Jun 19 12:25:20 2003, Better handling of
+  malformed email messages
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 19 12:21:56 2003
+
+      none
+
+  rt.3.0.D120, C163, jesse, Thu Jun 19 03:17:20 2003, Anonymizing addresses in
+  mitya's submitted testcases
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 19 03:16:47 2003
+
+      none
+
+  rt.3.0.D119, C162, jesse, Thu Jun 19 03:03:16 2003, Bumping to 3.0.3rc2
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 19 03:01:10 2003
+
+      none
+
+  rt.3.0.D118, C161, jesse, Thu Jun 19 02:58:24 2003, Mitya's failing processing
+  of html email
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 19 02:56:48 2003
+
+      none
+
+  rt.3.0.D117, C160, jesse, Wed Jun 18 17:58:34 2003, Another shot at the header
+  encoding fix
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 18 17:58:01 2003
+
+      none
+
+  rt.3.0.D116, C159, jesse, Wed Jun 18 01:27:03 2003, Bumping version to RC-1
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 18 01:25:13 2003
+
+      none
+
+  rt.3.0.D115, C158, jesse, Wed Jun 18 01:01:22 2003, More I18N fixes from
+  ourinternet
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 18 01:00:11 2003
+
+      none
+
+  rt.3.0.D114, C157, jesse, Tue Jun 17 22:24:03 2003, Bumping to 3.0.3pre5
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 17 22:20:51 2003
+
+      none
+
+  rt.3.0.D113, C156, jesse, Tue Jun 17 22:14:35 2003, better handle notification
+  messages containing only text/html content.
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 17 21:55:06 2003
+
+      none
+
+  rt.3.0.D112, C155, jesse, Tue Jun 17 21:55:16 2003, Better encoding and error
+  checking for message headers
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 17 21:26:27 2003
+      Warning: the original change was in the 'being_developed' state
+
+      none
+
+  rt.3.0.D111, C153, leira, Tue Jun 17 17:47:18 2003, SystemInternal group ACLs
+  in setup
+      From: Linda L. Julien <leira@starsong.org>
+      Date: Tue Jun 17 18:19:58 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D110, C152, leira, Tue Jun 17 16:46:34 2003, ShowRequestor takes path
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Tue Jun 17 12:53:35 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D109, C151, jesse, Mon Jun 16 23:48:53 2003, #2797 Clean up automatich
+  chmodding on installation
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 16 23:48:19 2003
+
+      none
+
+  rt.3.0.D108, C150, jesse, Mon Jun 16 23:36:29 2003, #2799: Display URIs
+  instead of HREFs in ticket display
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 16 23:35:00 2003
+
+      none
+
+  rt.3.0.D107, C139, jesse, Mon Jun 16 23:16:45 2003, #2816 new callback to
+  ShowLinks
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 16 23:14:05 2003
+
+      none
+
+  rt.3.0.D106, C138, jesse, Mon Jun 16 23:16:29 2003, Importing minor bugfixes
+  from ourinternet
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 16 23:06:00 2003
+
+      none
+
+  rt.3.0.D105, C137, jesse, Mon Jun 16 19:41:13 2003, #2813 Duplicate tickets
+  created at the same time could cause a user creation race condition
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun 16 19:39:57 2003
+
+      none
+
+  rt.3.0.D104, C136, jesse, Fri Jun 13 18:27:11 2003, Bumping version to RT
+  3.0.3pre4
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jun 13 18:25:57 2003
+
+      none
+
+  rt.3.0.D103, C135, jesse, Fri Jun 13 18:22:33 2003, Efficiency tweaks for
+  WhoHaveRight
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jun 13 18:19:02 2003
+
+      none
+
+  rt.3.0.D102, C133, jesse, Fri Jun 13 18:18:32 2003, On postgres, RT didn't
+  previously cope well with multipart messages including non-plain parts
+  containing non-ascii
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jun 13 18:17:37 2003
+
+      none
+
+  rt.3.0.D101, C132, jesse, Fri Jun 13 01:41:24 2003, #2776 - 'new' ACL cache
+  had bad behaviour. rolled back to older cache and added tests
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jun 13 01:40:26 2003
+
+      none
+
+  rt.3.0.D100, C131, jesse, Thu Jun 12 13:22:10 2003, Fixing search navigation
+  links (they were made to disappear)
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Jun 12 13:19:37 2003
+
+      none
+
+  rt.3.0.D099, C130, jesse, Wed Jun 11 16:44:16 2003, Attempting to be smarter
+  about guessing encodings for outgoing mail
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 11 16:42:50 2003
+      Warning: the original change was in the 'being_developed' state
+
+      none
+
+  rt.3.0.D098, C127, jesse, Wed Jun 11 16:39:39 2003, Fixes the cascading style
+  sheet to properly reference message bodies
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 11 15:43:39 2003
+      Warning: the original change was in the 'being_developed' state
+
+  rt.3.0.D097, C128, jesse, Wed Jun 11 16:37:38 2003, #2605 - SpamAssassin
+  Filter returns the wrong codes on success/failure
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 11 15:53:58 2003
+
+      none
+
+  rt.3.0.D096, C129, jesse, Wed Jun 11 16:36:53 2003, Various fixes from a pull-
+  up of the ourinternet branch
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun 11 16:17:44 2003
+
+      none
+
+  rt.3.0.D095, C126, jesse, Tue Jun 10 16:17:50 2003, Really bumping the version
+  to 3.0.3pre3
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 10 16:17:08 2003
+
+      none
+
+  rt.3.0.D094, C122, jesse, Tue Jun 10 15:58:32 2003, Bumping version to
+  3.0.3pre3, bumping searchbuilder dependency
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 10 15:56:41 2003
+
+      none
+
+  rt.3.0.D093, C125, jesse, Tue Jun 10 15:54:52 2003, add TakeTicket,
+  StealTicket rights
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun 10 15:41:43 2003
+      Warning: the original change was in the 'being_developed' state
+
+      From: Jesse <jesse@fsck.com>
+      Date: Tue Jun 10 11:01:04 2003
+      Warning: the original change was in the 'being_reviewed' state
+
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Tue Jun 10 11:58:03 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D092, C123, leira, Tue Jun 10 15:54:10 2003, support group & queue acl
+  setting from rt-setup-database
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Tue Jun 10 14:13:46 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D091, C121, jesse, Sun Jun  8 00:41:47 2003, Fixes for: Bogus message
+  headers containing high-bit characters; database handle reconnections;
+  postgres test suite failures
+      From: Jesse Vincent <jesse@eris>
+      Date: Sun Jun  8 00:32:40 2003
+
+      none
+
+  rt.3.0.D090, C120, leira, Sun Jun  8 00:34:40 2003, Header & Logout take URL
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Fri Jun  6 19:06:41 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D089, C119, jesse, Fri Jun  6 17:33:37 2003, #2721 - 'id' attribute had
+  mixed casing. this bothers certain databases (Sybase)
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Jun  6 17:32:16 2003
+
+      none
+
+  rt.3.0.D088, C118, jesse, Wed Jun  4 17:21:24 2003, Bump to 3.0.3pre2; fix a
+  misspelled right in Queue.pm (#2686)
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun  4 17:19:39 2003
+      Warning: the original change was in the 'being_developed' state
+
+      The "rt" program, branch 3.0.
+
+  rt.3.0.D087, C116, jesse, Wed Jun  4 17:17:08 2003, Better testing for
+  internationalization of outoging messages; slight refactoring to SendEmail to
+  be more testable; added missing deps to EmailParser
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Jun  4 16:53:07 2003
+
+      none
+
+  rt.3.0.D086, C117, leira, Wed Jun  4 00:23:20 2003, pass title to Header
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Tue Jun  3 18:09:39 2003
+      Warning: the original change was in the 'being_developed' state
+
+      none
+
+  rt.3.0.D085, C115, jesse, Tue Jun  3 00:45:12 2003, The "rt" program, branch
+  3.0.
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun  3 00:43:15 2003
+      Warning: the original change was in the 'being_developed' state
+
+      The "rt" program, branch 3.0.
+
+  rt.3.0.D084, C113, jesse, Tue Jun  3 00:20:07 2003, Bumping
+  DBIx::SearchBuilder requirement to 0.84
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun  3 00:19:50 2003
+
+      none
+
+  rt.3.0.D083, C112, jesse, Tue Jun  3 00:18:43 2003, #2678 Fixing crit messages
+  in RT::User
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun  3 00:18:12 2003
+
+      none
+
+  rt.3.0.D082, C111, jesse, Tue Jun  3 00:04:45 2003, Fixing an acl bug in
+  Principal_Overlay introduced after 3.0.2 and a possible 'Deep' transaction
+  issue. now requires DBIx::SearchBuilder 0.83_05 or newer
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Jun  3 00:02:23 2003
+
+      none
+
+  rt.3.0.D081, C110, jesse, Mon Jun  2 22:40:34 2003, ACL cache made postgres
+  safe
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Jun  2 22:39:03 2003
+
+      none
+
+  rt.3.0.D080, C109, leira, Mon Jun  2 17:10:05 2003, CF defaults; fix Starts
+  set
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Mon Jun  2 17:32:11 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D079, C108, jesse, Sat May 31 00:28:37 2003, Log path enhancment to
+  deal more gracefully with absolutely specified logfile paths
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat May 31 00:27:38 2003
+
+      none
+
+  rt.3.0.D078, C107, jesse, Sat May 31 00:20:53 2003, Continued performance
+  improvements for caching
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat May 31 00:19:32 2003
+
+      none
+
+  rt.3.0.D077, C106, jesse, Sat May 31 00:20:32 2003, fix for FastCGI and
+  SpeedyCGI setgidness with weird environments
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat May 31 00:19:15 2003
+
+      none
+
+  rt.3.0.D076, C105, jesse, Fri May 30 16:21:14 2003, #2658 Cosmetic issue with
+  Scrip menu listing
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 30 16:14:02 2003
+
+      none
+
+  rt.3.0.D075, C103, jesse, Fri May 30 16:20:57 2003, #2652 - de.po updates
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 30 15:57:44 2003
+
+      none
+
+  rt.3.0.D074, C102, jesse, Fri May 30 16:18:57 2003, #2657 Web UI Scrip
+  creation bug
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 30 15:50:16 2003
+
+      none
+
+  rt.3.0.D073, C101, jesse, Fri May 30 16:17:43 2003, #2662 Fixing an overly
+  restrictive ACL check on group creation
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 30 15:46:22 2003
+
+      none
+
+  rt.3.0.D072, C100, leira, Fri May 30 16:17:05 2003, update layout fix
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Thu May 29 14:30:01 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D071, C99, jesse, Wed May 28 17:54:48 2003, Bumping the version to
+  3.0.3pre1
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May 28 17:52:51 2003
+
+      none
+
+  rt.3.0.D070, C98, jesse, Wed May 28 17:54:40 2003, Further UTF8-fixed from
+  autrijus
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May 28 17:49:32 2003
+
+      none
+
+  rt.3.0.D069, C97, jesse, Wed May 28 17:07:10 2003, A fix to Tickets_Overlay.pm
+  to make the 'Count' methods actually do a count, not a full SELECT
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May 28 17:04:50 2003
+
+      none
+
+  rt.3.0.D068, C96, jesse, Wed May 28 17:06:43 2003, ACL HasRight system
+  replaced with an algorithm that does more looking ahead
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May 28 16:36:10 2003
+
+      none
+
+  rt.3.0.D067, C95, jesse, Tue May 27 13:22:19 2003, Merge from ourinternet:
+  UTF8 fixes; more configurable apache sessions;
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Tue May 27 13:07:41 2003
+
+      none
+
+  rt.3.0.D066, C93, jesse, Sat May 24 18:05:36 2003, Additional work on the
+  SQLite port
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat May 24 18:04:50 2003
+
+      none
+
+  rt.3.0.D065, C92, jesse, Fri May 23 16:45:23 2003, MIME::Words encoding fixes
+  for mail sending
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 23 16:44:28 2003
+
+      none
+
+  rt.3.0.D064, C91, jesse, Fri May 23 16:12:26 2003, Fixing an upgrade bug from
+  3.0.2->3.0.3
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 23 15:57:50 2003
+
+      none
+
+  rt.3.0.D063, C90, jesse, Fri May 23 15:27:47 2003, Merging utf8 fixes from
+  autrijus tang
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May 23 15:25:23 2003
+
+      none
+
+  rt.3.0.D062, C89, jesse, Wed May 21 00:58:34 2003, #2603: /opt/rt3/share/doc
+  should not be a file.
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Wed May 21 00:29:55 2003
+
+      none
+
+  rt.3.0.D061, C88, jesse, Wed May 21 00:57:45 2003, Fix to honor '$LogDir' for
+  LogToFile
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Wed May 21 00:17:18 2003
+
+      none
+
+  rt.3.0.D060, C14, jesse, Wed May 21 00:56:31 2003, #2539: Re: [rt-users]
+  unexpected usage: change sort order with column headers in search window
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Tue May 20 23:19:46 2003
+
+      none
+
+  rt.3.0.D059, C87, jesse, Wed May 21 00:55:08 2003, Including norwegian bokmal
+  translation
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Tue May 20 23:05:17 2003
+
+      none
+
+  rt.3.0.D058, C86, jesse, Wed May 21 00:54:06 2003, Fix for #2602 - make test
+  fails on _Config.pm
+      From: Jesse Vincent <jesse@Jesse-Vincents-Computer.local.>
+      Date: Tue May 20 22:32:52 2003
+
+      none
+
+  rt.3.0.D057, C85, leira, Tue May 20 12:15:11 2003, Robert's updated search
+  stuff
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Mon May 19 18:19:14 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D056, C83, jesse, Sat May 17 17:34:32 2003, merge from ourinternet; one
+  CreateTickets fix and some utf8 updates
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat May 17 17:31:43 2003
+
+      none
+
+  rt.3.0.D055, C82, jesse, Mon May 12 20:30:45 2003, Bumping the version to RT
+  3.0.2
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue May 13 02:29:44 2003
+
+      none
+
+  rt.3.0.D054, C81, jesse, Wed May  7 09:18:28 2003, Bumping the version to
+  3.0.2pre6
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May  7 15:16:55 2003
+      Warning: the original change was in the 'being_developed' state
+
+      none
+
+  rt.3.0.D053, C80, jesse, Wed May  7 09:02:24 2003, Importing utf8 fixes, _
+  Vendor overlay support from ourinternet
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May  7 14:52:58 2003
+
+      none
+
+  rt.3.0.D052, C79, jesse, Wed May  7 07:05:14 2003, Cleaning up RT tag
+  processing
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May  7 13:04:17 2003
+
+      none
+
+  rt.3.0.D051, C78, jesse, Wed May  7 07:03:27 2003, More performance work on
+  WhoHaveRight; removing an extra join
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed May  7 13:00:43 2003
+
+      none
+
+  rt.3.0.D050, C77, jesse, Fri May  2 11:23:23 2003, Fixing bogus anchor tags
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May  2 17:19:54 2003
+
+      none
+
+  rt.3.0.D049, C76, jesse, Fri May  2 10:26:30 2003, [#2437]
+  CanonicalizeEmailAddress fixes; [# 2449] html fixes for right editing; [#
+  2457] email addresses weren't always being canonicalized
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May  2 16:24:40 2003
+
+      none
+
+  rt.3.0.D048, C75, jesse, Fri May  2 08:35:38 2003, bumped version to
+  3.0.2pre5; attachments performance fixes; utf-8 mailgateway fixes; more
+  extension hooks; template updates for approvals
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri May  2 14:32:57 2003
+
+      none
+
+  rt.3.0.D047, C73, jesse, Sun Apr 27 19:06:46 2003, I18N patches from autrijus;
+  bouncing to 3.0.2pre4
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Apr 28 01:02:18 2003
+
+      none
+
+  rt.3.0.D046, C72, leira, Sun Apr 27 19:06:04 2003, bulk links
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Thu Apr 24 01:23:01 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D045, C71, jesse, Sat Apr 19 03:42:39 2003, Another go at fixing the
+  ARRAY()  issue; bumping to 3.0.2pre3
+      From: Jesse Vincent <jesse@eris>
+      Date: Sat Apr 19 08:39:19 2003
+
+      none
+
+  rt.3.0.D044, C70, jesse, Fri Apr 18 16:37:00 2003, fixing utf8 tainting issue
+  in autohandler; bumped to 3.0.2pre2
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Apr 18 21:32:04 2003
+
+      none
+
+  rt.3.0.D043, C69, leira, Thu Apr 17 18:51:41 2003, make ids clicky
+      From: Linda L. Julien <leira@oak.starsong.org>
+      Date: Thu Apr 17 18:31:40 2003
+      Warning: the original change was in the 'awaiting_integration' state
+
+      none
+
+  rt.3.0.D042, C68, jesse, Thu Apr 17 18:39:54 2003, Bumping to 3.0.2pre1
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr 17 23:37:59 2003
+
+      none
+
+  rt.3.0.D041, C67, jesse, Thu Apr 17 18:33:15 2003, updating autrijus'
+  autohandler patch. seems to break lots of stuff
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr 17 23:21:02 2003
+
+      none
+
+  rt.3.0.D040, C66, jesse, Thu Apr 17 18:32:24 2003, Quicksearch bug fix from
+  Stan
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr 17 23:16:58 2003
+
+      none
+
+  rt.3.0.D039, C65, jesse, Thu Apr 17 18:29:31 2003, Fixing an untainting bug in
+  3.0.1
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr 17 23:15:01 2003
+      Warning: the original change was in the 'being_developed' state
+
+      none
+
+  rt.3.0.D038, C63, jesse, Thu Apr 17 04:46:42 2003, Fixing a showmessagestanza
+  bug found in RTIR
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr 17 09:45:48 2003
+
+      none
+
+  rt.3.0.D037, C62, jesse, Tue Apr 15 11:53:58 2003, Bumping to version 3.0.1
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Apr 15 11:52:00 2003
+
+      none
+
+  rt.3.0.D036, C61, jesse, Mon Apr 14 18:18:03 2003, New speedycgi support from
+  vivek khera
+      From: Jesse Vincent <jesse@eris>
+      Date: Mon Apr 14 14:49:49 2003
+
+      none
+
+  rt.3.0.D035, C60, jesse, Sun Apr 13 21:43:32 2003, SMTP and I18N fixes from
+  autrijus tang. Updated chinese translations
+      From: Jesse Vincent <jesse@eris>
+      Date: Sun Apr 13 21:32:55 2003
+
+      none
+
+  rt.3.0.D034, C59, jesse, Fri Apr 11 21:58:36 2003, Bumping to RT 3.0.1pre2
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Apr 11 21:58:06 2003
+
+      none
+
+  rt.3.0.D033, C58, jesse, Fri Apr 11 21:56:11 2003, Better binary attachment
+  handling fix from autrijus
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Apr 11 21:52:12 2003
+
+      none
+
+  rt.3.0.D032, C57, jesse, Fri Apr 11 21:35:17 2003, Testing and fixing binary
+  attachment corruption
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Apr 11 21:34:28 2003
+
+      none
+
+  rt.3.0.D031, C56, jesse, Fri Apr 11 21:34:56 2003, Testing fixes for mail
+  authentication/authorization
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr 10 00:08:29 2003
+
+      none
+
+  rt.3.0.D030, C55, jesse, Wed Apr  9 13:55:18 2003, #2365 Removing outdated
+  Mason setup parameter
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Apr  9 13:54:43 2003
+
+      none
+
+  rt.3.0.D029, C53, jesse, Wed Apr  9 13:22:35 2003, Added preliminary left to
+  right hebrew translation
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Apr  9 13:18:16 2003
+
+      none
+
+  rt.3.0.D028, C52, jesse, Fri Apr  4 02:10:01 2003, More I18N testing for
+  rafael
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Apr  4 02:08:49 2003
+
+      none
+
+  rt.3.0.D027, C51, jesse, Thu Apr  3 19:33:34 2003, Changing address used in
+  example to not send mail to author
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr  3 19:29:02 2003
+      Warning: the original change was in the 'being_integrated' state
+
+      none
+
+  rt.3.0.D026, C50, jesse, Thu Apr  3 19:16:37 2003, Integrating rafael's
+  failing test suite and proposed fix from autrijus
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr  3 19:15:03 2003
+
+      none
+
+  rt.3.0.D025, C39, jesse, Thu Apr  3 19:16:15 2003, Many users should be able
+  to have a blank address; neew test suite to ensure this
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Apr  3 13:27:36 2003
+
+      none
+
+  rt.3.0.D024, C38, jesse, Thu Apr  3 13:30:37 2003, Updates for RT RPC
+  interface from AMS
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Apr  2 15:32:15 2003
+
+      none
+
+  rt.3.0.D023, C36, jesse, Wed Apr  2 14:14:07 2003, Updated Spanish translation
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Apr  1 14:02:36 2003
+
+      none
+
+  rt.3.0.D022, C37, jesse, Wed Apr  2 14:13:55 2003, Updated dependencies
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Apr  2 14:09:41 2003
+
+      none
+
+  rt.3.0.D021, C35, jesse, Tue Apr  1 13:00:22 2003, New czech translation
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Apr  1 12:58:57 2003
+
+      none
+
+  rt.3.0.D020, C33, jesse, Fri Mar 28 14:48:20 2003, A tiny bit of extra data
+  passing for some callbacks
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Mar 28 14:43:28 2003
+
+      none
+
+  rt.3.0.D019, C32, jesse, Fri Mar 28 14:35:10 2003, Added better error checking
+  for failed ticket creation
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Mar 28 14:32:52 2003
+
+      none
+
+  rt.3.0.D018, C31, jesse, Sun Mar 23 17:21:45 2003, Minor fixes - Bumped to
+  3.0.0;
+  2266 - postgres scrip creation bug
+  2267 - Tickets not reopened after being stalled
+  2265 - Fixed css nits from blaise
+  Unreported - Fixed quick-search bug
+      From: Jesse Vincent <jesse@eris>
+      Date: Sun Mar 23 17:17:55 2003
+
+      none
+
+  rt.3.0.D017, C30, jesse, Thu Mar 20 21:38:30 2003, Bumping to 3.0.0rc4
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Mar 20 21:28:01 2003
+
+      none
+
+  rt.3.0.D016, C29, jesse, Thu Mar 20 21:18:27 2003, RT should now be less
+  overzealous about opening and then marking a ticket 'new' again
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Mar 20 21:14:47 2003
+
+      none
+
+  rt.3.0.D015, C28, jesse, Thu Mar 20 15:21:49 2003, Further postgres tweaks and
+  fixes
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Mar 20 15:20:21 2003
+
+      none
+
+  rt.3.0.D014, C27, jesse, Thu Mar 20 01:48:42 2003, Postgres schema tweak
+      From: Jesse Vincent <jesse@eris>
+      Date: Thu Mar 20 01:47:20 2003
+
+      none
+
+  rt.3.0.D013, C26, jesse, Wed Mar 19 21:26:47 2003, Postgres fixes
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Mar 19 21:26:24 2003
+
+      none
+
+  rt.3.0.D012, C25, jesse, Wed Mar 19 16:27:29 2003, Brazilian Portuguese
+  translation
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Mar 19 16:25:48 2003
+
+      none
+
+  rt.3.0.D011, C23, jesse, Wed Mar 19 13:03:15 2003, New french translation
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Mar 19 13:02:47 2003
+
+      none
+
+  rt.3.0.D010, C22, jesse, Wed Mar 19 01:01:24 2003, Bumping to RC3; fixing the
+  display of 'This user's n highest priority tix'
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Mar 19 01:00:33 2003
+
+      none
+
+  rt.3.0.D009, C20, jesse, Wed Mar 19 00:46:17 2003, finishing the notify stuff
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Mar 19 00:45:09 2003
+
+      none
+
+  rt.3.0.D008, C19, jesse, Wed Mar 19 00:40:45 2003, Caving in to the masses and
+  making 'notify sender' configurable
+      From: Jesse Vincent <jesse@eris>
+      Date: Wed Mar 19 00:38:50 2003
+
+      none
+
+  rt.3.0.D007, C18, jesse, Tue Mar 18 16:29:45 2003, More performance work;
+  backing out 'enhancements' that killed system performance
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Mar 18 16:26:07 2003
+
+      none
+
+  rt.3.0.D006, C17, jesse, Tue Mar 18 11:29:28 2003, fixing fastcgi's ability to
+  load webmux.pl on some platforms
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Mar 18 11:28:11 2003
+
+      none
+
+  rt.3.0.D005, C12, jesse, Tue Mar 18 00:58:52 2003, fixing indices for postgres
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Mar 18 00:53:06 2003
+
+      none
+
+  rt.3.0.D004, C16, jesse, Tue Mar 18 00:41:26 2003, Performance work on
+  'WhoHaveRight'; bumping to 3.0.0rc2
+      From: Jesse Vincent <jesse@eris>
+      Date: Tue Mar 18 00:37:30 2003
+
+      none
+
+  rt.3.0.D003, C15, jesse, Fri Mar 14 17:07:28 2003, removing the old REST API
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Mar 14 16:50:38 2003
+
+      none
+
+  rt.3.0.D002, C11, jesse, Fri Mar 14 16:42:46 2003, Minor CSS update. rollback
+  fix; new database indices; copyright update
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Mar 14 16:35:01 2003
+
+      none
+
+  rt.3.0.D001, C10, jesse, Fri Mar 14 01:26:22 2003, Bumping the version to
+  rt.3.0.0rc0
+      From: Jesse Vincent <jesse@eris>
+      Date: Fri Mar 14 01:25:51 2003
+
+      none
diff --git a/rt/HOWTO/README b/rt/HOWTO/README
new file mode 100644 (file)
index 0000000..942096b
--- /dev/null
@@ -0,0 +1,14 @@
+Here you'll find plain text documentation of how to handle various
+project procedures.  Files contained herein:
+
+change.txt
+        How changes are integrated, including generating and
+        distributing aedist change sets, and updating the CVS repository.
+
+release.txt
+       Steps to go through when releasing a new version of RT.
+
+
+These procedures are based on documentation from the scons project
+as http://www.scons.org/
+
diff --git a/rt/HOWTO/change.txt b/rt/HOWTO/change.txt
new file mode 100644 (file)
index 0000000..de31645
--- /dev/null
@@ -0,0 +1,67 @@
+Handling a change set:
+
+    -- Start the change:
+
+               aedist -r       [if it's a remote submission]
+                
+                -or-
+
+               aedb {cnum}     [if it's initiated locally]
+
+    -- Normal development cycle:
+
+                aecd -c {cnum}                   
+                aecp .          # Copy the baseline to your working dir
+                # work on your change
+                aenf {new file names}
+
+                aecpu -unch   # Remove unchanged files, for faster diffs
+               aeb # Currently does nothing
+               aet # Currently does nothing
+               aed # Diff your change
+               aede # End the change
+
+    -- As the reviewer:
+               aerpass {cnum}
+
+    -- As the integrator:
+
+               aeib {cnum}
+               aeb
+               aet
+               aed
+                cd ~ # Get out of the current working directory
+               aeipass
+
+
+
+
+    -- Update the aedist baseline on the web site:
+
+               aedist -s -bl -p rt.2.1 > rt.2.1.ae
+               scp rt.2.1.ae jesse@fsck.com:/home/ftp/pub/rt/devel/rt.2.1.ae
+               rm rt.2.1.ae
+
+       [This will eventually be automated.]
+
+    -- Distribute the change to CVS:
+
+        WARNING. DOES NOT YET WORK
+
+               export CVS_RSH=ssh
+               ae2cvs -n -aegis -p rt.2.1 -c {cnum} -u ~/SCons/scons
+               ae2cvs -X -aegis -p rt.2.1 -c {cnum} -u ~/SCons/scons
+
+        If you need the "ae2cvs" Perl script, you can find a copy
+        checked in to the bin/subdirectory.
+
+       [This may eventually be automated.]
+
+
+
+       -- Grabbing the latest dev sources over ssh 
+
+       ssh fsck.com "aedist -s -p rt.2.1 -naa -bl -entire-source" | aedist -r
+
+
diff --git a/rt/HOWTO/release.txt b/rt/HOWTO/release.txt
new file mode 100644 (file)
index 0000000..285041c
--- /dev/null
@@ -0,0 +1,124 @@
+Things to do to release a new version of rt:
+
+       Build and test candidate packages
+
+       Read through the README and src/README.txt files for any updates
+
+       Prepare ChangeLog
+
+               date -R the latest release
+
+               should be current if this has been updated as each
+               change went in.
+
+                [ Should be automated ]
+
+
+        TODO: nothing below this line is accurate for RT
+
+       END THE BRANCH
+
+               ae_p rt.2
+               aede {5}
+               aerpass {5}
+               aeib {5}
+               aeb
+               aet
+               aet -reg
+               aed
+               aeipass
+
+       START THE NEW BRANCH
+
+               aenbr -p rt.2 {6}
+               aenc -p rt.2.{6}
+
+                        Call it something like, "Initialize the new
+                        branch."  Cause = internal_enhancement.  Exempt
+                        it from all tests (*_exempt = true).
+
+               ae_p rt.2.{6}
+
+               aedb 100
+
+               aecd
+
+               # Change the hard-coded package version numbers
+               # in the following files.
+               aecp rttruct debian/changelog rpm/rt.spec
+
+               vi rttruct debian/changelog rpm/rt.spec
+
+               # Optionally, do the same in the following:
+               [optional] aecp HOWTO/change.txt
+               [optional] aecp HOWTO/release.txt
+               [optional] aecp debian/rt.postinst
+
+               [optional] vi HOWTO/change.txt
+               [optional] vi HOWTO/release.txt
+               [optional] vi debian/rt.postinst
+
+               aeb
+
+               aet -reg
+
+               aed
+
+               aede
+
+               etc.
+
+
+       Read through the FAQ for any updates
+
+       Test downloading from the web site download page
+
+
+       In the Bugs Tracker, add a Group for the new release (0.05)
+
+       Announce to the following mailing lists (template below):
+
+               rt-announce@lists.fsck.com
+
+
+       Notify www.cmtoday.com/contribute.html
+
+                [This guy wants an announcement no more frequently than
+                once a month, so save it for a future release if it's
+                been too soon since the previous one.]
+
+       Notify freshmeat.net
+
+                [Wait until the morning so the announcement hits the
+                main freshmeat.net page while people in the U.S. are
+                awake and working]
+
+
+
+
+=======================
+
+Template release announcement:
+
+
+
+Version 2.1.XXX of rt has been released and is available for download
+from the rt web site:
+
+        http://bestpractical.com/rt/
+
+
+
+WHAT'S NEW IN THIS RELEASE?
+
+Version 2.1.XXX of rt contains the following important changes:
+
+  - XXX
+
+For a complete list of changes in version 2.1.XXX, see the CHANGES.txt
+file in the release itself.
+
+
+WHAT IS RT? 
+
+        FILL THIS IN
diff --git a/rt/HOWTO/version-control.txt b/rt/HOWTO/version-control.txt
new file mode 100644 (file)
index 0000000..06babfd
--- /dev/null
@@ -0,0 +1,41 @@
+Using Aegis for RT development
+
+   1. The main line of RT development will be under the control
+      of the Aegis change management system, as administered by
+       Best Practical Solutions, LLC
+
+   2. We will use aedist to generate change sets for each change
+      checked in to the main Aegis repository. These change sets will be
+      either distributed by a mailing list or made available via the web,
+      or both.
+
+   3. Remote developers using Aegis will send aedist output for
+      their changes to rt-patches@bestpractical.com for review and
+      integration.
+
+   4. The aedist output should be sent to rt-patches@bestpractical.com
+      after the change has completed its local aede, but before aerpass.
+
+   5. If the change is rejected, the developer can aedeu to reopen
+      the change and fix whatever problems caused the review to not pass.
+
+   6. A baseline snapshot (aedist -bl) of the main Aegis repository
+      will be generated at least daily and made available via http
+      to provide a central location for synchronizing remote Aegis
+      repositories.
+
+   7. Changes to the main Aegis repository will also be propagated
+      automatically to the tracking CVS repository.
+
+Using CVS for RT development
+
+   1. CVS is accessed via anonymous cvs with the following CVSROOT:
+
+      :pserver:anoncvs@cvs.fsck.com:/raid/cvsroot/rt-2-1
+
+   2. Remote developers using CVS will send patches (cvs -diff
+      output) to rt-patches@bestpractical.com  for integration into the
+      main Aegis repository. This allows anonymous CVS access to be used
+      for RT development by developers who are unable to use Aegis.
+
+
diff --git a/rt/Makefile.in b/rt/Makefile.in
new file mode 100644 (file)
index 0000000..245ec5e
--- /dev/null
@@ -0,0 +1,485 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2002 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+
+#
+# DO NOT HAND-EDIT the file named 'Makefile'. This file is autogenerated.
+# Have a look at "configure" and "Makefile.in" instead
+#
+
+
+PERL                   =       @PERL@
+
+CONFIG_FILE_PATH       =       @CONFIG_FILE_PATH@
+CONFIG_FILE            =       $(CONFIG_FILE_PATH)/RT_Config.pm
+SITE_CONFIG_FILE               =       $(CONFIG_FILE_PATH)/RT_SiteConfig.pm
+
+
+RT_VERSION_MAJOR       =       @RT_VERSION_MAJOR@
+RT_VERSION_MINOR       =       @RT_VERSION_MINOR@
+RT_VERSION_PATCH       =       @RT_VERSION_PATCH@
+
+RT_VERSION =   $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH)
+TAG       =    rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH)
+
+
+# This is the group that all of the installed files will be chgrp'ed to.
+RTGROUP                        =       @RTGROUP@
+
+
+# User which should own rt binaries.
+BIN_OWNER              =       @BIN_OWNER@
+
+# User that should own all of RT's libraries, generally root.
+LIBS_OWNER             =       @LIBS_OWNER@
+
+# Group that should own all of RT's libraries, generally root.
+LIBS_GROUP             =       @LIBS_GROUP@
+
+WEB_USER               =       @WEB_USER@
+WEB_GROUP              =       @WEB_GROUP@
+
+# {{{ Files and directories 
+
+# DESTDIR allows you to specify that RT be installed somewhere other than
+# where it will eventually reside
+
+DESTDIR                        =       
+
+
+RT_PATH                        =       @RT_PATH@
+RT_ETC_PATH            =       @RT_ETC_PATH@
+RT_BIN_PATH            =       @RT_BIN_PATH@
+RT_SBIN_PATH           =       @RT_SBIN_PATH@
+RT_LIB_PATH            =       @RT_LIB_PATH@
+RT_MAN_PATH            =       @RT_MAN_PATH@
+RT_VAR_PATH            =       @RT_VAR_PATH@
+RT_DOC_PATH            =       @RT_DOC_PATH@
+RT_LOCAL_PATH          =       @RT_LOCAL_PATH@
+LOCAL_ETC_PATH         =       @LOCAL_ETC_PATH@
+LOCAL_LEXICON_PATH     =       @LOCAL_LEXICON_PATH@
+MASON_HTML_PATH                =       @MASON_HTML_PATH@
+MASON_LOCAL_HTML_PATH  =       @MASON_LOCAL_HTML_PATH@
+MASON_DATA_PATH                =       @MASON_DATA_PATH@
+MASON_SESSION_PATH     =       @MASON_SESSION_PATH@
+RT_LOG_PATH        =       @RT_LOG_PATH@
+
+# RT_READABLE_DIR_MODE is the mode of directories that are generally meant
+# to be accessable
+RT_READABLE_DIR_MODE   =       0755
+
+
+
+
+# {{{ all these define the places that RT's binaries should get installed
+
+# RT_MODPERL_HANDLER is the mason handler script for mod_perl
+RT_MODPERL_HANDLER     =       $(RT_BIN_PATH)/webmux.pl
+# RT_FASTCGI_HANDLER is the mason handler script for FastCGI
+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 mail gateway
+RT_MAILGATE_BIN                =       $(RT_BIN_PATH)/rt-mailgate
+# RT's cron tool
+RT_CRON_BIN            =       $(RT_BIN_PATH)/rt-crontool
+
+# }}}
+
+SETGID_BINARIES                =       $(DESTDIR)/$(RT_FASTCGI_HANDLER) \
+                               $(DESTDIR)/$(RT_WIN32_FASTCGI_HANDLER)
+
+BINARIES               =       $(DESTDIR)/$(RT_MODPERL_HANDLER) \
+                               $(DESTDIR)/$(RT_MAILGATE_BIN) \
+                               $(DESTDIR)/$(RT_CRON_BIN) \
+                               $(SETGID_BINARIES)
+SYSTEM_BINARIES                =       $(DESTDIR)/$(RT_SBIN_PATH)/
+
+
+# }}}
+
+# {{{ Database setup
+
+#
+# DB_TYPE defines what sort of database RT trys to talk to
+# "mysql" is known to work.
+# "Pg" is known to work
+
+DB_TYPE                        =       @DB_TYPE@
+
+# Set DBA to the name of a unix account with the proper permissions and 
+# environment to run your commandline SQL sbin
+
+# Set DB_DBA to the name of a DB user with permission to create new databases 
+
+# For mysql, you probably want 'root'
+# For Pg, you probably want 'postgres' 
+# For oracle, you want 'system'
+
+DB_DBA                 =       @DB_DBA@
+
+DB_HOST                        =       @DB_HOST@
+
+# If you're not running your database server on its default port, 
+# specifiy the port the database server is running on below.
+# It's generally safe to leave this blank 
+
+DB_PORT                        =       @DB_PORT@
+
+
+
+
+#
+# Set this to the canonical name of the interface RT will be talking to the 
+# database on.  If you said that the RT_DB_HOST above was "localhost," this 
+# should be too. This value will be used to grant rt access to the database.
+# If you want to access the RT database from multiple hosts, you'll need
+# to grant those database rights by hand.
+#
+
+DB_RT_HOST             =       @DB_RT_HOST@
+
+# set this to the name you want to give to the RT database in 
+# your database server. For Oracle, this should be the name of your sid
+
+DB_DATABASE            =       @DB_DATABASE@
+DB_RT_USER             =       @DB_RT_USER@
+DB_RT_PASS             =       @DB_RT_PASS@
+
+# }}}
+
+
+####################################################################
+
+all: default
+
+default:
+       @echo "Please read RT's readme before installing. Not doing so could"
+       @echo "be dangerous."
+
+
+
+instruct:
+       @echo "Congratulations. RT has been installed. "
+       @echo ""
+       @echo ""
+       @echo "You must now configure RT by editing $(SITE_CONFIG_FILE)."
+       @echo ""
+       @echo "(You will definitely need to set RT's database password before continuing."
+       @echo " Not doing so could be very dangerous)"
+       @echo ""
+       @echo "After that, you need to initialize RT's database by running" 
+       @echo " 'make initialize-database'"
+
+#      @echo " or by executing "       
+#      @echo " '$(RT_SBIN_PATH)/rt-setup-database --action init \ "
+#      @echo "     --dba $(DB_DBA) --prompt-for-dba-password'"
+
+
+
+upgrade-instruct: 
+       @echo "Congratulations. RT has been upgraded. You should now check-over"
+       @echo "$(CONFIG_FILE) for any necessary site customization. Additionally,"
+       @echo "you should update RT's system database objects by running "
+       @echo "   ls etc/upgrade"
+       @echo "For each file in that directory whose name is greater than"
+       @echo "your previously installed RT version, run:"
+       @echo "    $(RT_SBIN_PATH)/rt-setup-database --action insert --datafile etc/upgrade/<version>"
+
+
+upgrade: dirs upgrade-noclobber upgrade-instruct
+
+upgrade-noclobber: config-install libs-install html-install bin-install local-install doc-install fixperms
+
+
+# {{{ dependencies
+testdeps:
+       $(PERL) ./sbin/rt-test-dependencies --with-$(DB_TYPE)
+
+fixdeps:
+       $(PERL) ./sbin/rt-test-dependencies --install --with-$(DB_TYPE)
+
+#}}}
+
+# {{{ fixperms
+fixperms:
+       # Make the libraries readable
+       chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_PATH)
+       chown -R $(LIBS_OWNER) $(DESTDIR)/$(RT_LIB_PATH)
+       chgrp -R $(LIBS_GROUP) $(DESTDIR)/$(RT_LIB_PATH)
+       chmod -R  u+rwX,go-w,go+rX      $(DESTDIR)/$(RT_LIB_PATH)
+
+
+       chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_BIN_PATH)
+       chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_BIN_PATH) 
+
+       chmod 0755 $(DESTDIR)/$(RT_ETC_PATH)
+       chmod 0500 $(DESTDIR)/$(RT_ETC_PATH)/*
+
+       #TODO: the config file should probably be able to have its
+       # owner set seperately from the binaries.
+       chown -R $(BIN_OWNER) $(DESTDIR)/$(RT_ETC_PATH)
+       chgrp -R $(RTGROUP) $(DESTDIR)/$(RT_ETC_PATH)
+
+       chmod 0550 $(DESTDIR)/$(CONFIG_FILE)
+       chmod 0550 $(DESTDIR)/$(SITE_CONFIG_FILE)
+
+       # Make the interfaces executable and setgid rt
+       chown $(BIN_OWNER) $(BINARIES)
+       chgrp $(RTGROUP) $(BINARIES)
+       chmod 0755  $(BINARIES)
+       chmod g+s $(SETGID_BINARIES)
+
+       # Make the web ui readable by all. 
+       chmod -R  u+rwX,go-w,go+rX      $(DESTDIR)/$(MASON_HTML_PATH) \
+                                       $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) \
+                                       $(DESTDIR)/$(LOCAL_LEXICON_PATH)
+       chown -R $(LIBS_OWNER)  $(DESTDIR)/$(MASON_HTML_PATH) \
+                               $(DESTDIR)/$(MASON_LOCAL_HTML_PATH)
+       chgrp -R $(LIBS_GROUP)  $(DESTDIR)/$(MASON_HTML_PATH) \
+                               $(DESTDIR)/$(MASON_LOCAL_HTML_PATH)
+
+       # Make the web ui's data dir writable
+       chmod 0770      $(DESTDIR)/$(MASON_DATA_PATH) \
+                       $(DESTDIR)/$(MASON_SESSION_PATH)
+       chown -R $(WEB_USER)    $(DESTDIR)/$(MASON_DATA_PATH) \
+                               $(DESTDIR)/$(MASON_SESSION_PATH)
+       chgrp -R $(WEB_GROUP)   $(DESTDIR)/$(MASON_DATA_PATH) \
+                               $(DESTDIR)/$(MASON_SESSION_PATH)
+# }}}
+
+fixperms-nosetgid: fixperms
+       @echo "You should never be running RT this way. it's unsafe"
+       chmod 0555 $(SETGID_BINARIES)
+       chmod 0555 $(DESTDIR)/$(CONFIG_FILE)
+       chmod 0555 $(DESTDIR)/$(SITE_CONFIG_FILE)
+
+# {{{ dirs
+dirs:
+       mkdir -p $(DESTDIR)/$(RT_LOG_PATH)
+       mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)
+       mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/cache
+       mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/etc
+       mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/obj
+       mkdir -p $(DESTDIR)/$(MASON_SESSION_PATH)
+       mkdir -p $(DESTDIR)/$(MASON_HTML_PATH)
+       mkdir -p $(DESTDIR)/$(MASON_LOCAL_HTML_PATH)
+       mkdir -p $(DESTDIR)/$(LOCAL_ETC_PATH)
+       mkdir -p $(DESTDIR)/$(LOCAL_LEXICON_PATH)
+# }}}
+
+install: config-install dirs files-install fixperms instruct
+
+files-install: libs-install etc-install bin-install sbin-install html-install local-install doc-install
+
+config-install:
+       mkdir -p $(DESTDIR)/$(CONFIG_FILE_PATH) 
+       cp etc/RT_Config.pm $(DESTDIR)/$(CONFIG_FILE)
+       [ -f $(DESTDIR)/$(SITE_CONFIG_FILE) ] || cp etc/RT_SiteConfig.pm $(DESTDIR)/$(SITE_CONFIG_FILE) 
+
+       chgrp $(RTGROUP) $(DESTDIR)/$(CONFIG_FILE)
+       chown $(BIN_OWNER) $(DESTDIR)/$(CONFIG_FILE)
+
+       chgrp $(RTGROUP) $(DESTDIR)/$(SITE_CONFIG_FILE)
+       chown $(BIN_OWNER) $(DESTDIR)/$(SITE_CONFIG_FILE)
+
+       @echo "Installed configuration. about to install rt in  $(RT_PATH)"
+
+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
+       $(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
+       $(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
+       $(PERL) lib/t/02regression.t
+
+regression-quiet:
+       $(PERL) sbin/regression_harness
+
+regression-instruct:
+       @echo "About to wipe your database for a regression test. ABORT NOW with Control-C"
+
+
+# {{{ database-installation
+
+regression-reset-db:
+       $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action drop --dba $(DB_DBA) --dba-password ''
+       $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action init --dba $(DB_DBA) --dba-password ''
+
+initialize-database: 
+       $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action init --dba $(DB_DBA) --prompt-for-dba-password
+
+dropdb: 
+       $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action drop --dba $(DB_DBA) --prompt-for-dba-password
+
+insert-approval-data: 
+       $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/insert_approval_scrips
+# }}}
+
+# {{{ libs-install
+libs-install: 
+       [ -d $(DESTDIR)/$(RT_LIB_PATH) ] || mkdir $(DESTDIR)/$(RT_LIB_PATH)
+       -cp -rp lib/* $(DESTDIR)/$(RT_LIB_PATH)
+# }}}
+
+# {{{ html-install
+html-install:
+       [ -d $(DESTDIR)/$(MASON_HTML_PATH) ] || mkdir $(DESTDIR)/$(MASON_HTML_PATH)
+       -cp -rp ./html/* $(DESTDIR)/$(MASON_HTML_PATH)
+# }}}
+
+# {{{ doc-install
+doc-install:
+       # RT 3.0.0 - RT 3.0.2 would accidentally create a file instead of a dir
+       -[ -f $(DESTDIR)/$(RT_DOC_PATH) ] && rm $(DESTDIR)/$(RT_DOC_PATH) 
+       [ -d $(DESTDIR)/$(RT_DOC_PATH) ] || mkdir $(DESTDIR)/$(RT_DOC_PATH)
+       -cp -rp ./README $(DESTDIR)/$(RT_DOC_PATH)
+# }}}
+
+# {{{ etc-install
+
+etc-install:
+       mkdir -p $(DESTDIR)/$(RT_ETC_PATH)
+       -cp -rp \
+               etc/acl.* \
+               etc/initialdata \
+               etc/schema.* \
+               $(DESTDIR)/$(RT_ETC_PATH)
+# }}}
+
+# {{{ sbin-install
+
+sbin-install:
+       mkdir -p $(DESTDIR)/$(RT_SBIN_PATH)
+       chmod +x sbin/rt-setup-database \
+               sbin/rt-test-dependencies
+       -cp -rp \
+               sbin/rt-setup-database \
+               sbin/rt-test-dependencies \
+               $(DESTDIR)/$(RT_SBIN_PATH)
+
+# }}}
+
+# {{{ bin-install
+
+bin-install:
+       mkdir -p $(DESTDIR)/$(RT_BIN_PATH)
+       chmod +x bin/rt-mailgate \
+               bin/rt-crontool
+       -cp -rp \
+               bin/rt-mailgate \
+               bin/mason_handler.fcgi \
+               bin/mason_handler.svc \
+               bin/webmux.pl \
+               bin/rt-crontool \
+               $(DESTDIR)/$(RT_BIN_PATH)
+# }}}
+
+# {{{ local-install
+local-install:
+       -cp -rp ./local/html/* $(DESTDIR)/$(MASON_LOCAL_HTML_PATH)
+       -cp -rp ./local/po/* $(DESTDIR)/$(LOCAL_LEXICON_PATH)
+       -cp -rp ./local/etc/* $(DESTDIR)/$(LOCAL_ETC_PATH)
+# }}}
+
+# {{{ Best Practical Build targets -- no user servicable parts inside
+
+
+POD2TEST_EXE = sbin/extract_pod_tests
+
+testify-pods:
+       [ -d lib/t/autogen ] || mkdir lib/t/autogen
+       find lib -name \*pm |grep -v \*.in |xargs -n 1 $(PERL) $(POD2TEST_EXE)
+       find bin -type f |grep -v \~ | grep -v "\.in" | xargs -n 1 $(PERL) $(POD2TEST_EXE)
+
+
+
+regenerate-catalogs:
+       $(PERL) sbin/extract-message-catalog
+
+license-tag:
+       $(PERL) sbin/license_tag
+
+factory: initialize-database
+       cd lib; $(PERL) ../sbin/factory  $(DB_DATABASE) RT
+
+commit:
+       aegis -build ; aegis -diff ; aegis -test; aegis -develop_end
+
+integrate:
+       aegis -integrate_begin; aegis -build; aegis -diff; aegis -test ; aegis -integrate_pass
+
+predist: commit tag-and-tar
+
+tag-and-release-baseline:
+       aegis -cp -ind Makefile -output /tmp/Makefile.tagandrelease; \
+       $(MAKE) -f /tmp/Makefile.tagandrelease tag-and-release-never-by-hand
+
+
+# Running this target in a working directory is 
+# WRONG WRONG WRONG.
+# it will tag the current baseline with the version of RT defined 
+# in the currently-being-worked-on makefile. which is wrong.
+#  you want tag-and-release-baseline
+
+tag-and-release-never-by-hand:
+       aegis --delta-name $(TAG)
+       rm -rf /tmp/$(TAG)
+       mkdir /tmp/$(TAG)
+       cd /tmp/$(TAG); \
+               aegis -cp -ind -delta $(TAG) . ;\
+               make reconfigure;\
+               chmod 600 Makefile;\
+               aegis --report --project rt.$(RT_VERSION_MAJOR) \
+                     --page_width 80 \
+                     --page_length 9999 \
+                     --change $(RT_VERSION_MINOR) --output Changelog Change_Log
+
+       cd /tmp; tar czvf /home/ftp/pub/rt/devel/$(TAG).tar.gz $(TAG)/
+       chmod 644 /home/ftp/pub/rt/devel/$(TAG).tar.gz
+
+
+reconfigure:
+       aclocal -I m4
+       autoconf
+       chmod 755 ./configure
+       ./configure
+
+rpm:
+       (cd ..; tar czvf /usr/src/redhat/SOURCES/rt.tar.gz rt)
+       rpm -ba etc/rt.spec
+
+
+apachectl:
+       apachectl stop
+       sleep 3
+       apachectl start
+# }}}
diff --git a/rt/aclocal.m4 b/rt/aclocal.m4
new file mode 100644 (file)
index 0000000..475b389
--- /dev/null
@@ -0,0 +1,158 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+dnl
+dnl @synopsis RT_ENABLE_LAYOUT()
+dnl
+dnl Enable a specific directory layout for the installation to use.
+dnl This configures a command-line parameter that can be specified
+dnl at ./configure invocation.
+dnl
+dnl The use of this feature in this way is a little hackish, but
+dnl better than a heap of options for every directory.
+dnl
+dnl This code is heavily borrowed *cough* from the Apache 2 code.
+dnl
+
+AC_DEFUN([RT_ENABLE_LAYOUT],[
+AC_ARG_ENABLE(layout,
+             AC_HELP_STRING([--enable-layout=LAYOUT],
+                            [Use a specific directory layout (Default: RT3)]),
+             LAYOUT=$enableval)
+
+if test "x$LAYOUT" = "x"; then
+       LAYOUT="RT3"
+fi
+RT_LAYOUT($srcdir/config.layout, $LAYOUT)
+AC_MSG_CHECKING(for chosen layout)
+if test "x$rt_layout_name" = "xno"; then
+       if test "x$LAYOUT" = "xno"; then
+               AC_MSG_RESULT(none)
+       else
+               AC_MSG_RESULT($LAYOUT)
+       fi
+       AC_MSG_ERROR([a valid layout must be specified (or the default used)])
+else
+       AC_SUBST(rt_layout_name)
+       AC_MSG_RESULT($rt_layout_name)
+fi
+])
+
+dnl
+dnl @synopsis RT_LAYOUT(configlayout, layoutname)
+dnl
+dnl This macro reads an Apache-style layout file (specified as the
+dnl configlayout parameter), and searches for a specific layout
+dnl (named using the layoutname parameter).
+dnl
+dnl The entries for a given layout are then inserted into the
+dnl environment such that they become available as substitution
+dnl variables. In addition, the rt_layout_name variable is set
+dnl (but not exported) if the layout is valid.
+dnl
+dnl This code is heavily borrowed *cough* from the Apache 2 codebase.
+dnl
+
+AC_DEFUN([RT_LAYOUT],[
+       if test ! -f $srcdir/config.layout; then
+               AC_MSG_WARN([Layout file $srcdir/config.layout not found])
+               rt_layout_name=no
+       else
+               pldconf=./config.pld
+               $PERL  -0777 -p -e "\$layout = '$2';"  -e '
+               s/.*<Layout\s+$layout>//gims; 
+               s/\<\/Layout\>.*//s; 
+               s/^#.*$//m;
+               s/^\s+//gim;
+               s/\s+$/\n/gim;
+               s/\+$/\/rt3/gim;
+               # m4 will not let us just use $1, we need @S|@1
+               s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/@S|@1=@S|@2/gim;
+               s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\@S|@@S|@1" = "xNONE" || test "x\@S|@@S|@1" = "x") && @S|@1=@S|@2/gim;
+                ' < $1 > $pldconf
+
+               if test -s $pldconf; then
+                       rt_layout_name=$2
+                       . $pldconf
+                       changequote({,})
+                       for var in prefix exec_prefix bindir sbindir \
+                                sysconfdir mandir libdir datadir htmldir \
+                                localstatedir logfiledir masonstatedir \
+                                sessionstatedir customdir custometcdir customhtmldir \
+                                customlexdir customlibdir manualdir; do
+                               eval "val=\"\$$var\""
+                               val=`echo $val | sed -e 's:\(.\)/*$:\1:'`
+                               val=`echo $val | 
+                                       sed -e 's:[\$]\([a-z_]*\):${\1}:g'`
+                               eval "$var='$val'"
+                       done
+                       changequote([,])
+               else
+                       rt_layout_name=no
+               fi
+               #rm $pldconf
+       fi
+       RT_SUBST_EXPANDED_ARG(prefix)
+       RT_SUBST_EXPANDED_ARG(exec_prefix)
+       RT_SUBST_EXPANDED_ARG(bindir)
+       RT_SUBST_EXPANDED_ARG(sbindir)
+       RT_SUBST_EXPANDED_ARG(sysconfdir)
+       RT_SUBST_EXPANDED_ARG(mandir)
+       RT_SUBST_EXPANDED_ARG(libdir)
+       RT_SUBST_EXPANDED_ARG(datadir)
+       RT_SUBST_EXPANDED_ARG(htmldir)
+       RT_SUBST_EXPANDED_ARG(manualdir)
+       RT_SUBST_EXPANDED_ARG(localstatedir)
+       RT_SUBST_EXPANDED_ARG(logfiledir)
+       RT_SUBST_EXPANDED_ARG(masonstatedir)
+       RT_SUBST_EXPANDED_ARG(sessionstatedir)
+       RT_SUBST_EXPANDED_ARG(customdir)
+       RT_SUBST_EXPANDED_ARG(custometcdir)
+       RT_SUBST_EXPANDED_ARG(customhtmldir)
+       RT_SUBST_EXPANDED_ARG(customlexdir)
+       RT_SUBST_EXPANDED_ARG(customlibdir)
+])dnl
+
+dnl
+dnl @synopsis  RT_SUBST_EXPANDED_ARG(var)
+dnl
+dnl Export (via AC_SUBST) a given variable, along with an expanded
+dnl version of the variable (same name, but with exp_ prefix).
+dnl
+dnl This code is heavily borrowed *cough* from the Apache 2 source.
+dnl
+
+AC_DEFUN([RT_SUBST_EXPANDED_ARG],[
+       RT_EXPAND_VAR(exp_$1, [$]$1)
+       AC_SUBST($1)
+       AC_SUBST(exp_$1)
+])
+
+dnl
+dnl @synopsis  RT_EXPAND_VAR(baz, $fraz)
+dnl
+dnl Iteratively expands the second parameter, until successive iterations
+dnl yield no change. The result is then assigned to the first parameter.
+dnl
+dnl This code is heavily borrowed from the Apache 2 codebase.
+dnl
+
+AC_DEFUN([RT_EXPAND_VAR],[
+       ap_last=''
+       ap_cur='$2'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       $1="${ap_cur}"
+])
+
diff --git a/rt/autom4te.cache/output.0 b/rt/autom4te.cache/output.0
new file mode 100644 (file)
index 0000000..51a8aaf
--- /dev/null
@@ -0,0 +1,2747 @@
+@%:@! /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.
+@%:@
+@%:@ Report bugs to <rt-3.0-bugs@fsck.com>.
+@%:@ 
+@%:@ Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+@%:@ Free Software Foundation, Inc.
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='RT'
+PACKAGE_TARNAME='rt'
+PACKAGE_VERSION='3.0.4'
+PACKAGE_STRING='RT 3.0.4'
+PACKAGE_BUGREPORT='rt-3.0-bugs@fsck.com'
+
+ac_unique_file="lib/RT.pm.in"
+ac_default_prefix=/opt/rt3
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$0" : 'X\(//\)[^/]' \| \
+         X"$0" : 'X\(//\)$' \| \
+         X"$0" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_PERL_set=${PERL+set}
+ac_env_PERL_value=$PERL
+ac_cv_env_PERL_set=${PERL+set}
+ac_cv_env_PERL_value=$PERL
+
+#
+# Report the --help message.
+#
+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.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of RT 3.0.4:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-layout=LAYOUT  Use a specific directory layout (Default: RT3)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-speedycgi=/path/to/speedy 
+                          path to your speedycgi binary, if it exists
+  --with-rt-group=GROUP   group to own all files (default: rt)
+  --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-host=HOSTNAME FQDN of database server (default: localhost)
+  --with-db-port=PORT     port on which the database listens on
+  --with-db-rt-host=HOSTNAME 
+                          FQDN of RT server which talks to the database server
+                          (default: localhost)
+  --with-db-dba=DBA       name of database administrator (default: root)
+  --with-db-database=DBNAME 
+                          name of the database to use (default: rt3)
+  --with-db-rt-user=DBUSER 
+                          name of database user (default: rt_user)
+  --with-db-rt-pass=PASSWORD 
+                          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)
+
+Some influential environment variables:
+  PERL        Perl interpreter command
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <rt-3.0-bugs@fsck.com>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+           test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+RT configure 3.0.4
+generated by GNU Autoconf 2.53
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+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
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+@%:@@%:@ --------- @%:@@%:@
+@%:@@%:@ Platform. @%:@@%:@
+@%:@@%:@ --------- @%:@@%:@
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ Core tests. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case $ac_arg in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n ) continue ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    continue ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  case " $ac_configure_args " in
+    *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+    *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+       ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+    cat <<\_ASBOX
+@%:@@%:@ ---------------- @%:@@%:@
+@%:@@%:@ Cache variables. @%:@@%:@
+@%:@@%:@ ---------------- @%:@@%:@
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ confdefs.h. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core core.* *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+rt_version_major=3
+
+rt_version_minor=0
+
+rt_version_patch=4
+
+test "x$rt_version_major" = 'x' && rt_version_major=0
+test "x$rt_version_minor" = 'x' && rt_version_minor=0
+test "x$rt_version_patch" = 'x' && rt_version_patch=0
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+          if test $ac_prog = install &&
+            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # AIX install.  It has an incompatible calling convention.
+            :
+          elif test $ac_prog = install &&
+            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # program-specific install script used by HP pwplus--don't use.
+            :
+          else
+            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+            break 3
+          fi
+        fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="not found"
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+  echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$PERL" = 'not found'; then
+       { { echo "$as_me:$LINENO: error: cannot use $PACKAGE_NAME without perl" >&5
+echo "$as_me: error: cannot use $PACKAGE_NAME without perl" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# Check whether --with-speedycgi or --without-speedycgi was given.
+if test "${with_speedycgi+set}" = set; then
+  withval="$with_speedycgi"
+  SPEEDY_BIN=$withval
+else
+  SPEEDY_BIN=/usr/local/bin/speedy
+fi;  
+
+
+
+
+
+# Check whether --enable-layout or --disable-layout was given.
+if test "${enable_layout+set}" = set; then
+  enableval="$enable_layout"
+  LAYOUT=$enableval
+fi; 
+
+if test "x$LAYOUT" = "x"; then
+       LAYOUT="RT3"
+fi
+
+       if test ! -f $srcdir/config.layout; then
+               { echo "$as_me:$LINENO: WARNING: Layout file $srcdir/config.layout not found" >&5
+echo "$as_me: WARNING: Layout file $srcdir/config.layout not found" >&2;}
+               rt_layout_name=no
+       else
+               pldconf=./config.pld
+               $PERL  -0777 -p -e "\$layout = '$LAYOUT';"  -e '
+               s/.*<Layout\s+$layout>//gims; 
+               s/\<\/Layout\>.*//s; 
+               s/^#.*$//m;
+               s/^\s+//gim;
+               s/\s+$/\n/gim;
+               s/\+$/\/rt3/gim;
+               # m4 will not let us just use $srcdir/config.layout, we need @S|@1
+               s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/@S|@1=@S|@2/gim;
+               s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\@S|@@S|@1" = "xNONE" || test "x\@S|@@S|@1" = "x") && @S|@1=@S|@2/gim;
+                ' < $srcdir/config.layout > $pldconf
+
+               if test -s $pldconf; then
+                       rt_layout_name=$LAYOUT
+                       . $pldconf
+                       
+                       for var in prefix exec_prefix bindir sbindir \
+                                sysconfdir mandir libdir datadir htmldir \
+                                localstatedir logfiledir masonstatedir \
+                                sessionstatedir customdir custometcdir customhtmldir \
+                                customlexdir customlibdir manualdir; do
+                               eval "val=\"\$$var\""
+                               val=`echo $val | sed -e 's:\(.\)/*$:\1:'`
+                               val=`echo $val | 
+                                       sed -e 's:[\$]\([a-z_]*\):$\1:g'`
+                               eval "$var='$val'"
+                       done
+                       
+               else
+                       rt_layout_name=no
+               fi
+               #rm $pldconf
+       fi
+       
+       
+       ap_last=''
+       ap_cur='$prefix'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_prefix="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$exec_prefix'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_exec_prefix="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$bindir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_bindir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$sbindir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_sbindir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$sysconfdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_sysconfdir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$mandir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_mandir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$libdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_libdir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$datadir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_datadir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$htmldir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_htmldir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$manualdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_manualdir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$localstatedir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_localstatedir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$logfiledir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_logfiledir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$masonstatedir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_masonstatedir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$sessionstatedir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_sessionstatedir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$customdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customdir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$custometcdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_custometcdir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$customhtmldir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customhtmldir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$customlexdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customlexdir="${ap_cur}"
+
+       
+       
+
+       
+       
+       ap_last=''
+       ap_cur='$customlibdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customlibdir="${ap_cur}"
+
+       
+       
+
+
+echo "$as_me:$LINENO: checking for chosen layout" >&5
+echo $ECHO_N "checking for chosen layout... $ECHO_C" >&6
+if test "x$rt_layout_name" = "xno"; then
+       if test "x$LAYOUT" = "xno"; then
+               echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+       else
+               echo "$as_me:$LINENO: result: $LAYOUT" >&5
+echo "${ECHO_T}$LAYOUT" >&6
+       fi
+       { { echo "$as_me:$LINENO: error: a valid layout must be specified (or the default used)" >&5
+echo "$as_me: error: a valid layout must be specified (or the default used)" >&2;}
+   { (exit 1); exit 1; }; }
+else
+       
+       echo "$as_me:$LINENO: result: $rt_layout_name" >&5
+echo "${ECHO_T}$rt_layout_name" >&6
+fi
+
+
+
+# Check whether --with-rt-group or --without-rt-group was given.
+if test "${with_rt_group+set}" = set; then
+  withval="$with_rt_group"
+  RTGROUP=$withval
+else
+  RTGROUP=rt
+fi; 
+
+
+
+# Check whether --with-bin-owner or --without-bin-owner was given.
+if test "${with_bin_owner+set}" = set; then
+  withval="$with_bin_owner"
+  BIN_OWNER=$withval
+else
+  BIN_OWNER=root
+fi; 
+
+
+
+# Check whether --with-libs-owner or --without-libs-owner was given.
+if test "${with_libs_owner+set}" = set; then
+  withval="$with_libs_owner"
+  LIBS_OWNER=$withval
+else
+  LIBS_OWNER=root
+fi; 
+
+
+
+# Check whether --with-libs-group or --without-libs-group was given.
+if test "${with_libs_group+set}" = set; then
+  withval="$with_libs_group"
+  LIBS_GROUP=$withval
+else
+  LIBS_GROUP=bin
+fi; 
+
+
+
+# Check whether --with-db-type or --without-db-type was given.
+if test "${with_db_type+set}" = set; then
+  withval="$with_db_type"
+  DB_TYPE=$withval
+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;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+# Check whether --with-db-host or --without-db-host was given.
+if test "${with_db_host+set}" = set; then
+  withval="$with_db_host"
+  DB_HOST=$withval
+else
+  DB_HOST=localhost
+fi; 
+
+
+
+# Check whether --with-db-port or --without-db-port was given.
+if test "${with_db_port+set}" = set; then
+  withval="$with_db_port"
+  DB_PORT=$withval
+else
+  DB_PORT=
+fi; 
+
+
+
+# Check whether --with-db-rt-host or --without-db-rt-host was given.
+if test "${with_db_rt_host+set}" = set; then
+  withval="$with_db_rt_host"
+  DB_RT_HOST=$withval
+else
+  DB_RT_HOST=localhost
+fi; 
+
+
+
+# Check whether --with-db-dba or --without-db-dba was given.
+if test "${with_db_dba+set}" = set; then
+  withval="$with_db_dba"
+  DB_DBA=$withval
+else
+  DB_DBA=root
+fi; 
+
+
+
+# Check whether --with-db-database or --without-db-database was given.
+if test "${with_db_database+set}" = set; then
+  withval="$with_db_database"
+  DB_DATABASE=$withval
+else
+  DB_DATABASE=rt3
+fi; 
+
+
+
+# Check whether --with-db-rt-user or --without-db-rt-user was given.
+if test "${with_db_rt_user+set}" = set; then
+  withval="$with_db_rt_user"
+  DB_RT_USER=$withval
+else
+  DB_RT_USER=rt_user
+fi; 
+
+
+
+# Check whether --with-db-rt-pass or --without-db-rt-pass was given.
+if test "${with_db_rt_pass+set}" = set; then
+  withval="$with_db_rt_pass"
+  DB_RT_PASS=$withval
+else
+  DB_RT_PASS=rt_pass
+fi; 
+
+
+
+# Check whether --with-web-user or --without-web-user was given.
+if test "${with_web_user+set}" = set; then
+  withval="$with_web_user"
+  WEB_USER=$withval
+else
+  WEB_USER=www
+fi; 
+
+
+
+# Check whether --with-web-group or --without-web-group was given.
+if test "${with_web_group+set}" = set; then
+  withval="$with_web_group"
+  WEB_GROUP=$withval
+else
+  WEB_GROUP=www
+fi; 
+
+
+
+RT_VERSION_MAJOR=${rt_version_major}
+
+RT_VERSION_MINOR=${rt_version_minor}
+
+RT_VERSION_PATCH=${rt_version_patch}
+
+
+RT_PATH=${exp_prefix}
+
+RT_DOC_PATH=${exp_manualdir}
+
+RT_LOCAL_PATH=${exp_customdir}
+
+RT_LIB_PATH=${exp_libdir}
+
+RT_ETC_PATH=${exp_sysconfdir}
+
+CONFIG_FILE_PATH=${exp_sysconfdir}
+
+RT_BIN_PATH=${exp_bindir}
+
+RT_SBIN_PATH=${exp_sbindir}
+
+RT_VAR_PATH=${exp_localstatedir}
+
+RT_MAN_PATH=${exp_mandir}
+
+MASON_DATA_PATH=${exp_masonstatedir}
+
+MASON_SESSION_PATH=${exp_sessionstatedir}
+
+MASON_HTML_PATH=${exp_htmldir}
+
+LOCAL_ETC_PATH=${exp_custometcdir}
+
+MASON_LOCAL_HTML_PATH=${exp_customhtmldir}
+
+LOCAL_LEXICON_PATH=${exp_customlexdir}
+
+LOCAL_LIB_PATH=${exp_customlibdir}
+
+DESTDIR=${exp_prefix}
+
+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"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[   ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[     ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[   ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\),-D\1=\2,g
+t quote
+s,^[   ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[    `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output.  A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by RT $as_me 3.0.4, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+RT config.status 3.0.4
+configured by $0, generated by GNU Autoconf 2.53,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "sbin/rt-setup-database" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-setup-database" ;;
+  "sbin/rt-test-dependencies" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-test-dependencies" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "etc/RT_Config.pm" ) CONFIG_FILES="$CONFIG_FILES etc/RT_Config.pm" ;;
+  "lib/RT.pm" ) CONFIG_FILES="$CONFIG_FILES lib/RT.pm" ;;
+  "lib/t/00smoke.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/00smoke.t" ;;
+  "lib/t/01harness.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/01harness.t" ;;
+  "lib/t/02regression.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/02regression.t" ;;
+  "lib/t/03web.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/03web.pl" ;;
+  "lib/t/04_send_email.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/04_send_email.pl" ;;
+  "bin/mason_handler.fcgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.fcgi" ;;
+  "bin/mason_handler.scgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.scgi" ;;
+  "bin/mason_handler.svc" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.svc" ;;
+  "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/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;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@rt_version_major@,$rt_version_major,;t t
+s,@rt_version_minor@,$rt_version_minor,;t t
+s,@rt_version_patch@,$rt_version_patch,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@PERL@,$PERL,;t t
+s,@SPEEDY_BIN@,$SPEEDY_BIN,;t t
+s,@exp_prefix@,$exp_prefix,;t t
+s,@exp_exec_prefix@,$exp_exec_prefix,;t t
+s,@exp_bindir@,$exp_bindir,;t t
+s,@exp_sbindir@,$exp_sbindir,;t t
+s,@exp_sysconfdir@,$exp_sysconfdir,;t t
+s,@exp_mandir@,$exp_mandir,;t t
+s,@exp_libdir@,$exp_libdir,;t t
+s,@exp_datadir@,$exp_datadir,;t t
+s,@htmldir@,$htmldir,;t t
+s,@exp_htmldir@,$exp_htmldir,;t t
+s,@manualdir@,$manualdir,;t t
+s,@exp_manualdir@,$exp_manualdir,;t t
+s,@exp_localstatedir@,$exp_localstatedir,;t t
+s,@logfiledir@,$logfiledir,;t t
+s,@exp_logfiledir@,$exp_logfiledir,;t t
+s,@masonstatedir@,$masonstatedir,;t t
+s,@exp_masonstatedir@,$exp_masonstatedir,;t t
+s,@sessionstatedir@,$sessionstatedir,;t t
+s,@exp_sessionstatedir@,$exp_sessionstatedir,;t t
+s,@customdir@,$customdir,;t t
+s,@exp_customdir@,$exp_customdir,;t t
+s,@custometcdir@,$custometcdir,;t t
+s,@exp_custometcdir@,$exp_custometcdir,;t t
+s,@customhtmldir@,$customhtmldir,;t t
+s,@exp_customhtmldir@,$exp_customhtmldir,;t t
+s,@customlexdir@,$customlexdir,;t t
+s,@exp_customlexdir@,$exp_customlexdir,;t t
+s,@customlibdir@,$customlibdir,;t t
+s,@exp_customlibdir@,$exp_customlibdir,;t t
+s,@rt_layout_name@,$rt_layout_name,;t t
+s,@RTGROUP@,$RTGROUP,;t t
+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,@DB_HOST@,$DB_HOST,;t t
+s,@DB_PORT@,$DB_PORT,;t t
+s,@DB_RT_HOST@,$DB_RT_HOST,;t t
+s,@DB_DBA@,$DB_DBA,;t t
+s,@DB_DATABASE@,$DB_DATABASE,;t t
+s,@DB_RT_USER@,$DB_RT_USER,;t t
+s,@DB_RT_PASS@,$DB_RT_PASS,;t t
+s,@WEB_USER@,$WEB_USER,;t t
+s,@WEB_GROUP@,$WEB_GROUP,;t t
+s,@RT_VERSION_MAJOR@,$RT_VERSION_MAJOR,;t t
+s,@RT_VERSION_MINOR@,$RT_VERSION_MINOR,;t t
+s,@RT_VERSION_PATCH@,$RT_VERSION_PATCH,;t t
+s,@RT_PATH@,$RT_PATH,;t t
+s,@RT_DOC_PATH@,$RT_DOC_PATH,;t t
+s,@RT_LOCAL_PATH@,$RT_LOCAL_PATH,;t t
+s,@RT_LIB_PATH@,$RT_LIB_PATH,;t t
+s,@RT_ETC_PATH@,$RT_ETC_PATH,;t t
+s,@CONFIG_FILE_PATH@,$CONFIG_FILE_PATH,;t t
+s,@RT_BIN_PATH@,$RT_BIN_PATH,;t t
+s,@RT_SBIN_PATH@,$RT_SBIN_PATH,;t t
+s,@RT_VAR_PATH@,$RT_VAR_PATH,;t t
+s,@RT_MAN_PATH@,$RT_MAN_PATH,;t t
+s,@MASON_DATA_PATH@,$MASON_DATA_PATH,;t t
+s,@MASON_SESSION_PATH@,$MASON_SESSION_PATH,;t t
+s,@MASON_HTML_PATH@,$MASON_HTML_PATH,;t t
+s,@LOCAL_ETC_PATH@,$LOCAL_ETC_PATH,;t t
+s,@MASON_LOCAL_HTML_PATH@,$MASON_LOCAL_HTML_PATH,;t t
+s,@LOCAL_LEXICON_PATH@,$LOCAL_LEXICON_PATH,;t t
+s,@LOCAL_LIB_PATH@,$LOCAL_LIB_PATH,;t t
+s,@DESTDIR@,$DESTDIR,;t t
+s,@RT_LOG_PATH@,$RT_LOG_PATH,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" ||
+        mkdir "$as_incr_dir" ||
+       { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }
+    ;;
+  esac
+done; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/rt/autom4te.cache/requests b/rt/autom4te.cache/requests
new file mode 100644 (file)
index 0000000..fad7b54
--- /dev/null
@@ -0,0 +1,94 @@
+# This file was created by autom4te.
+# It contains the lists of macros which have been traced.
+# It can be safely removed.
+
+@request = (
+             bless( [
+                      '0',
+                      1,
+                      [
+                        '/usr/share/autoconf'
+                      ],
+                      [
+                        '--reload-state=/usr/share/autoconf/autoconf/autoconf.m4f',
+                        'aclocal.m4',
+                        'configure.ac'
+                      ],
+                      {
+                        'AC_HEADER_STAT' => 1,
+                        'AC_FUNC_STRFTIME' => 1,
+                        'AC_PROG_RANLIB' => 1,
+                        'AC_FUNC_WAIT3' => 1,
+                        'AC_FUNC_SETPGRP' => 1,
+                        'AC_HEADER_TIME' => 1,
+                        'AC_FUNC_SETVBUF_REVERSED' => 1,
+                        'AC_HEADER_SYS_WAIT' => 1,
+                        'AC_TYPE_UID_T' => 1,
+                        'AM_CONDITIONAL' => 1,
+                        'AC_CHECK_LIB' => 1,
+                        'AC_PROG_LN_S' => 1,
+                        'AC_FUNC_MEMCMP' => 1,
+                        'AC_FUNC_FORK' => 1,
+                        'AC_FUNC_GETGROUPS' => 1,
+                        'AC_HEADER_MAJOR' => 1,
+                        'AC_FUNC_STRTOD' => 1,
+                        'AC_HEADER_DIRENT' => 1,
+                        'AC_FUNC_UTIME_NULL' => 1,
+                        'AC_CONFIG_FILES' => 1,
+                        'AC_FUNC_ALLOCA' => 1,
+                        'AC_C_CONST' => 1,
+                        'include' => 1,
+                        'AC_FUNC_OBSTACK' => 1,
+                        'AC_FUNC_LSTAT' => 1,
+                        'AC_STRUCT_TIMEZONE' => 1,
+                        'AC_FUNC_GETPGRP' => 1,
+                        'AC_DEFINE_TRACE_LITERAL' => 1,
+                        'AC_CHECK_HEADERS' => 1,
+                        'AC_TYPE_MODE_T' => 1,
+                        'AC_CHECK_TYPES' => 1,
+                        'AC_PROG_YACC' => 1,
+                        'AC_TYPE_PID_T' => 1,
+                        'AC_FUNC_STRERROR_R' => 1,
+                        'AC_STRUCT_ST_BLOCKS' => 1,
+                        'AC_PROG_GCC_TRADITIONAL' => 1,
+                        'AC_TYPE_SIGNAL' => 1,
+                        'AC_FUNC_FNMATCH' => 1,
+                        'AC_PROG_CPP' => 1,
+                        'AM_PROG_LIBTOOL' => 1,
+                        'AC_FUNC_STAT' => 1,
+                        'AC_PROG_INSTALL' => 1,
+                        'AM_GNU_GETTEXT' => 1,
+                        'AC_FUNC_STRCOLL' => 1,
+                        'AC_LIBSOURCE' => 1,
+                        'AC_C_INLINE' => 1,
+                        'AC_FUNC_CHOWN' => 1,
+                        'AC_PROG_LEX' => 1,
+                        'AH_OUTPUT' => 1,
+                        'AC_HEADER_STDC' => 1,
+                        'AC_FUNC_GETLOADAVG' => 1,
+                        'AC_CHECK_FUNCS' => 1,
+                        'AC_TYPE_SIZE_T' => 1,
+                        'AC_DECL_SYS_SIGLIST' => 1,
+                        'AC_FUNC_MKTIME' => 1,
+                        'AC_PROG_MAKE_SET' => 1,
+                        'AC_PROG_CXX' => 1,
+                        'm4_pattern_allow' => 1,
+                        'm4_include' => 1,
+                        'm4_pattern_forbid' => 1,
+                        'AC_PROG_AWK' => 1,
+                        'AC_FUNC_VPRINTF' => 1,
+                        'AC_CONFIG_HEADERS' => 1,
+                        'AC_PATH_X' => 1,
+                        'AC_TYPE_OFF_T' => 1,
+                        'AC_FUNC_MALLOC' => 1,
+                        'AC_FUNC_ERROR_AT_LINE' => 1,
+                        'AC_FUNC_FSEEKO' => 1,
+                        'AC_FUNC_MMAP' => 1,
+                        'AC_STRUCT_TM' => 1,
+                        'AC_SUBST' => 1,
+                        'AC_PROG_CC' => 1,
+                        'AC_PROG_LIBTOOL' => 1
+                      }
+                    ], 'Request' )
+           );
+
diff --git a/rt/autom4te.cache/traces.0 b/rt/autom4te.cache/traces.0
new file mode 100644 (file)
index 0000000..962f400
--- /dev/null
@@ -0,0 +1,156 @@
+m4trace:configure.ac:9: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.ac:9: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.ac:9: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs. LIBOBJS'])
+m4trace:configure.ac:9: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.ac:9: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.ac:9: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.ac:9: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.ac:9: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}])
+m4trace:configure.ac:9: -1- AC_SUBST([PATH_SEPARATOR])
+m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME],      ['AC_PACKAGE_NAME'])])
+m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME],   ['AC_PACKAGE_TARNAME'])])
+m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION],   ['AC_PACKAGE_VERSION'])])
+m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING],    ['AC_PACKAGE_STRING'])])
+m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
+m4trace:configure.ac:9: -1- AC_SUBST([exec_prefix], [NONE])
+m4trace:configure.ac:9: -1- AC_SUBST([prefix], [NONE])
+m4trace:configure.ac:9: -1- AC_SUBST([program_transform_name], [s,x,x,])
+m4trace:configure.ac:9: -1- AC_SUBST([bindir], ['${exec_prefix}/bin'])
+m4trace:configure.ac:9: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin'])
+m4trace:configure.ac:9: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec'])
+m4trace:configure.ac:9: -1- AC_SUBST([datadir], ['${prefix}/share'])
+m4trace:configure.ac:9: -1- AC_SUBST([sysconfdir], ['${prefix}/etc'])
+m4trace:configure.ac:9: -1- AC_SUBST([sharedstatedir], ['${prefix}/com'])
+m4trace:configure.ac:9: -1- AC_SUBST([localstatedir], ['${prefix}/var'])
+m4trace:configure.ac:9: -1- AC_SUBST([libdir], ['${exec_prefix}/lib'])
+m4trace:configure.ac:9: -1- AC_SUBST([includedir], ['${prefix}/include'])
+m4trace:configure.ac:9: -1- AC_SUBST([oldincludedir], ['/usr/include'])
+m4trace:configure.ac:9: -1- AC_SUBST([infodir], ['${prefix}/info'])
+m4trace:configure.ac:9: -1- AC_SUBST([mandir], ['${prefix}/man'])
+m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
+m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
+#undef PACKAGE_NAME])
+m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
+m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME])
+m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
+m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
+#undef PACKAGE_VERSION])
+m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
+m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING])
+m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
+m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT])
+m4trace:configure.ac:9: -1- AC_SUBST([build_alias])
+m4trace:configure.ac:9: -1- AC_SUBST([host_alias])
+m4trace:configure.ac:9: -1- AC_SUBST([target_alias])
+m4trace:configure.ac:9: -1- AC_SUBST([DEFS])
+m4trace:configure.ac:9: -1- AC_SUBST([ECHO_C])
+m4trace:configure.ac:9: -1- AC_SUBST([ECHO_N])
+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:24: -1- AC_PROG_INSTALL
+m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_PROGRAM])
+m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_SCRIPT])
+m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_DATA])
+m4trace:configure.ac:25: -1- AC_SUBST([PERL])
+m4trace:configure.ac:26: -1- AC_SUBST([PERL], [$ac_cv_path_PERL])
+m4trace:configure.ac:36: -1- AC_SUBST([SPEEDY_BIN])
+m4trace:configure.ac:41: -1- AC_SUBST([prefix])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_prefix])
+m4trace:configure.ac:41: -1- AC_SUBST([exec_prefix])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_exec_prefix])
+m4trace:configure.ac:41: -1- AC_SUBST([bindir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_bindir])
+m4trace:configure.ac:41: -1- AC_SUBST([sbindir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_sbindir])
+m4trace:configure.ac:41: -1- AC_SUBST([sysconfdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_sysconfdir])
+m4trace:configure.ac:41: -1- AC_SUBST([mandir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_mandir])
+m4trace:configure.ac:41: -1- AC_SUBST([libdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_libdir])
+m4trace:configure.ac:41: -1- AC_SUBST([datadir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_datadir])
+m4trace:configure.ac:41: -1- AC_SUBST([htmldir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_htmldir])
+m4trace:configure.ac:41: -1- AC_SUBST([manualdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_manualdir])
+m4trace:configure.ac:41: -1- AC_SUBST([localstatedir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_localstatedir])
+m4trace:configure.ac:41: -1- AC_SUBST([logfiledir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_logfiledir])
+m4trace:configure.ac:41: -1- AC_SUBST([masonstatedir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_masonstatedir])
+m4trace:configure.ac:41: -1- AC_SUBST([sessionstatedir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_sessionstatedir])
+m4trace:configure.ac:41: -1- AC_SUBST([customdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_customdir])
+m4trace:configure.ac:41: -1- AC_SUBST([custometcdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_custometcdir])
+m4trace:configure.ac:41: -1- AC_SUBST([customhtmldir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_customhtmldir])
+m4trace:configure.ac:41: -1- AC_SUBST([customlexdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_customlexdir])
+m4trace:configure.ac:41: -1- AC_SUBST([customlibdir])
+m4trace:configure.ac:41: -1- AC_SUBST([exp_customlibdir])
+m4trace:configure.ac:41: -1- AC_SUBST([rt_layout_name])
+m4trace:configure.ac:49: -1- AC_SUBST([RTGROUP])
+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([
+                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
+                ])
diff --git a/rt/bin/mason_handler.fcgi.in b/rt/bin/mason_handler.fcgi.in
new file mode 100644 (file)
index 0000000..e932bfc
--- /dev/null
@@ -0,0 +1,54 @@
+#!@PERL@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 File::Basename;
+require ('@RT_BIN_PATH@/webmux.pl');
+
+my $h = &RT::Interface::Web::NewCGIHandler();
+
+# Enter CGI::Fast mode, which should also work as a vanilla CGI script.
+require CGI::Fast;
+
+RT::Init();
+
+# Response loop
+while ( my $cgi = CGI::Fast->new ) {
+    # the whole point of fastcgi requires the env to get reset here..
+    # So we must squash it again
+    $ENV{'PATH'}   = '/bin:/usr/bin';
+    $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'};
+    $ENV{'SHELL'}  = '/bin/sh' if defined $ENV{'SHELL'};
+    $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");
+    }
+    $h->handle_cgi_object($cgi);
+    # _should_ always be tied
+}
+
+1;
diff --git a/rt/bin/mason_handler.scgi.in b/rt/bin/mason_handler.scgi.in
new file mode 100644 (file)
index 0000000..37d8380
--- /dev/null
@@ -0,0 +1,41 @@
+#!@SPEEDY_BIN@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+require ('@RT_BIN_PATH@/webmux.pl');
+
+my $h = &RT::Interface::Web::NewCGIHandler();
+
+require CGI;
+
+RT::Init();
+
+my $cgi = CGI->new;
+unless ($h->interp->comp_exists($cgi->path_info)) {
+    $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
new file mode 100644 (file)
index 0000000..e6d8378
--- /dev/null
@@ -0,0 +1,234 @@
+#!/usr/bin/perl
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+=head1 NAME
+
+mason_handler.svc - Win32 IIS Service handler for RT
+
+=head1 SYNOPSIS
+
+    perl mason_handler.svc --install   # install as service
+    perl mason_handler.svc --deinstall # deinstall this service
+    perl mason_handler.svc --help      # show this help
+    perl mason_handler.svc             # launch handler from command line
+
+=head1 DESCRIPTION
+
+This script manages a stand-alone FastCGI server, and populates the necessary
+registry settings to run it with Microsoft IIS Server 4.0 or above.
+
+Before running it, you need to install the B<FCGI> module from CPAN, as well as
+B<Win32::Daemon> from L<http://www.roth.net/perl/Daemon/> if you want to install
+itself as a service.
+
+This script will automatically create a virtual directory under the IIS root;
+its name is taken from C<$WebPath> in the F<RT_Config.pm> file.  Additionally,
+please install the ISAPI binary from L<http://www.caraveo.com/fastcgi/> and set
+up an ISAPI Script Map that maps F<.html> files to F<isapi_fcgi.dll>.
+
+Once the service is launched (either via C<net start RTFastCGI> or by running
+C<perl mason_handler.svc>), a FCGI server will start and bind to port C<8284>
+(mnemonics: the ASCII value of C<R> and C<T>); the ISAPI handler's C<BindPath>
+registry setting will also be automatically populated.
+
+=cut
+
+use strict;
+use File::Basename;
+require (dirname(__FILE__) . '/webmux.pl');
+
+use Cwd;
+use File::Spec;
+
+use Win32;
+use Win32::Process;
+use Win32::Service;
+use Win32::TieRegistry;
+
+my $ProcessObj;
+
+BEGIN {
+    my $runsvc = sub {
+       Win32::Process::Create(
+           $ProcessObj, $^X, "$^X $0 --run", 0, NORMAL_PRIORITY_CLASS, "."
+       ) or do {
+           die Win32::FormatMessage( Win32::GetLastError() );
+       };
+
+       chdir File::Basename::dirname($0);
+       my $path = Cwd::cwd();
+       $path =~ s|/|\\|g;
+       $path =~ s|bin$|share\\html|;
+
+       $Win32::TieRegistry::Registry->{
+           'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\\'.
+           'W3SVC\Parameters\Virtual Roots\\'
+       }->{$RT::WebPath || '/'} = "$path,,205";
+           
+       $Win32::TieRegistry::Registry->{
+           'HKEY_LOCAL_MACHINE\Software\FASTCGI\.html\\'
+       }->{'BindPath'} = $ENV{'FCGI_SOCKET_PATH'};
+
+       Win32::Service::StartService(Win32::NodeName, 'W3SVC');
+    };
+    
+    if ($ARGV[0] eq '--deinstall') {
+       chdir File::Basename::dirname($0);
+       my $path = Cwd::cwd();
+       $path =~ s|/|\\|g;
+
+       require Win32::Daemon;
+       Win32::Daemon::DeleteService('RTFastCGI');
+       warn "Service 'RTFastCGI' successfully deleted.\n";
+       exit;
+    }
+    elsif ($ARGV[0] eq '--install') {
+       chdir File::Basename::dirname($0);
+       my $path = Cwd::cwd();
+       $path =~ s|/|\\|g;
+
+       require Win32::Daemon;
+       Win32::Daemon::DeleteService('RTFastCGI');
+       
+       my $rv = Win32::Daemon::CreateService( {
+           machine =>  '',
+           name    =>  'RTFastCGI',
+           display =>  'RT FastCGI Handler',
+           path    =>  $^X,
+           user    =>  '',
+           pwd     =>  $path,
+           description => 'Enables port 8284 as the RT FastCGI handler.',
+           parameters  => File::Spec->catfile(
+                   $path, File::Basename::basename($0)
+           ) . ' --service',
+       } );
+    
+       if ($rv) {
+           warn "Service 'RTFastCGI' successfully created.\n";
+       }
+       else {
+           warn "Failed to add service: " . Win32::FormatMessage(
+               Win32::Daemon::GetLastError()
+           ) . "\n";
+       }
+       exit;
+    }
+    elsif ($ARGV[0] eq '--service') {
+       require Win32::Daemon;
+
+       my $PrevState = Win32::Daemon::SERVICE_START_PENDING();
+       Win32::Daemon::StartService() or die $^E;
+
+       while ( 1 ) {
+           my $State = Win32::Daemon::State();
+           last if $State == Win32::Daemon::SERVICE_STOPPED();
+           
+           if ( $State == Win32::Daemon::SERVICE_START_PENDING() ) {
+               $runsvc->();
+               Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() );
+               $PrevState = Win32::Daemon::SERVICE_RUNNING();
+           }
+           elsif ( $State == Win32::Daemon::SERVICE_CONTINUE_PENDING() ) {
+               $ProcessObj->Resume;
+               Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() );
+               $PrevState = Win32::Daemon::SERVICE_RUNNING();
+           }
+           elsif ( $State == Win32::Daemon::SERVICE_STOP_PENDING() ) {
+           $ProcessObj->Kill(0);
+               Win32::Daemon::State( Win32::Daemon::SERVICE_STOPPED() );
+               $PrevState = Win32::Daemon::SERVICE_STOPPED();
+           }
+           elsif ( $State == Win32::Daemon::SERVICE_RUNNING() ) {
+               my $Message = Win32::Daemon::QueryLastMessage(1);
+               if ( $Message == Win32::Daemon::SERVICE_CONTROL_INTERROGATE() ) {
+                   Win32::Daemon::State( $PrevState );
+               }
+               elsif ( $Message == Win32::Daemon::SERVICE_CONTROL_SHUTDOWN() ) {
+                   Win32::Daemon::State( Win32::Daemon::SERVICE_STOP_PENDING(), 15000 );
+               }
+               elsif ( $Message != Win32::Daemon::SERVICE_CONTROL_NONE() ) {
+                   Win32::Daemon::State( $PrevState );
+               }
+           }
+           
+           Win32::Sleep( 1000 );
+       }
+               
+       Win32::Daemon::StopService();
+       exit;
+    }
+    elsif ($ARGV[0] eq '--help') {
+       system("perldoc $0");
+       exit;
+    }
+    elsif ($ARGV[0] ne '--run') {
+       $SIG{__DIE__} = sub { $ProcessObj->Kill(0) if $ProcessObj };
+       $runsvc->();
+       warn "RT FastCGI Handler launched. Press [Enter] to terminate...\n";
+       <STDIN>;
+       exit;
+    }
+}
+
+###############################################################################
+
+warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n";
+
+require CGI::Fast;
+my $h = &RT::Interface::Web::NewCGIHandler();
+
+RT::Init();
+
+# Response loop
+while( my $cgi = CGI::Fast->new ) {
+    my $comp = $ENV{'PATH_INFO'};
+
+    $comp = $1 if ($comp =~ /^(.*)$/);
+    $comp =~ s|^$RT::WebPath\b||i;
+    $comp .= "index.html" if ($comp =~ /\/$/);
+    $comp =~ s/.pl$/.html/g;
+    
+    warn "Serving $comp\n";
+
+    $h->handle_cgi($comp);
+    # _should_ always be tied
+}
+
+1;
+
+=head1 AUTHORS
+
+Autrijus Tang E<lt>autrijus@autrijus.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2002 by Autrijus Tang E<lt>autrijus@autrijus.orgE<gt>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/rt/bin/mason_handler.svc.in b/rt/bin/mason_handler.svc.in
new file mode 100644 (file)
index 0000000..cc12c0e
--- /dev/null
@@ -0,0 +1,234 @@
+#!@PERL@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+=head1 NAME
+
+mason_handler.svc - Win32 IIS Service handler for RT
+
+=head1 SYNOPSIS
+
+    perl mason_handler.svc --install   # install as service
+    perl mason_handler.svc --deinstall # deinstall this service
+    perl mason_handler.svc --help      # show this help
+    perl mason_handler.svc             # launch handler from command line
+
+=head1 DESCRIPTION
+
+This script manages a stand-alone FastCGI server, and populates the necessary
+registry settings to run it with Microsoft IIS Server 4.0 or above.
+
+Before running it, you need to install the B<FCGI> module from CPAN, as well as
+B<Win32::Daemon> from L<http://www.roth.net/perl/Daemon/> if you want to install
+itself as a service.
+
+This script will automatically create a virtual directory under the IIS root;
+its name is taken from C<$WebPath> in the F<RT_Config.pm> file.  Additionally,
+please install the ISAPI binary from L<http://www.caraveo.com/fastcgi/> and set
+up an ISAPI Script Map that maps F<.html> files to F<isapi_fcgi.dll>.
+
+Once the service is launched (either via C<net start RTFastCGI> or by running
+C<perl mason_handler.svc>), a FCGI server will start and bind to port C<8284>
+(mnemonics: the ASCII value of C<R> and C<T>); the ISAPI handler's C<BindPath>
+registry setting will also be automatically populated.
+
+=cut
+
+use strict;
+use File::Basename;
+require (dirname(__FILE__) . '/webmux.pl');
+
+use Cwd;
+use File::Spec;
+
+use Win32;
+use Win32::Process;
+use Win32::Service;
+use Win32::TieRegistry;
+
+my $ProcessObj;
+
+BEGIN {
+    my $runsvc = sub {
+       Win32::Process::Create(
+           $ProcessObj, $^X, "$^X $0 --run", 0, NORMAL_PRIORITY_CLASS, "."
+       ) or do {
+           die Win32::FormatMessage( Win32::GetLastError() );
+       };
+
+       chdir File::Basename::dirname($0);
+       my $path = Cwd::cwd();
+       $path =~ s|/|\\|g;
+       $path =~ s|bin$|share\\html|;
+
+       $Win32::TieRegistry::Registry->{
+           'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\\'.
+           'W3SVC\Parameters\Virtual Roots\\'
+       }->{$RT::WebPath || '/'} = "$path,,205";
+           
+       $Win32::TieRegistry::Registry->{
+           'HKEY_LOCAL_MACHINE\Software\FASTCGI\.html\\'
+       }->{'BindPath'} = $ENV{'FCGI_SOCKET_PATH'};
+
+       Win32::Service::StartService(Win32::NodeName, 'W3SVC');
+    };
+    
+    if ($ARGV[0] eq '--deinstall') {
+       chdir File::Basename::dirname($0);
+       my $path = Cwd::cwd();
+       $path =~ s|/|\\|g;
+
+       require Win32::Daemon;
+       Win32::Daemon::DeleteService('RTFastCGI');
+       warn "Service 'RTFastCGI' successfully deleted.\n";
+       exit;
+    }
+    elsif ($ARGV[0] eq '--install') {
+       chdir File::Basename::dirname($0);
+       my $path = Cwd::cwd();
+       $path =~ s|/|\\|g;
+
+       require Win32::Daemon;
+       Win32::Daemon::DeleteService('RTFastCGI');
+       
+       my $rv = Win32::Daemon::CreateService( {
+           machine =>  '',
+           name    =>  'RTFastCGI',
+           display =>  'RT FastCGI Handler',
+           path    =>  $^X,
+           user    =>  '',
+           pwd     =>  $path,
+           description => 'Enables port 8284 as the RT FastCGI handler.',
+           parameters  => File::Spec->catfile(
+                   $path, File::Basename::basename($0)
+           ) . ' --service',
+       } );
+    
+       if ($rv) {
+           warn "Service 'RTFastCGI' successfully created.\n";
+       }
+       else {
+           warn "Failed to add service: " . Win32::FormatMessage(
+               Win32::Daemon::GetLastError()
+           ) . "\n";
+       }
+       exit;
+    }
+    elsif ($ARGV[0] eq '--service') {
+       require Win32::Daemon;
+
+       my $PrevState = Win32::Daemon::SERVICE_START_PENDING();
+       Win32::Daemon::StartService() or die $^E;
+
+       while ( 1 ) {
+           my $State = Win32::Daemon::State();
+           last if $State == Win32::Daemon::SERVICE_STOPPED();
+           
+           if ( $State == Win32::Daemon::SERVICE_START_PENDING() ) {
+               $runsvc->();
+               Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() );
+               $PrevState = Win32::Daemon::SERVICE_RUNNING();
+           }
+           elsif ( $State == Win32::Daemon::SERVICE_CONTINUE_PENDING() ) {
+               $ProcessObj->Resume;
+               Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() );
+               $PrevState = Win32::Daemon::SERVICE_RUNNING();
+           }
+           elsif ( $State == Win32::Daemon::SERVICE_STOP_PENDING() ) {
+           $ProcessObj->Kill(0);
+               Win32::Daemon::State( Win32::Daemon::SERVICE_STOPPED() );
+               $PrevState = Win32::Daemon::SERVICE_STOPPED();
+           }
+           elsif ( $State == Win32::Daemon::SERVICE_RUNNING() ) {
+               my $Message = Win32::Daemon::QueryLastMessage(1);
+               if ( $Message == Win32::Daemon::SERVICE_CONTROL_INTERROGATE() ) {
+                   Win32::Daemon::State( $PrevState );
+               }
+               elsif ( $Message == Win32::Daemon::SERVICE_CONTROL_SHUTDOWN() ) {
+                   Win32::Daemon::State( Win32::Daemon::SERVICE_STOP_PENDING(), 15000 );
+               }
+               elsif ( $Message != Win32::Daemon::SERVICE_CONTROL_NONE() ) {
+                   Win32::Daemon::State( $PrevState );
+               }
+           }
+           
+           Win32::Sleep( 1000 );
+       }
+               
+       Win32::Daemon::StopService();
+       exit;
+    }
+    elsif ($ARGV[0] eq '--help') {
+       system("perldoc $0");
+       exit;
+    }
+    elsif ($ARGV[0] ne '--run') {
+       $SIG{__DIE__} = sub { $ProcessObj->Kill(0) if $ProcessObj };
+       $runsvc->();
+       warn "RT FastCGI Handler launched. Press [Enter] to terminate...\n";
+       <STDIN>;
+       exit;
+    }
+}
+
+###############################################################################
+
+warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n";
+
+require CGI::Fast;
+my $h = &RT::Interface::Web::NewCGIHandler();
+
+RT::Init();
+
+# Response loop
+while( my $cgi = CGI::Fast->new ) {
+    my $comp = $ENV{'PATH_INFO'};
+
+    $comp = $1 if ($comp =~ /^(.*)$/);
+    $comp =~ s|^$RT::WebPath\b||i;
+    $comp .= "index.html" if ($comp =~ /\/$/);
+    $comp =~ s/.pl$/.html/g;
+    
+    warn "Serving $comp\n";
+
+    $h->handle_cgi($comp);
+    # _should_ always be tied
+}
+
+1;
+
+=head1 AUTHORS
+
+Autrijus Tang E<lt>autrijus@autrijus.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2002 by Autrijus Tang E<lt>autrijus@autrijus.orgE<gt>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/rt/bin/rt-commit-handler b/rt/bin/rt-commit-handler
new file mode 100644 (file)
index 0000000..29e443e
--- /dev/null
@@ -0,0 +1,846 @@
+#!/usr/bin/perl -w
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+# {{{ Docs
+# -*-Perl-*-
+#
+#ident "@(#)ccvs/contrib:$Name:  $:$Id: rt-commit-handler,v 1.1 2003-07-15 13:16:15 ivan Exp $"
+#
+# Perl filter to handle the log messages from the checkin of files in multiple
+# directories.  This script will group the lists of files by log message, and
+# send one piece of mail per unique message, no matter how many files are
+# committed.
+
+=head1 NAME rt-commit-handler
+
+=head1 USAGE
+
+
+
+=head2 Regular use
+
+Stick the following in in CVSROOT/commitinfo
+
+ ALL     /opt/rt3/bin/rt-commit-handler --record-last-dir
+
+Stick the following  in CVSROOT/loginfo
+
+ ALL     /opt/rt3/bin/rt-commit-handler --cvs-root /pathtocvs/root --rt %{Vvts}
+
+=head2 Invocation (advanced use)
+
+rt-commit-handler --cvs-root /path/to/cvs/root [-d] [-D] [-r] [-M module] \
+                [[-m mailto] ...] [[-R replyto] ...] [-f logfile] 
+
+
+       -d              - turn on debugging
+       -m mailto       - send mail to "mailto" (multiple)
+       -R replyto      - set the "Reply-To:" to "replyto" (multiple)
+       -M modulename   - set module name to "modulename"
+       -f logfile      - write commit messages to logfile too
+       -D              - generate diff commands
+        --rt              - invoke RT commit handler
+        --cvs-root       - specify your CVS root 
+
+        --record-last-dir -  Record the last directory with changes in
+                             pre-commit (commitinfo) mode
+
+
+=cut
+
+# }}}
+
+use strict;
+use Carp;
+use Getopt::Long;
+use Text::Wrap;
+use Digest::MD5;
+use MIME::Entity;
+
+use lib ("/opt/rt3/lib", "/opt/rt3/local/lib");
+
+use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
+
+use vars
+  qw(@MAILER $TMPDIR $FILE_PREFIX $LASTDIR_FILE $HASH_FILE $VERSION_FILE             $MESSAGE_FILE $MAIL_FILE $DEBUG $MAILTO $REPLYTO $id $MODULE_NAME
+  $LOGIN $COMMITLOG $CVS_ROOT $RT_HANDLER);
+
+#Clean out all the nasties from the environment
+CleanEnv();
+
+#Load etc/config.pm and drop privs
+RT::LoadConfig();
+
+#Drop setgid permissions
+RT::DropSetGIDPermissions();
+
+# {{{ Variable setup
+$TMPDIR      = '/tmp';
+$FILE_PREFIX = $TMPDIR . '/#cvs.';
+
+# The root of your CVS install. we should get this from some smarter place.
+# It needs a trailing /
+
+$LASTDIR_FILE = $FILE_PREFIX . "lastdir";
+$HASH_FILE    = $FILE_PREFIX . "hash";
+$VERSION_FILE = $FILE_PREFIX . "version";
+$MESSAGE_FILE = $FILE_PREFIX . "message";
+$MAIL_FILE    = $FILE_PREFIX . "mail";
+
+$DEBUG      = 0;
+$RT_HANDLER = 1;
+
+$MAILTO = '';
+
+my @files = ();
+my (@log_lines);
+my $do_diff = 0;
+my $id      = getpgrp();    # note, you *must* use a shell which does setpgrp()
+$LOGIN = getpwuid($<);
+
+# }}}
+
+die "User could not be found" unless ($LOGIN);
+
+# {{{ parse command line arguments (file list is seen as one arg)
+#
+while ( my $arg = shift @ARGV ) {
+
+    if ( $arg eq '-d' ) {
+        $DEBUG = 1;
+        warn "Debug turned on...\n";
+    }
+    elsif ( $arg =~ /^--record-last-dir$/i ) {
+        record_last_dir( $id, $ARGV[0] );
+        exit(0);
+    }
+    elsif ( $arg eq '-m' ) {
+        $MAILTO .= ", " if $MAILTO;
+        $MAILTO .= shift @ARGV;
+    }
+    elsif ( $arg eq '--rt' ) {
+        $RT_HANDLER = 1;
+    }
+    elsif ( $arg eq '-R' ) {
+        $REPLYTO .= ", " if $REPLYTO;
+        $REPLYTO .= shift @ARGV;
+    }
+    elsif ( $arg eq '-M' ) {
+        die ("too many '-M' args\n") if $MODULE_NAME;
+        $MODULE_NAME = shift @ARGV;
+    }
+    elsif ( $arg eq '--cvs-root' ) {
+        $CVS_ROOT = shift @ARGV;
+        $CVS_ROOT .= "/" unless ( $CVS_ROOT =~ /\/$/ );
+    }
+    elsif ( $arg eq '-f' ) {
+        die ("too many '-f' args\n") if $COMMITLOG;
+        $COMMITLOG = shift @ARGV;
+
+        # This is a disgusting hack to untaint $COMMITLOG if we're running from
+        # setgid cvs.
+        $COMMITLOG = untaint($COMMITLOG);
+    }
+    elsif ( $arg eq '-D' ) {
+        $do_diff = 1;
+    }
+    else {
+        @files = split ( ' ', $arg );
+        last;
+    }
+}
+
+# }}}
+
+$REPLYTO = $LOGIN unless ($REPLYTO);
+
+# for now, the first "file" is the repository directory being committed,
+# relative to the $CVSROOT location
+#
+my $dir = shift @files;
+
+# XXX there are some ugly assumptions in here about module names and
+# XXX directories relative to the $CVSROOT location -- really should
+# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since
+# XXX we have to parse it backwards.
+#
+# XXX For now we set the `module' name to the top-level directory name.
+#
+unless ($MODULE_NAME) {
+    ($MODULE_NAME) = split ( '/', $dir, 2 );
+}
+
+if ($DEBUG) {
+    warn "module - ", $MODULE_NAME, "\n";
+    warn "dir    - ", $dir,         "\n";
+    warn "files  - ", join ( " ", @files ), "\n";
+    warn "id     - ", $id, "\n";
+}
+
+# {{{ Check for a new directory or an import command.
+
+#
+#    files[0] - "-"
+#    files[1] - "New"
+#    files[2] - "directory"
+#
+#    files[0] - "-"
+#    files[1] - "Imported"
+#    files[2] - "sources"
+#
+if ( $files[0] eq "-" ) {
+
+    #we just don't care about  New Directory notes
+    unless ( $files[1] eq "New" && $files[2] eq "directory" ) {
+
+        my @text = ();
+
+        push @text, build_header();
+        push @text, "";
+
+        while ( my $line = <STDIN> ) {
+            chop $line;    # Drop the newline
+            push @text, $line;
+        }
+
+        append_logfile( $COMMITLOG, @text ) if ($COMMITLOG);
+
+        mail_notification( $id, @text );
+    }
+
+    exit 0;
+}
+
+# }}}
+
+# {{{ Collect just the log message from stdin.
+#
+
+while ( my $line = <STDIN> ) {
+    chop $line;    # strip the newline
+    last if ( $line =~ /^Log Message:$/ );
+}
+while ( my $line = <STDIN> ) {
+    chop $line;    # strip the newline
+    $line =~ s/\s+$//;    # strip trailing white space
+    push @log_lines, $line;
+}
+
+my $md5 = Digest::MD5->new();
+foreach my $line (@log_lines) {
+    $md5->add( $line . "\n" );
+}
+my $hash = $md5->hexdigest();
+
+warn "hash = $hash\n" if ($DEBUG);
+
+if ( !-e "$MESSAGE_FILE.$id.$hash" ) {
+    append_logfile( "$HASH_FILE.$id",      $hash );
+    write_file( "$MESSAGE_FILE.$id.$hash", @log_lines );
+}
+
+# }}}
+
+# Spit out the information gathered in this pass.
+
+append_logfile( "$VERSION_FILE.$id.$hash", $dir . '/', @files );
+
+# {{{ Check whether this is the last directory.  If not, quit.
+
+warn "Checking current dir against last dir $LASTDIR_FILE.$id\n" if ($DEBUG);
+
+my @last_dir = read_file("$LASTDIR_FILE.$id");
+
+unless ($CVS_ROOT) {
+    die "No cvs root specified with --cvs-root. Can't continue.";
+}
+
+if ( $last_dir[0] ne $CVS_ROOT . $dir ) {
+    warn "Current directory $CVS_ROOT$dir is not last directory $last_dir[0].\n"
+      if ($DEBUG);
+    exit 0;
+}
+
+# }}}
+
+# {{{ End Of Commits!
+#
+
+# This is it.  The commits are all finished.  Lump everything together
+# into a single message, fire a copy off to the mailing list, and drop
+# it on the end of the Changes file.
+#
+
+#
+# Produce the final compilation of the log messages
+#
+
+my @hashes = read_file("$HASH_FILE.$id");
+my (@text);
+
+push @text, build_header();
+push @text, "";
+
+my ( @added_files, @modified_files, @removed_files );
+
+foreach my $hash (@hashes) {
+
+    # In case we're running setgid, make sure the hash file hasn't been hacked.
+    $hash =~ m/([a-z0-9]*)/ || die "*** Hacking attempt detected\n";
+    $hash = $1;
+
+    my @files     = read_file("$VERSION_FILE.$id.$hash");
+    my @log_lines = read_file("$MESSAGE_FILE.$id.$hash");
+
+    my $working_on_dir;    # gets set as we iterate through the files.
+    foreach my $file (@files) {
+
+        #If we've entered a new directory, make a note of that and remove the trailing /
+
+        if ( $file =~ s'\/$'' ) {
+            $working_on_dir = $file;
+            next;
+        }
+
+        my @file_entry = ( split ( ',', $file, 4 ), $working_on_dir );
+
+        # file_entry looks like ths:
+
+        # 0        1          2      3        4
+        # Old rev : new rev : tag:   file    :directory        
+        my $entry = {};
+        $entry->{'old'}  = $file_entry[0];
+        $entry->{'new'}  = $file_entry[1];
+        $entry->{'tag'}  = $file_entry[2];
+        $entry->{'file'} = $file_entry[3];
+        $entry->{'dir'}  = $file_entry[4];
+
+        if ( $file_entry[0] eq 'NONE' ) {
+            $entry->{'old'} = '0';
+            push @added_files, $entry;
+        }
+        elsif ( $file_entry[1] eq 'NONE' ) {
+            $entry->{'new'} = '0';
+            push @removed_files, $entry;
+        }
+        else {
+            push @modified_files, $entry;
+        }
+    }
+}
+
+# }}}
+
+# {{{ start building up the body
+
+# Strip leading and trailing blank lines from the log message.  Also
+# compress multiple blank lines in the body of the message down to a
+# single blank line.
+#
+
+my $blank = 1;
+@log_lines = map {
+    my $wasblank = $blank;
+    $blank = $_ eq '';
+    $blank && $wasblank ? () : $_;
+} @log_lines;
+
+pop @log_lines if $blank;
+
+@modified_files = order_and_summarize_diffs(@modified_files);
+@added_files    = order_and_summarize_diffs(@added_files);
+@removed_files  = order_and_summarize_diffs(@removed_files);
+
+push @text, "Modified Files:", format_lists(@modified_files)
+  if (@modified_files);
+
+push @text, "Added Files:", format_lists(@added_files) if (@added_files);
+
+push @text, "Removed Files:", format_lists(@removed_files) if (@removed_files);
+
+push @text, "", "Log Message", @log_lines if (@log_lines);
+
+push @text, "";
+
+if ($RT_HANDLER) {
+    rt_handler(
+        @log_lines,                             "\n",
+        loc("To generate a diff of this commit:\n"), "\n",
+        format_diffs( @modified_files, @added_files, @removed_files )
+    );
+}
+
+if ($COMMITLOG) {
+    append_logfile( $COMMITLOG, @text );
+}
+
+if ($do_diff) {
+    push @text, "";
+    push @text, loc("To generate a diff of this commit:");
+    push @text, format_diffs( @modified_files, @added_files, @removed_files );
+    push @text, "";
+}
+
+# }}}
+
+# {{{ Mail out the notification.
+
+mail_notification( $id, @text );
+
+# }}} 
+
+# {{{ clean up
+
+unless ($DEBUG) {
+    $hash = untaint($hash);
+    $id   = untaint($id);
+    unlink "$VERSION_FILE.$id.$hash";
+    unlink "$MESSAGE_FILE.$id.$hash";
+    unlink "$MAIL_FILE.$id";
+    unlink "$LASTDIR_FILE.$id";
+    unlink "$HASH_FILE.$id";
+}
+
+# }}}
+
+exit 0;
+
+# {{{ Subroutines
+#
+
+# {{{ append_logfile
+sub append_logfile {
+    my $filename = shift;
+    my (@lines) = @_;
+
+    $filename = untaint($filename);
+
+    open( FILE, ">>$filename" )
+      || die ("Cannot open file $filename for append.\n");
+    foreach my $line (@lines) {
+        print FILE $line . "\n";
+    }
+    close(FILE);
+}
+
+# }}}
+
+# {{{ write_file
+sub write_file {
+    my $filename = shift;
+    my (@lines) = @_;
+
+    $filename = untaint($filename);
+
+    open( FILE, ">$filename" )
+      || die ("Cannot open file $filename for write.\n");
+    foreach my $line (@lines) {
+        print FILE $line . "\n";
+    }
+    close(FILE);
+}
+
+# }}}
+
+# {{{ read_file
+sub read_file {
+    my $filename = shift;
+    my (@lines);
+
+    open( FILE, "<$filename" )
+      || die ("Cannot open file $filename for read.\n");
+    while ( my $line = <FILE> ) {
+        chop $line;
+        push @lines, $line;
+    }
+    close(FILE);
+
+    return (@lines);
+}
+
+# }}}
+
+# {{{ sub format_lists
+
+sub format_lists {
+    my @items = (@_);
+
+    my $files = "";
+    map {
+        $_->{'files'} && ( $files .= ' ' . join ( ' ', @{ $_->{'files'} } ) );
+    } @items;
+
+    my @lines = wrap( "\t", "\t\t", $files );
+    return (@lines);
+
+}
+
+# }}}
+
+# {{{ sub format_diffs
+
+sub format_diffs {
+    my @items = (@_);
+
+    my @lines;
+    foreach my $item (@items) {
+        next unless ( $item->{'files'} );
+        push ( @lines,
+            "cvs diff -r"
+              . $item->{'old'} . " -r"
+              . $item->{'new'} . " "
+              . join ( " ", @{ $item->{'files'} } ) . "\n" );
+
+    }
+
+    @lines = fill( "\t", "\t\t", @lines );
+
+    return (@lines);
+}
+
+# }}}
+
+# {{{ sub order_and_summarize_diffs {
+
+# takes an array of file items
+# returns a sorted array of fileset items, which are like file items, except they can have an array of files, rather than 
+# a singleton file.
+
+sub order_and_summarize_diffs {
+
+    my @files = (@_);
+
+    # Sort by tag, dir, file.
+    @files = sort {
+        $a->{'tag'} cmp $b->{'tag'}
+          || $a->{'dir'} cmp $b->{'dir'}
+          || $a->{'file'} cmp $b->{'file'};
+    } @files;
+
+    # Combine adjacent rows that are the same modulo the file name.
+
+    my @items = (undef);
+
+    foreach my $file (@files) {
+        if ( $#items == -1    #if it's empty
+            || ( !defined $items[-1]->{'old'}
+                || $items[-1]->{'old'} ne $file->{'old'} )
+            || ( !defined $items[-1]->{'new'}
+                || $items[-1]->{'new'} ne $file->{'new'} )
+            || ( !defined $items[-1]->{'tag'}
+                || $items[-1]->{'tag'} ne $file->{'tag'} ) )
+        {
+
+            push ( @items, $file );
+        }
+        push ( @{ $items[-1]->{'files'} },
+            $file->{'dir'} . "/" . $file->{'file'} );
+    }
+
+    return (@items);
+}
+
+# }}}
+
+# {{{ build_header
+
+sub build_header {
+    my $now    = gmtime;
+    my $header =
+      sprintf( "Module Name:\t%s\nCommitted By:\t%s\nDate:\t\t%s %s %s",
+        $MODULE_NAME, $LOGIN, substr( $now, 0, 19 ), "UTC",
+        substr( $now, 20, 4 ) );
+    return ($header);
+}
+
+# }}}
+
+# {{{ mail_notification
+sub mail_notification {
+    my $id = shift;
+    my (@text) = @_;
+    write_file( "$MAIL_FILE.$id", "From: " . $LOGIN,
+        "Subject: CVS commit: " . $MODULE_NAME, "To: " . $MAILTO,
+        "Reply-To: " . $REPLYTO,                "", "", @text );
+
+    my $entity = MIME::Entity->build(
+        From       => $LOGIN,
+        To         => $MAILTO,
+        Subject    => "CVS commit: " . $MODULE_NAME,
+        'Reply-To' => $REPLYTO,
+        Data       => join ( "\n", @text )
+    );
+    if ( $RT::MailCommand eq 'sendmailpipe' ) {
+        open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" )
+          || die "Couldn't send mail: " . $@ . "\n";
+        print MAIL $entity->as_string;
+        close(MAIL);
+    }
+    else {
+        $entity->send( $RT::MailCommand, $RT::MailParams );
+    }
+
+}
+
+# }}}
+
+# {{{ sub record_last_dir
+
+sub record_last_dir {
+    my $id  = shift;
+    my $dir = shift;
+
+    # make a note of this directory. later, we'll use this to 
+    # figure out if we've gone through the whole commit,
+    # for something that is a bad mockery of attomic commits.
+
+    warn "about to write $dir to $LASTDIR_FILE.$id" if ($DEBUG);
+
+    write_file( "$LASTDIR_FILE.$id", $dir );
+}
+
+# }}}
+
+# {{{ Get the RT stuff set up
+
+# {{{ sub rt_handler 
+
+sub rt_handler {
+    my (@LogMessage) = (@_);
+
+    #Connect to the database and get RT::SystemUser and RT::Nobody loaded
+    RT::Init;
+
+    require RT::Ticket;
+
+    #Get the current user all loaded
+    my $CurrentUser = GetCurrentUser();
+
+    if ( !$CurrentUser->Id ) {
+        print
+loc("No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\n");
+        return;
+    }
+
+    my (@commands) = find_commands( \@LogMessage );
+
+    my ( @tickets, @errors );
+
+    # Get the list of tickets we're working with out of commands
+    grep { $_ =~ /^RT-Ticket:\s*(.*?)$/i && push ( @tickets, $1 ) } @commands;
+
+    my $message = new MIME::Entity;
+    $message->build(
+        From    => $CurrentUser->EmailAddress,
+        Subject => 'CVS Commit',
+        Data    => \@LogMessage
+    );
+
+    # {{{ comment or correspond, as needed
+
+    foreach my $ticket (@tickets) {
+        my $TicketObj = RT::Ticket->new($CurrentUser);
+        $TicketObj->Load($ticket);
+        my ( $id, $msg );
+        unless ( $TicketObj->Id ) {
+            push ( @errors,
+"Couldn't load ticket #$ticket. Not adding commit log to ticket history.\n"
+            );
+        }
+
+        if ( $LogMessage[0] =~ /^(comment|private)$/ ) {
+            ( $id, $msg ) = $TicketObj->Comment( MIMEObj => $message );
+
+        }
+        else {
+            ( $id, $msg ) = $TicketObj->Correspond( MIMEObj => $message );
+        }
+
+        push ( @errors, ">> Log message",
+            "Ticket #" . $TicketObj->Id . ": " . $msg );
+
+    }
+
+    # }}}
+
+    my ($reply) = ActOnPseudoHeaders( $CurrentUser, @commands );
+    print "$reply\n" if ($reply);
+    print join ( "\n", @errors );
+    print "\n";
+
+}
+
+# }}}
+
+# {{{ sub find_commands
+
+sub find_commands {
+    my $lines = shift;
+    my (@pseudoheaders);
+
+    while ( my $line = shift @{$lines} ) {
+        next if $line =~ /^\s*?$/;
+        if ( $line =~ /^RT-/i ) {
+
+            push ( @pseudoheaders, $line );
+        }
+
+        #If we find a line that's not a command, get out.
+        else {
+            unshift ( @{$lines}, $line );
+            last;
+        }
+    }
+
+    return (@pseudoheaders);
+
+}
+
+# }}}
+
+# {{{ sub ActOnPseudoHeaders
+
+=item ActOnPseudoHeaders $PseudoHeaders
+
+Takes a string of pseudo-headers, iterates through them and does what they tell it to.
+
+=cut
+
+sub ActOnPseudoHeaders {
+    my $CurrentUser = shift;
+    my (@actions) = (@_);
+
+    my $ResultsMessage = '';
+    my $Ticket         = RT::Ticket->new($CurrentUser);
+
+    foreach my $action (@actions) {
+        my ($val);
+        my $msg = '';
+
+        $ResultsMessage .= ">>> $action\n";
+
+        if ( $action =~ /^RT-(.*?):\s*(.*)$/i ) {
+            my $command = $1;
+            my $args    = $2;
+
+            if ( $command =~ /^ticket$/i ) {
+
+                $val = $Ticket->Load($args);
+                unless ($val) {
+                    $ResultsMessage .=
+                      loc("ERROR: Couldn't load ticket '[_1]': [_2].\n", $1, $msg);
+                      . loc("Aborting to avoid unintended ticket modifications.\n")
+                      . loc("The following commands were not proccessed:\n\n")
+                      . join ( "\n", @actions );
+                    return ($ResultsMessage);
+                }
+                $ResultsMessage .= loc("Ticket [_1] loaded\n", $Ticket->Id);
+            }
+            else {
+                unless ( $Ticket->Id ) {
+                    $ResultsMessage .= loc("No Ticket specified. Aborting ticket ")
+                      . loc("modifications\n\n")
+                      . loc("The following commands were not proccessed:\n\n")
+                      . join ( "\n", @actions );
+                    return ($ResultsMessage);
+                }
+
+                # Deal with the basics
+                if ( $command =~ /^(Subject|Owner|Status|Queue)$/i ) {
+                    my $method = 'Set' . ucfirst( lc($1) );
+                    ( $val, $msg ) = $Ticket->$method($args);
+                }
+
+                # Deal with the dates
+                elsif ( $command =~ /^(due|starts|started|resolved)$/i ) {
+                    my $method = 'Set' . ucfirst( lc($1) );
+                    my $date   = new RT::Date($CurrentUser);
+                    $date->Set( Format => 'unknown', Value => $args );
+                    ( $val, $msg ) = $Ticket->$method( $date->ISO );
+                }
+
+                # Deal with the watchers
+                elsif ( $command =~ /^(requestor|requestors|cc|admincc)$/i ) {
+                    my $operator = "+";
+                    my ($type);
+                    if ( $args =~ /^(\+|\-)(.*)$/ ) {
+                        $operator = $1;
+                        $args     = $2;
+                    }
+                    $type = 'Requestor' if ( $command =~ /^requestor/i );
+                    $type = 'Cc'        if ( $command =~ /^cc/i );
+                    $type = 'AdminCc'   if ( $command =~ /^admincc/i );
+
+                       my $user = RT::User->new($CurrentUser);
+                    $user->Load($args);
+
+                    if ($operator eq '+') {
+                        ($val, $msg) = $Ticket->AddWatcher( Type => $type,
+                                                            PrincipalId => $user->PrincipalId);
+                    } elsif ($operator eq '-') {
+                        ($val, $msg) = $Ticket->DeleteWatcher( Type => $type,
+                                                               PrincipalId => $user->PrincipalId);
+                    }
+
+            }
+            $ResultsMessage .= $msg . "\n";
+        }
+
+    }
+    return ($ResultsMessage);
+
+}
+
+# }}}
+
+# {{{ sub untaint 
+sub untaint {
+    my $val = shift;
+
+    if ( $val =~ /^([-\#\/\w.]+)$/ ) {
+        $val = $1;    # $data now untainted
+    }
+    else {
+        die loc("Bad data in [_1]", $val);    # log this somewhere
+    }
+    return ($val);
+}
+
+# }}}
+
+=head1 AUTHOR
+
+
+
+  rt-commit-handler is a rewritten version of the NetBSD commit handler,
+  which was placed in the public domain by Charles Hannum. It bore the following
+  authors statement:
+
+ Contributed by David Hampton <hampton@cisco.com>
+ Hacked greatly by Greg A. Woods <woods@planix.com>
+ Rewritten by Charles M. Hannum <mycroft@netbsd.org>
+
+=cut
+
diff --git a/rt/bin/rt-commit-handler.in b/rt/bin/rt-commit-handler.in
new file mode 100644 (file)
index 0000000..02b01ab
--- /dev/null
@@ -0,0 +1,846 @@
+#!@PERL@ -w
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+# {{{ Docs
+# -*-Perl-*-
+#
+#ident "@(#)ccvs/contrib:$Name:  $:$Id: rt-commit-handler.in,v 1.1 2003-07-15 13:16:15 ivan Exp $"
+#
+# Perl filter to handle the log messages from the checkin of files in multiple
+# directories.  This script will group the lists of files by log message, and
+# send one piece of mail per unique message, no matter how many files are
+# committed.
+
+=head1 NAME rt-commit-handler
+
+=head1 USAGE
+
+
+
+=head2 Regular use
+
+Stick the following in in CVSROOT/commitinfo
+
+ ALL     @RT_BIN_PATH@/rt-commit-handler --record-last-dir
+
+Stick the following  in CVSROOT/loginfo
+
+ ALL     @RT_BIN_PATH@/rt-commit-handler --cvs-root /pathtocvs/root --rt %{Vvts}
+
+=head2 Invocation (advanced use)
+
+rt-commit-handler --cvs-root /path/to/cvs/root [-d] [-D] [-r] [-M module] \
+                [[-m mailto] ...] [[-R replyto] ...] [-f logfile] 
+
+
+       -d              - turn on debugging
+       -m mailto       - send mail to "mailto" (multiple)
+       -R replyto      - set the "Reply-To:" to "replyto" (multiple)
+       -M modulename   - set module name to "modulename"
+       -f logfile      - write commit messages to logfile too
+       -D              - generate diff commands
+        --rt              - invoke RT commit handler
+        --cvs-root       - specify your CVS root 
+
+        --record-last-dir -  Record the last directory with changes in
+                             pre-commit (commitinfo) mode
+
+
+=cut
+
+# }}}
+
+use strict;
+use Carp;
+use Getopt::Long;
+use Text::Wrap;
+use Digest::MD5;
+use MIME::Entity;
+
+use lib ("@RT_LIB_PATH@", "@LOCAL_LIB_PATH@");
+
+use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
+
+use vars
+  qw(@MAILER $TMPDIR $FILE_PREFIX $LASTDIR_FILE $HASH_FILE $VERSION_FILE             $MESSAGE_FILE $MAIL_FILE $DEBUG $MAILTO $REPLYTO $id $MODULE_NAME
+  $LOGIN $COMMITLOG $CVS_ROOT $RT_HANDLER);
+
+#Clean out all the nasties from the environment
+CleanEnv();
+
+#Load etc/config.pm and drop privs
+RT::LoadConfig();
+
+#Drop setgid permissions
+RT::DropSetGIDPermissions();
+
+# {{{ Variable setup
+$TMPDIR      = '/tmp';
+$FILE_PREFIX = $TMPDIR . '/#cvs.';
+
+# The root of your CVS install. we should get this from some smarter place.
+# It needs a trailing /
+
+$LASTDIR_FILE = $FILE_PREFIX . "lastdir";
+$HASH_FILE    = $FILE_PREFIX . "hash";
+$VERSION_FILE = $FILE_PREFIX . "version";
+$MESSAGE_FILE = $FILE_PREFIX . "message";
+$MAIL_FILE    = $FILE_PREFIX . "mail";
+
+$DEBUG      = 0;
+$RT_HANDLER = 1;
+
+$MAILTO = '';
+
+my @files = ();
+my (@log_lines);
+my $do_diff = 0;
+my $id      = getpgrp();    # note, you *must* use a shell which does setpgrp()
+$LOGIN = getpwuid($<);
+
+# }}}
+
+die "User could not be found" unless ($LOGIN);
+
+# {{{ parse command line arguments (file list is seen as one arg)
+#
+while ( my $arg = shift @ARGV ) {
+
+    if ( $arg eq '-d' ) {
+        $DEBUG = 1;
+        warn "Debug turned on...\n";
+    }
+    elsif ( $arg =~ /^--record-last-dir$/i ) {
+        record_last_dir( $id, $ARGV[0] );
+        exit(0);
+    }
+    elsif ( $arg eq '-m' ) {
+        $MAILTO .= ", " if $MAILTO;
+        $MAILTO .= shift @ARGV;
+    }
+    elsif ( $arg eq '--rt' ) {
+        $RT_HANDLER = 1;
+    }
+    elsif ( $arg eq '-R' ) {
+        $REPLYTO .= ", " if $REPLYTO;
+        $REPLYTO .= shift @ARGV;
+    }
+    elsif ( $arg eq '-M' ) {
+        die ("too many '-M' args\n") if $MODULE_NAME;
+        $MODULE_NAME = shift @ARGV;
+    }
+    elsif ( $arg eq '--cvs-root' ) {
+        $CVS_ROOT = shift @ARGV;
+        $CVS_ROOT .= "/" unless ( $CVS_ROOT =~ /\/$/ );
+    }
+    elsif ( $arg eq '-f' ) {
+        die ("too many '-f' args\n") if $COMMITLOG;
+        $COMMITLOG = shift @ARGV;
+
+        # This is a disgusting hack to untaint $COMMITLOG if we're running from
+        # setgid cvs.
+        $COMMITLOG = untaint($COMMITLOG);
+    }
+    elsif ( $arg eq '-D' ) {
+        $do_diff = 1;
+    }
+    else {
+        @files = split ( ' ', $arg );
+        last;
+    }
+}
+
+# }}}
+
+$REPLYTO = $LOGIN unless ($REPLYTO);
+
+# for now, the first "file" is the repository directory being committed,
+# relative to the $CVSROOT location
+#
+my $dir = shift @files;
+
+# XXX there are some ugly assumptions in here about module names and
+# XXX directories relative to the $CVSROOT location -- really should
+# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since
+# XXX we have to parse it backwards.
+#
+# XXX For now we set the `module' name to the top-level directory name.
+#
+unless ($MODULE_NAME) {
+    ($MODULE_NAME) = split ( '/', $dir, 2 );
+}
+
+if ($DEBUG) {
+    warn "module - ", $MODULE_NAME, "\n";
+    warn "dir    - ", $dir,         "\n";
+    warn "files  - ", join ( " ", @files ), "\n";
+    warn "id     - ", $id, "\n";
+}
+
+# {{{ Check for a new directory or an import command.
+
+#
+#    files[0] - "-"
+#    files[1] - "New"
+#    files[2] - "directory"
+#
+#    files[0] - "-"
+#    files[1] - "Imported"
+#    files[2] - "sources"
+#
+if ( $files[0] eq "-" ) {
+
+    #we just don't care about  New Directory notes
+    unless ( $files[1] eq "New" && $files[2] eq "directory" ) {
+
+        my @text = ();
+
+        push @text, build_header();
+        push @text, "";
+
+        while ( my $line = <STDIN> ) {
+            chop $line;    # Drop the newline
+            push @text, $line;
+        }
+
+        append_logfile( $COMMITLOG, @text ) if ($COMMITLOG);
+
+        mail_notification( $id, @text );
+    }
+
+    exit 0;
+}
+
+# }}}
+
+# {{{ Collect just the log message from stdin.
+#
+
+while ( my $line = <STDIN> ) {
+    chop $line;    # strip the newline
+    last if ( $line =~ /^Log Message:$/ );
+}
+while ( my $line = <STDIN> ) {
+    chop $line;    # strip the newline
+    $line =~ s/\s+$//;    # strip trailing white space
+    push @log_lines, $line;
+}
+
+my $md5 = Digest::MD5->new();
+foreach my $line (@log_lines) {
+    $md5->add( $line . "\n" );
+}
+my $hash = $md5->hexdigest();
+
+warn "hash = $hash\n" if ($DEBUG);
+
+if ( !-e "$MESSAGE_FILE.$id.$hash" ) {
+    append_logfile( "$HASH_FILE.$id",      $hash );
+    write_file( "$MESSAGE_FILE.$id.$hash", @log_lines );
+}
+
+# }}}
+
+# Spit out the information gathered in this pass.
+
+append_logfile( "$VERSION_FILE.$id.$hash", $dir . '/', @files );
+
+# {{{ Check whether this is the last directory.  If not, quit.
+
+warn "Checking current dir against last dir $LASTDIR_FILE.$id\n" if ($DEBUG);
+
+my @last_dir = read_file("$LASTDIR_FILE.$id");
+
+unless ($CVS_ROOT) {
+    die "No cvs root specified with --cvs-root. Can't continue.";
+}
+
+if ( $last_dir[0] ne $CVS_ROOT . $dir ) {
+    warn "Current directory $CVS_ROOT$dir is not last directory $last_dir[0].\n"
+      if ($DEBUG);
+    exit 0;
+}
+
+# }}}
+
+# {{{ End Of Commits!
+#
+
+# This is it.  The commits are all finished.  Lump everything together
+# into a single message, fire a copy off to the mailing list, and drop
+# it on the end of the Changes file.
+#
+
+#
+# Produce the final compilation of the log messages
+#
+
+my @hashes = read_file("$HASH_FILE.$id");
+my (@text);
+
+push @text, build_header();
+push @text, "";
+
+my ( @added_files, @modified_files, @removed_files );
+
+foreach my $hash (@hashes) {
+
+    # In case we're running setgid, make sure the hash file hasn't been hacked.
+    $hash =~ m/([a-z0-9]*)/ || die "*** Hacking attempt detected\n";
+    $hash = $1;
+
+    my @files     = read_file("$VERSION_FILE.$id.$hash");
+    my @log_lines = read_file("$MESSAGE_FILE.$id.$hash");
+
+    my $working_on_dir;    # gets set as we iterate through the files.
+    foreach my $file (@files) {
+
+        #If we've entered a new directory, make a note of that and remove the trailing /
+
+        if ( $file =~ s'\/$'' ) {
+            $working_on_dir = $file;
+            next;
+        }
+
+        my @file_entry = ( split ( ',', $file, 4 ), $working_on_dir );
+
+        # file_entry looks like ths:
+
+        # 0        1          2      3        4
+        # Old rev : new rev : tag:   file    :directory        
+        my $entry = {};
+        $entry->{'old'}  = $file_entry[0];
+        $entry->{'new'}  = $file_entry[1];
+        $entry->{'tag'}  = $file_entry[2];
+        $entry->{'file'} = $file_entry[3];
+        $entry->{'dir'}  = $file_entry[4];
+
+        if ( $file_entry[0] eq 'NONE' ) {
+            $entry->{'old'} = '0';
+            push @added_files, $entry;
+        }
+        elsif ( $file_entry[1] eq 'NONE' ) {
+            $entry->{'new'} = '0';
+            push @removed_files, $entry;
+        }
+        else {
+            push @modified_files, $entry;
+        }
+    }
+}
+
+# }}}
+
+# {{{ start building up the body
+
+# Strip leading and trailing blank lines from the log message.  Also
+# compress multiple blank lines in the body of the message down to a
+# single blank line.
+#
+
+my $blank = 1;
+@log_lines = map {
+    my $wasblank = $blank;
+    $blank = $_ eq '';
+    $blank && $wasblank ? () : $_;
+} @log_lines;
+
+pop @log_lines if $blank;
+
+@modified_files = order_and_summarize_diffs(@modified_files);
+@added_files    = order_and_summarize_diffs(@added_files);
+@removed_files  = order_and_summarize_diffs(@removed_files);
+
+push @text, "Modified Files:", format_lists(@modified_files)
+  if (@modified_files);
+
+push @text, "Added Files:", format_lists(@added_files) if (@added_files);
+
+push @text, "Removed Files:", format_lists(@removed_files) if (@removed_files);
+
+push @text, "", "Log Message", @log_lines if (@log_lines);
+
+push @text, "";
+
+if ($RT_HANDLER) {
+    rt_handler(
+        @log_lines,                             "\n",
+        loc("To generate a diff of this commit:\n"), "\n",
+        format_diffs( @modified_files, @added_files, @removed_files )
+    );
+}
+
+if ($COMMITLOG) {
+    append_logfile( $COMMITLOG, @text );
+}
+
+if ($do_diff) {
+    push @text, "";
+    push @text, loc("To generate a diff of this commit:");
+    push @text, format_diffs( @modified_files, @added_files, @removed_files );
+    push @text, "";
+}
+
+# }}}
+
+# {{{ Mail out the notification.
+
+mail_notification( $id, @text );
+
+# }}} 
+
+# {{{ clean up
+
+unless ($DEBUG) {
+    $hash = untaint($hash);
+    $id   = untaint($id);
+    unlink "$VERSION_FILE.$id.$hash";
+    unlink "$MESSAGE_FILE.$id.$hash";
+    unlink "$MAIL_FILE.$id";
+    unlink "$LASTDIR_FILE.$id";
+    unlink "$HASH_FILE.$id";
+}
+
+# }}}
+
+exit 0;
+
+# {{{ Subroutines
+#
+
+# {{{ append_logfile
+sub append_logfile {
+    my $filename = shift;
+    my (@lines) = @_;
+
+    $filename = untaint($filename);
+
+    open( FILE, ">>$filename" )
+      || die ("Cannot open file $filename for append.\n");
+    foreach my $line (@lines) {
+        print FILE $line . "\n";
+    }
+    close(FILE);
+}
+
+# }}}
+
+# {{{ write_file
+sub write_file {
+    my $filename = shift;
+    my (@lines) = @_;
+
+    $filename = untaint($filename);
+
+    open( FILE, ">$filename" )
+      || die ("Cannot open file $filename for write.\n");
+    foreach my $line (@lines) {
+        print FILE $line . "\n";
+    }
+    close(FILE);
+}
+
+# }}}
+
+# {{{ read_file
+sub read_file {
+    my $filename = shift;
+    my (@lines);
+
+    open( FILE, "<$filename" )
+      || die ("Cannot open file $filename for read.\n");
+    while ( my $line = <FILE> ) {
+        chop $line;
+        push @lines, $line;
+    }
+    close(FILE);
+
+    return (@lines);
+}
+
+# }}}
+
+# {{{ sub format_lists
+
+sub format_lists {
+    my @items = (@_);
+
+    my $files = "";
+    map {
+        $_->{'files'} && ( $files .= ' ' . join ( ' ', @{ $_->{'files'} } ) );
+    } @items;
+
+    my @lines = wrap( "\t", "\t\t", $files );
+    return (@lines);
+
+}
+
+# }}}
+
+# {{{ sub format_diffs
+
+sub format_diffs {
+    my @items = (@_);
+
+    my @lines;
+    foreach my $item (@items) {
+        next unless ( $item->{'files'} );
+        push ( @lines,
+            "cvs diff -r"
+              . $item->{'old'} . " -r"
+              . $item->{'new'} . " "
+              . join ( " ", @{ $item->{'files'} } ) . "\n" );
+
+    }
+
+    @lines = fill( "\t", "\t\t", @lines );
+
+    return (@lines);
+}
+
+# }}}
+
+# {{{ sub order_and_summarize_diffs {
+
+# takes an array of file items
+# returns a sorted array of fileset items, which are like file items, except they can have an array of files, rather than 
+# a singleton file.
+
+sub order_and_summarize_diffs {
+
+    my @files = (@_);
+
+    # Sort by tag, dir, file.
+    @files = sort {
+        $a->{'tag'} cmp $b->{'tag'}
+          || $a->{'dir'} cmp $b->{'dir'}
+          || $a->{'file'} cmp $b->{'file'};
+    } @files;
+
+    # Combine adjacent rows that are the same modulo the file name.
+
+    my @items = (undef);
+
+    foreach my $file (@files) {
+        if ( $#items == -1    #if it's empty
+            || ( !defined $items[-1]->{'old'}
+                || $items[-1]->{'old'} ne $file->{'old'} )
+            || ( !defined $items[-1]->{'new'}
+                || $items[-1]->{'new'} ne $file->{'new'} )
+            || ( !defined $items[-1]->{'tag'}
+                || $items[-1]->{'tag'} ne $file->{'tag'} ) )
+        {
+
+            push ( @items, $file );
+        }
+        push ( @{ $items[-1]->{'files'} },
+            $file->{'dir'} . "/" . $file->{'file'} );
+    }
+
+    return (@items);
+}
+
+# }}}
+
+# {{{ build_header
+
+sub build_header {
+    my $now    = gmtime;
+    my $header =
+      sprintf( "Module Name:\t%s\nCommitted By:\t%s\nDate:\t\t%s %s %s",
+        $MODULE_NAME, $LOGIN, substr( $now, 0, 19 ), "UTC",
+        substr( $now, 20, 4 ) );
+    return ($header);
+}
+
+# }}}
+
+# {{{ mail_notification
+sub mail_notification {
+    my $id = shift;
+    my (@text) = @_;
+    write_file( "$MAIL_FILE.$id", "From: " . $LOGIN,
+        "Subject: CVS commit: " . $MODULE_NAME, "To: " . $MAILTO,
+        "Reply-To: " . $REPLYTO,                "", "", @text );
+
+    my $entity = MIME::Entity->build(
+        From       => $LOGIN,
+        To         => $MAILTO,
+        Subject    => "CVS commit: " . $MODULE_NAME,
+        'Reply-To' => $REPLYTO,
+        Data       => join ( "\n", @text )
+    );
+    if ( $RT::MailCommand eq 'sendmailpipe' ) {
+        open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" )
+          || die "Couldn't send mail: " . $@ . "\n";
+        print MAIL $entity->as_string;
+        close(MAIL);
+    }
+    else {
+        $entity->send( $RT::MailCommand, $RT::MailParams );
+    }
+
+}
+
+# }}}
+
+# {{{ sub record_last_dir
+
+sub record_last_dir {
+    my $id  = shift;
+    my $dir = shift;
+
+    # make a note of this directory. later, we'll use this to 
+    # figure out if we've gone through the whole commit,
+    # for something that is a bad mockery of attomic commits.
+
+    warn "about to write $dir to $LASTDIR_FILE.$id" if ($DEBUG);
+
+    write_file( "$LASTDIR_FILE.$id", $dir );
+}
+
+# }}}
+
+# {{{ Get the RT stuff set up
+
+# {{{ sub rt_handler 
+
+sub rt_handler {
+    my (@LogMessage) = (@_);
+
+    #Connect to the database and get RT::SystemUser and RT::Nobody loaded
+    RT::Init;
+
+    require RT::Ticket;
+
+    #Get the current user all loaded
+    my $CurrentUser = GetCurrentUser();
+
+    if ( !$CurrentUser->Id ) {
+        print
+loc("No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\n");
+        return;
+    }
+
+    my (@commands) = find_commands( \@LogMessage );
+
+    my ( @tickets, @errors );
+
+    # Get the list of tickets we're working with out of commands
+    grep { $_ =~ /^RT-Ticket:\s*(.*?)$/i && push ( @tickets, $1 ) } @commands;
+
+    my $message = new MIME::Entity;
+    $message->build(
+        From    => $CurrentUser->EmailAddress,
+        Subject => 'CVS Commit',
+        Data    => \@LogMessage
+    );
+
+    # {{{ comment or correspond, as needed
+
+    foreach my $ticket (@tickets) {
+        my $TicketObj = RT::Ticket->new($CurrentUser);
+        $TicketObj->Load($ticket);
+        my ( $id, $msg );
+        unless ( $TicketObj->Id ) {
+            push ( @errors,
+"Couldn't load ticket #$ticket. Not adding commit log to ticket history.\n"
+            );
+        }
+
+        if ( $LogMessage[0] =~ /^(comment|private)$/ ) {
+            ( $id, $msg ) = $TicketObj->Comment( MIMEObj => $message );
+
+        }
+        else {
+            ( $id, $msg ) = $TicketObj->Correspond( MIMEObj => $message );
+        }
+
+        push ( @errors, ">> Log message",
+            "Ticket #" . $TicketObj->Id . ": " . $msg );
+
+    }
+
+    # }}}
+
+    my ($reply) = ActOnPseudoHeaders( $CurrentUser, @commands );
+    print "$reply\n" if ($reply);
+    print join ( "\n", @errors );
+    print "\n";
+
+}
+
+# }}}
+
+# {{{ sub find_commands
+
+sub find_commands {
+    my $lines = shift;
+    my (@pseudoheaders);
+
+    while ( my $line = shift @{$lines} ) {
+        next if $line =~ /^\s*?$/;
+        if ( $line =~ /^RT-/i ) {
+
+            push ( @pseudoheaders, $line );
+        }
+
+        #If we find a line that's not a command, get out.
+        else {
+            unshift ( @{$lines}, $line );
+            last;
+        }
+    }
+
+    return (@pseudoheaders);
+
+}
+
+# }}}
+
+# {{{ sub ActOnPseudoHeaders
+
+=item ActOnPseudoHeaders $PseudoHeaders
+
+Takes a string of pseudo-headers, iterates through them and does what they tell it to.
+
+=cut
+
+sub ActOnPseudoHeaders {
+    my $CurrentUser = shift;
+    my (@actions) = (@_);
+
+    my $ResultsMessage = '';
+    my $Ticket         = RT::Ticket->new($CurrentUser);
+
+    foreach my $action (@actions) {
+        my ($val);
+        my $msg = '';
+
+        $ResultsMessage .= ">>> $action\n";
+
+        if ( $action =~ /^RT-(.*?):\s*(.*)$/i ) {
+            my $command = $1;
+            my $args    = $2;
+
+            if ( $command =~ /^ticket$/i ) {
+
+                $val = $Ticket->Load($args);
+                unless ($val) {
+                    $ResultsMessage .=
+                      loc("ERROR: Couldn't load ticket '[_1]': [_2].\n", $1, $msg);
+                      . loc("Aborting to avoid unintended ticket modifications.\n")
+                      . loc("The following commands were not proccessed:\n\n")
+                      . join ( "\n", @actions );
+                    return ($ResultsMessage);
+                }
+                $ResultsMessage .= loc("Ticket [_1] loaded\n", $Ticket->Id);
+            }
+            else {
+                unless ( $Ticket->Id ) {
+                    $ResultsMessage .= loc("No Ticket specified. Aborting ticket ")
+                      . loc("modifications\n\n")
+                      . loc("The following commands were not proccessed:\n\n")
+                      . join ( "\n", @actions );
+                    return ($ResultsMessage);
+                }
+
+                # Deal with the basics
+                if ( $command =~ /^(Subject|Owner|Status|Queue)$/i ) {
+                    my $method = 'Set' . ucfirst( lc($1) );
+                    ( $val, $msg ) = $Ticket->$method($args);
+                }
+
+                # Deal with the dates
+                elsif ( $command =~ /^(due|starts|started|resolved)$/i ) {
+                    my $method = 'Set' . ucfirst( lc($1) );
+                    my $date   = new RT::Date($CurrentUser);
+                    $date->Set( Format => 'unknown', Value => $args );
+                    ( $val, $msg ) = $Ticket->$method( $date->ISO );
+                }
+
+                # Deal with the watchers
+                elsif ( $command =~ /^(requestor|requestors|cc|admincc)$/i ) {
+                    my $operator = "+";
+                    my ($type);
+                    if ( $args =~ /^(\+|\-)(.*)$/ ) {
+                        $operator = $1;
+                        $args     = $2;
+                    }
+                    $type = 'Requestor' if ( $command =~ /^requestor/i );
+                    $type = 'Cc'        if ( $command =~ /^cc/i );
+                    $type = 'AdminCc'   if ( $command =~ /^admincc/i );
+
+                       my $user = RT::User->new($CurrentUser);
+                    $user->Load($args);
+
+                    if ($operator eq '+') {
+                        ($val, $msg) = $Ticket->AddWatcher( Type => $type,
+                                                            PrincipalId => $user->PrincipalId);
+                    } elsif ($operator eq '-') {
+                        ($val, $msg) = $Ticket->DeleteWatcher( Type => $type,
+                                                               PrincipalId => $user->PrincipalId);
+                    }
+
+            }
+            $ResultsMessage .= $msg . "\n";
+        }
+
+    }
+    return ($ResultsMessage);
+
+}
+
+# }}}
+
+# {{{ sub untaint 
+sub untaint {
+    my $val = shift;
+
+    if ( $val =~ /^([-\#\/\w.]+)$/ ) {
+        $val = $1;    # $data now untainted
+    }
+    else {
+        die loc("Bad data in [_1]", $val);    # log this somewhere
+    }
+    return ($val);
+}
+
+# }}}
+
+=head1 AUTHOR
+
+
+
+  rt-commit-handler is a rewritten version of the NetBSD commit handler,
+  which was placed in the public domain by Charles Hannum. It bore the following
+  authors statement:
+
+ Contributed by David Hampton <hampton@cisco.com>
+ Hacked greatly by Greg A. Woods <woods@planix.com>
+ Rewritten by Charles M. Hannum <mycroft@netbsd.org>
+
+=cut
+
diff --git a/rt/bin/rt-crontool b/rt/bin/rt-crontool
new file mode 100644 (file)
index 0000000..ede874a
--- /dev/null
@@ -0,0 +1,210 @@
+#!/usr/bin/perl
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 lib ("/opt/rt3/lib", "/opt/rt3/local/lib");
+
+package RT;
+
+use Getopt::Long;
+
+use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
+use RT::Tickets;
+use RT::Template;
+
+#Clean out all the nasties from the environment
+CleanEnv();
+
+# Load the config file
+RT::LoadConfig();
+
+#Connect to the database and get RT::SystemUser and RT::Nobody loaded
+RT::Init();
+
+#Drop setgid permissions
+RT::DropSetGIDPermissions();
+
+#Get the current user all loaded
+my $CurrentUser = GetCurrentUser();
+
+unless ( $CurrentUser->Id ) {
+    print loc("No RT user found. Please consult your RT administrator.\n");
+    exit(1);
+}
+
+my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg,
+     $template_id, $help, $verbose );
+GetOptions( "search=s"        => \$search,
+            "search-arg=s"    => \$search_arg,
+            "condition=s"     => \$condition,
+            "condition-arg=s" => \$condition_arg,
+            "action-arg=s"    => \$action_arg,
+            "action=s"        => \$action,
+           "template-id=s"   => \$template_id,
+            "help"            => \$help,
+            "verbose|v"       => \$verbose );
+
+help() if $help;
+
+# We _must_ have a search object
+load_module($search);
+load_module($action)    if ($action);
+load_module($condition) if ($condition);
+
+# load template if specified
+my $template_obj;
+if ($template_id) {
+    $template_obj = RT::Template->new($RT::Nobody);
+    $template_obj->LoadById($template_id);
+}
+
+#At the appointed time:
+
+#find a bunch of tickets
+my $tickets = RT::Tickets->new($CurrentUser);
+my $search  = $search->new( TicketsObj => $tickets, Argument => $search_arg );
+
+$search->Prepare();
+
+# TicketsFound is an RT::Tickets object
+my $tickets = $search->TicketsObj;
+
+#for each ticket we've found
+while ( my $ticket = $tickets->Next() ) {
+    print "\n" . $ticket->Id() . ": " if ($verbose);
+
+    # perform some more advanced check
+    if ($condition) {
+        my $condition_obj = $condition->new( TicketObj => $ticket,
+                                             Argument  => $condition_arg );
+
+        # if the condition doesn't apply, get out of here
+
+        next unless ( $condition_obj->IsApplicable );
+        print loc("Condition matches...") if ($verbose);
+    }
+
+    #prepare our action
+    my $action_obj = $action->new( TicketObj => $ticket,
+                                  TemplateObj => $template_obj,
+                                   Argument  => $action_arg );
+
+    #if our preparation, move onto the next ticket
+    next unless ( $action_obj->Prepare );
+    print loc("Action prepared...") if ($verbose);
+
+    #commit our action.
+    next unless ( $action_obj->Commit );
+    print loc("Action committed.") if ($verbose);
+}
+
+# {{{ load_module 
+
+=head2 load_module
+
+Loads a perl module, dying nicely if it can't find it.
+
+=cut
+
+sub load_module {
+    my $modname = shift;
+    eval "require $modname";
+    if ($@) {
+        die loc( "Failed to load module [_1]. ([_2])", $modname, $@ );
+    }
+
+}
+
+# }}}
+
+# {{{ loc 
+
+=head2 loc LIST
+
+Localize this string, with the current user's currentuser object
+
+=cut
+
+sub loc {
+    $CurrentUser->loc(@_);
+}
+
+# }}}
+
+sub help {
+
+    print loc( "[_1] is a tool to act on tickets from an external scheduling tool, such as cron.", $0 )
+      . "\n";
+    print loc("It takes several arguments:") . "\n\n";
+
+    print "    "
+      . loc( "[_1] - Specify the search module you want to use", "--search" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - An argument to pass to [_2]", "--search-argument", "--search" )
+      . "\n";
+
+    print "    "
+      . loc( "[_1] - Specify the condition module you want to use", "--condition" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - An argument to pass to [_2]", "--condition-argument", "--condition" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - Specify the action module you want to use", "--action" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - An argument to pass to [_2]", "--action-argument", "--action" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n";
+    print "\n";
+    print "\n";
+    print loc("Security:")."\n";
+    print loc("This tool allows the user to run arbitrary perl modules from within RT.")." ". 
+        loc("If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT.")." ".
+        loc("It is incredibly important that nonprivileged users not be allowed to run this tool."). " " . 
+        loc("It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool.")."\n";
+    print "\n";
+    print loc("Example:");
+    print "\n";
+    print " "
+      . loc( "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:"
+      )
+      . "\n\n";
+
+    print " sbin/cron_shim \\\n";
+    print
+      "  --search RT::Search::ActiveTicketsInQueue  --search-arg general \\\n";
+    print
+      "  --condition RT::Condition::UntouchedInHours --condition-arg 4 \\\n";
+    print "  --action RT::Action::SetPriority --action-arg 99 \\\n";
+    print "  --verbose\n";
+
+
+    exit(0);
+}
diff --git a/rt/bin/rt-crontool.in b/rt/bin/rt-crontool.in
new file mode 100644 (file)
index 0000000..73b80aa
--- /dev/null
@@ -0,0 +1,210 @@
+#!@PERL@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 lib ("@RT_LIB_PATH@", "@LOCAL_LIB_PATH@");
+
+package RT;
+
+use Getopt::Long;
+
+use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
+use RT::Tickets;
+use RT::Template;
+
+#Clean out all the nasties from the environment
+CleanEnv();
+
+# Load the config file
+RT::LoadConfig();
+
+#Connect to the database and get RT::SystemUser and RT::Nobody loaded
+RT::Init();
+
+#Drop setgid permissions
+RT::DropSetGIDPermissions();
+
+#Get the current user all loaded
+my $CurrentUser = GetCurrentUser();
+
+unless ( $CurrentUser->Id ) {
+    print loc("No RT user found. Please consult your RT administrator.\n");
+    exit(1);
+}
+
+my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg,
+     $template_id, $help, $verbose );
+GetOptions( "search=s"        => \$search,
+            "search-arg=s"    => \$search_arg,
+            "condition=s"     => \$condition,
+            "condition-arg=s" => \$condition_arg,
+            "action-arg=s"    => \$action_arg,
+            "action=s"        => \$action,
+           "template-id=s"   => \$template_id,
+            "help"            => \$help,
+            "verbose|v"       => \$verbose );
+
+help() if $help;
+
+# We _must_ have a search object
+load_module($search);
+load_module($action)    if ($action);
+load_module($condition) if ($condition);
+
+# load template if specified
+my $template_obj;
+if ($template_id) {
+    $template_obj = RT::Template->new($RT::Nobody);
+    $template_obj->LoadById($template_id);
+}
+
+#At the appointed time:
+
+#find a bunch of tickets
+my $tickets = RT::Tickets->new($CurrentUser);
+my $search  = $search->new( TicketsObj => $tickets, Argument => $search_arg );
+
+$search->Prepare();
+
+# TicketsFound is an RT::Tickets object
+my $tickets = $search->TicketsObj;
+
+#for each ticket we've found
+while ( my $ticket = $tickets->Next() ) {
+    print "\n" . $ticket->Id() . ": " if ($verbose);
+
+    # perform some more advanced check
+    if ($condition) {
+        my $condition_obj = $condition->new( TicketObj => $ticket,
+                                             Argument  => $condition_arg );
+
+        # if the condition doesn't apply, get out of here
+
+        next unless ( $condition_obj->IsApplicable );
+        print loc("Condition matches...") if ($verbose);
+    }
+
+    #prepare our action
+    my $action_obj = $action->new( TicketObj => $ticket,
+                                  TemplateObj => $template_obj,
+                                   Argument  => $action_arg );
+
+    #if our preparation, move onto the next ticket
+    next unless ( $action_obj->Prepare );
+    print loc("Action prepared...") if ($verbose);
+
+    #commit our action.
+    next unless ( $action_obj->Commit );
+    print loc("Action committed.") if ($verbose);
+}
+
+# {{{ load_module 
+
+=head2 load_module
+
+Loads a perl module, dying nicely if it can't find it.
+
+=cut
+
+sub load_module {
+    my $modname = shift;
+    eval "require $modname";
+    if ($@) {
+        die loc( "Failed to load module [_1]. ([_2])", $modname, $@ );
+    }
+
+}
+
+# }}}
+
+# {{{ loc 
+
+=head2 loc LIST
+
+Localize this string, with the current user's currentuser object
+
+=cut
+
+sub loc {
+    $CurrentUser->loc(@_);
+}
+
+# }}}
+
+sub help {
+
+    print loc( "[_1] is a tool to act on tickets from an external scheduling tool, such as cron.", $0 )
+      . "\n";
+    print loc("It takes several arguments:") . "\n\n";
+
+    print "    "
+      . loc( "[_1] - Specify the search module you want to use", "--search" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - An argument to pass to [_2]", "--search-argument", "--search" )
+      . "\n";
+
+    print "    "
+      . loc( "[_1] - Specify the condition module you want to use", "--condition" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - An argument to pass to [_2]", "--condition-argument", "--condition" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - Specify the action module you want to use", "--action" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - An argument to pass to [_2]", "--action-argument", "--action" )
+      . "\n";
+    print "    "
+      . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n";
+    print "\n";
+    print "\n";
+    print loc("Security:")."\n";
+    print loc("This tool allows the user to run arbitrary perl modules from within RT.")." ". 
+        loc("If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT.")." ".
+        loc("It is incredibly important that nonprivileged users not be allowed to run this tool."). " " . 
+        loc("It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool.")."\n";
+    print "\n";
+    print loc("Example:");
+    print "\n";
+    print " "
+      . loc( "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:"
+      )
+      . "\n\n";
+
+    print " sbin/cron_shim \\\n";
+    print
+      "  --search RT::Search::ActiveTicketsInQueue  --search-arg general \\\n";
+    print
+      "  --condition RT::Condition::UntouchedInHours --condition-arg 4 \\\n";
+    print "  --action RT::Action::SetPriority --action-arg 99 \\\n";
+    print "  --verbose\n";
+
+
+    exit(0);
+}
diff --git a/rt/bin/rt-mailgate.in b/rt/bin/rt-mailgate.in
new file mode 100644 (file)
index 0000000..304fcbc
--- /dev/null
@@ -0,0 +1,587 @@
+#!@PERL@ -w
+# BEGIN LICENSE BLOCK
+#
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+#
+# (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
+
+=head1 NAME
+
+rt-mailgate - Mail interface to RT3.
+
+=begin testing
+
+use RT::I18N;
+
+
+# {{{ Test new ticket creation by root who is privileged and superuser
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: root\@localhost
+To: rt\@example.com
+Subject: This is a test of new ticket creation
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+use RT::Tickets;
+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 (UNIVERSAL::isa($tick,'RT::Ticket'));
+ok ($tick->Id, "found ticket ".$tick->Id);
+ok ($tick->Subject eq 'This is a test of new ticket creation', "Created the ticket");
+
+# }}}
+
+
+# {{{This is a test of new ticket creation as an unknown user
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: doesnotexist\@example.com
+To: rt\@example.com
+Subject: This is a test of new ticket creation as an unknown user
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+$tickets = RT::Tickets->new($RT::SystemUser);
+$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0');
+$tick = $tickets->First();
+ok ($tick->Id, "found ticket ".$tick->Id);
+ok ($tick->Subject ne 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account");
+my $u = RT::User->new($RT::SystemUser);
+$u->Load('doesnotexist@example.com');
+ok( $u->Id == 0, " user does not exist and was not created by failed ticket submission");
+
+
+# }}}
+
+# {{{ now everybody can create tickets.  can a random unkown user create tickets?
+
+my $g = RT::Group->new($RT::SystemUser);
+$g->LoadSystemInternalGroup('Everyone');
+ok( $g->Id, "Found 'everybody'");
+
+my ($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket');
+ok ($val, "Granted everybody the right to create tickets - $msg");
+
+sleep(60); # gotta sleep so the remote process' ACL cache times out
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: doesnotexist\@example.com
+To: rt\@example.com
+Subject: This is a test of new ticket creation as an unknown user
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+
+$tickets = RT::Tickets->new($RT::SystemUser);
+$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0');
+$tick = $tickets->First();
+ok ($tick->Id, "found ticket ".$tick->Id);
+ok ($tick->Subject eq 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account");
+my $u = RT::User->new($RT::SystemUser);
+$u->Load('doesnotexist@example.com');
+ok( $u->Id != 0, " user does not exist and was created by ticket submission");
+
+# }}}
+
+
+# {{{  can another random reply to a ticket without being granted privs? answer should be no.
+
+
+#($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket');
+#ok ($val, "Granted everybody the right to create tickets - $msg");
+#sleep(60); # gotta sleep so the remote process' ACL cache times out
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: doesnotexist-2\@example.com
+To: rt\@example.com
+Subject: [example.com #@{[$tick->Id]}] This is a test of a reply as an unknown user
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+$u = RT::User->new($RT::SystemUser);
+$u->Load('doesnotexist-2@example.com');
+ok( $u->Id == 0, " user does not exist and was not created by ticket correspondence submission");
+# }}}
+# {{{  can another random reply to a ticket after being granted privs? answer should be yes
+
+
+($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'ReplyToTicket');
+ok ($val, "Granted everybody the right to reply to  tickets - $msg");
+sleep(60); # gotta sleep so the remote process' ACL cache times out
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: doesnotexist-2\@example.com
+To: rt\@example.com
+Subject: [example.com #@{[$tick->Id]}] This is a test of a reply as an unknown user
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+
+$u = RT::User->new($RT::SystemUser);
+$u->Load('doesnotexist-2@example.com');
+ok( $u->Id != 0, " user exists and was created by ticket correspondence submission");
+
+# }}}
+
+# {{{  can another random comment on a ticket without being granted privs? answer should be no.
+
+
+#($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket');
+#ok ($val, "Granted everybody the right to create tickets - $msg");
+#sleep(60); # gotta sleep so the remote process' ACL cache times out
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action comment"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: doesnotexist-3\@example.com
+To: rt\@example.com
+Subject: [example.com #@{[$tick->Id]}] This is a test of a comment as an unknown user
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+$u = RT::User->new($RT::SystemUser);
+$u->Load('doesnotexist-3@example.com');
+ok( $u->Id == 0, " user does not exist and was not created by ticket comment submission");
+
+# }}}
+# {{{  can another random reply to a ticket after being granted privs? answer should be yes
+
+
+($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CommentOnTicket');
+ok ($val, "Granted everybody the right to reply to  tickets - $msg");
+sleep(60); # gotta sleep so the remote process' ACL cache times out
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action comment"), "Opened the mailgate - $@");
+print MAIL <<EOF;
+From: doesnotexist-3\@example.com
+To: rt\@example.com
+Subject: [example.com #@{[$tick->Id]}] This is a test of a comment as an unknown user
+
+Blah!
+Foob!
+EOF
+close (MAIL);
+
+
+$u = RT::User->new($RT::SystemUser);
+$u->Load('doesnotexist-3@example.com');
+ok( $u->Id != 0, " user exists and was created by ticket comment submission");
+
+# }}}
+
+# {{{ Testing preservation of binary attachments
+
+# Get a binary blob (Best Practical logo) 
+
+# Create a mime entity with an attachment
+
+use MIME::Entity;
+my $entity = MIME::Entity->build( From => 'root@localhost',
+                                 To => 'rt@localhost',
+                                Subject => 'binary attachment test',
+                                Data => ['This is a test of a binary attachment']);
+
+# currently in lib/t/autogen
+$entity->attach(Path => '../../../html/NoAuth/images/spacer.gif', 
+                Type => 'image/gif',
+                Encoding => 'base64');
+
+# Create a ticket with a binary attachment
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+
+$entity->print(\*MAIL);
+
+close (MAIL);
+
+my $tickets = RT::Tickets->new($RT::SystemUser);
+$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$tickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0');
+ $tick = $tickets->First();
+ok (UNIVERSAL::isa($tick,'RT::Ticket'));
+ok ($tick->Id, "found ticket ".$tick->Id);
+ok ($tick->Subject eq 'binary attachment test', "Created the ticket - ".$tick->Id);
+
+my $file = `cat ../../../html/NoAuth/images/spacer.gif`;
+ok ($file, "Read in the logo image");
+
+
+        use Digest::MD5;
+warn "for the raw file the content is ".Digest::MD5::md5_base64($file);
+
+
+
+# Verify that the binary attachment is valid in the database
+my $attachments = RT::Attachments->new($RT::SystemUser);
+$attachments->Limit(FIELD => 'ContentType', VALUE => 'image/gif');
+ok ($attachments->Count == 1, 'Found only one gif in the database');
+my $attachment = $attachments->First;
+my $acontent = $attachment->Content;
+
+        warn "coming from the  database, the content is ".Digest::MD5::md5_base64($acontent);
+
+is( $acontent, $file, 'The attachment isn\'t screwed up in the database.');
+# Log in as root
+use Getopt::Long;
+use LWP::UserAgent;
+
+
+# Grab the binary attachment via the web ui
+my $ua      = LWP::UserAgent->new();
+
+my $full_url = "http://localhost/Ticket/Attachment/".$attachment->TransactionId."/".$attachment->id."/spacer.gif?&user=root&pass=password";
+my $r = $ua->get( $full_url);
+
+
+# Verify that the downloaded attachment is the same as what we uploaded.
+is($file, $r->content, 'The attachment isn\'t screwed up in download');
+
+
+
+# }}}
+
+# {{{ Simple I18N testing
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+                                                                         
+print MAIL <<EOF;
+From: root\@localhost
+To: rtemail\@example.com
+Subject: This is a test of I18N ticket creation
+Content-Type: text/plain; charset="utf-8"
+
+2 accented lines
+\303\242\303\252\303\256\303\264\303\273
+\303\241\303\251\303\255\303\263\303\272
+bye
+EOF
+close (MAIL);
+
+my $unitickets = RT::Tickets->new($RT::SystemUser);
+$unitickets->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$unitickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0');
+my $unitick = $unitickets->First();
+ok (UNIVERSAL::isa($unitick,'RT::Ticket'));
+ok ($unitick->Id, "found ticket ".$unitick->Id);
+ok ($unitick->Subject eq 'This is a test of I18N ticket creation', "Created the ticket - ". $unitick->Subject);
+
+
+
+my $unistring = "\303\241\303\251\303\255\303\263\303\272";
+Encode::_utf8_on($unistring);
+is ($unitick->Transactions->First->Content, $unitick->Transactions->First->Attachments->First->Content, "Content is ". $unitick->Transactions->First->Attachments->First->Content);
+ok($unitick->Transactions->First->Attachments->First->Content =~ /$unistring/i, $unitick->Id." appears to be unicode ". $unitick->Transactions->First->Attachments->First->Id);
+# supposedly I18N fails on the second message sent in.
+
+ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@");
+                                                                         
+print MAIL <<EOF;
+From: root\@localhost
+To: rtemail\@example.com
+Subject: This is a test of I18N ticket creation
+Content-Type: text/plain; charset="utf-8"
+
+2 accented lines
+\303\242\303\252\303\256\303\264\303\273
+\303\241\303\251\303\255\303\263\303\272
+bye
+EOF
+close (MAIL);
+
+my $tickets2 = RT::Tickets->new($RT::SystemUser);
+$tickets2->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$tickets2->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0');
+my $tick2 = $tickets2->First();
+ok (UNIVERSAL::isa($tick2,'RT::Ticket'));
+ok ($tick2->Id, "found ticket ".$tick2->Id);
+ok ($tick2->Subject eq 'This is a test of I18N ticket creation', "Created the ticket");
+
+
+
+my $unistring = "\303\241\303\251\303\255\303\263\303\272";
+Encode::_utf8_on($unistring);
+
+ok ($tick2->Transactions->First->Content =~ $unistring, "It appears to be unicode - ".$tick2->Transactions->First->Content);
+
+# }}}
+
+
+($val,$msg) = $g->PrincipalObj->RevokeRight(Right => 'CreateTicket');
+ok ($val, $msg);
+
+
+
+=end testing
+
+=cut
+
+
+use strict;
+use Getopt::Long;
+use LWP::UserAgent;
+
+use constant EX_TEMPFAIL => 75;
+
+my %opts;
+GetOptions( \%opts, "queue=s", "action=s", "url=s", "jar=s", "help", "debug", "extension=s" );
+
+if ( $opts{help} ) {
+    require Pod::Usage;
+    import Pod::Usage;
+    pod2usage("RT Mail Gateway\n");
+    exit 1;    # Don't want to succeed if this is really an email!
+}
+
+for (qw(url)) {
+    die "$0 invoked improperly\n\nNo $_ provided to mail gateway!\n" unless $opts{$_};
+}
+
+undef $/;
+my $message = <>;
+my $ua      = LWP::UserAgent->new();
+$ua->cookie_jar( { file => $opts{jar} } );
+
+my %args = (
+    queue   => $opts{queue},
+    action  => $opts{action},
+    message => $message,
+    SessionType => 'REST',    # Surpress login box
+);
+
+
+if ($opts{'extension'}) {
+        $args{$opts{'extension'}} = $ENV{'EXTENSION'};
+}
+
+# Set up cookie here.
+
+my $full_url = $opts{'url'}. "/REST/1.0/NoAuth/mail-gateway";
+warn "Connecting to $full_url" if $opts{'debug'};
+
+
+
+my $r = $ua->post( $full_url, {%args} );
+check_failure($r);
+
+my $content = $r->content;
+warn $content if ($opts{debug});
+
+if ( $content !~ /^(ok|not ok)/ ) {
+
+    # It's not the server's fault if the mail is bogus. We just want to know that
+    # *something* came out of the server.
+    die <<EOF
+RT server error.
+
+The RT server which handled your email did not behave as expected. It
+said:
+
+$content
+EOF
+
+}
+
+sub check_failure {
+    my $r = shift;
+    return if $r->is_success();
+
+    # This ordinarily oughtn't to be able to happen, suggests a bug in RT.
+    # So only load these heavy modules when they're needed.
+    require HTML::TreeBuilder;
+    require HTML::FormatText;
+
+    my $error = $r->error_as_HTML;
+    my $tree  = HTML::TreeBuilder->new->parse($error);
+    $tree->eof;
+
+    # It'll be a cold day in hell before RT sends out bounces in HTML
+    my $formatter = HTML::FormatText->new( leftmargin  => 0,
+                                           rightmargin => 50 );
+    warn $formatter->format($tree);
+    warn "This is $0 exiting because of an undefined server error" if ($opts{debug});
+    exit EX_TEMPFAIL;
+}
+
+
+=head1 SYNOPSIS
+
+    rt-mailgate --help : this text
+
+Usual invocation (from MTA):
+
+    rt-mailgate --action (correspond|comment) --queue queuename
+                --url http://your.rt.server/
+                [ --extension (queue|action|ticket)
+
+See C<man rt-mailgate> for more.
+
+=head1 OPTIONS
+
+=over 3
+
+=item C<--action>
+
+Specifies whether this is a correspondence or comment address.
+
+=item C<--queue>
+
+Reflects which queue this address handles.
+
+=item C<--url>
+
+The location of the web server for your RT instance.
+
+
+=item C<--extension> OPTIONAL
+
+Some MTAs will route mail sent to user-foo@host or user+foo@host to user@host
+and present "foo" in the environment variable $EXTENSION. By specifying
+the value "queue" for this parameter, the queue this message should be
+submitted to will be set to the value of $EXTENSION. By specifying
+"ticket", $EXTENSION will be interpreted as the id of the ticket this message
+is related to.  "action" will allow the user to specify either "comment" or
+"correspond" in the address extension.
+
+
+=head1 DESCRIPTION
+
+The RT mail gateway is the primary mechanism for communicating with RT
+via email. This program simply directs the email to the RT web server,
+which handles filing correspondence and sending out any required mail.
+It is designed to be run as part of the mail delivery process, either
+called directly by the MTA or C<procmail>, or in a F<.forward> or
+equivalent.
+
+=head1 SETUP
+
+Much of the set up of the mail gateway depends on your MTA and mail
+routing configuration. However, you will need first of all to create an
+RT user for the mail gateway and assign it a password; this helps to
+ensure that mail coming into the web server did originate from the
+gateway.
+
+Next, you need to route mail to C<rt-mailgate> for the queues you're
+monitoring. For instance, if you're using F</etc/aliases> and you have a
+"bugs" queue, you will want something like this:
+
+    bugs:         "|/opt/rt3/bin/rt-mailgate --queue bugs --action correspond
+              --url http://rt.mycorp.com/"
+
+    bugs-comment: "|/opt/rt3/bin/rt-mailgate --queue bugs --action comment
+              --url http://rt.mycorp.com/"
+
+Note that you don't have to run your RT server on your mail server, as
+the mail gateway will happily relay to a different machine.
+
+=head1 CUSTOMIZATION
+
+By default, the mail gateway will accept mail from anyone. However,
+there are situations in which you will want to authenticate users
+before allowing them to communicate with the system. You can do this
+via a plug-in mechanism in the RT configuration.
+
+You can set the array C<@RT::MailPlugins> to be a list of plugins. The
+default plugin, if this is not given, is C<Auth::MailFrom> - that is,
+authentication of the person is done based on the C<From> header of the
+email. If you have additional filters or authentication mechanisms, you
+can list them here and they will be called in order:
+
+    @RT::MailPlugins = (
+        "Filter::SpamAssassin",
+        "Auth::LDAP",
+        # ...
+    );
+
+See the documentation for any additional plugins you have.
+
+You may also put Perl subroutines into the C<@RT::MailPlugins> array, if
+they behave as described below.
+
+=head1 WRITING PLUGINS
+
+What's actually going on in the above is that C<@RT::MailPlugins> is a
+list of Perl modules; RT prepends C<RT::Interface::Email::> to the name,
+to form a package name, and then C<use>'s this module. The module is
+expected to provide a C<GetCurrentUser> subroutine, which takes a hash of
+several parameters:
+
+=over 4
+
+=item Message
+
+A C<MIME::Entity> object representing the email
+=item CurrentUser
+
+An C<RT::CurrentUser> object
+
+=item AuthStat
+
+The authentication level returned from the previous plugin.
+
+=item Ticket [OPTIONAL]
+
+The ticket under discussion
+
+=item Queue [OPTIONAL]
+
+If we don't already have a ticket id, we need to know which queue we're talking about
+
+=item Action
+
+The action being performed. At the moment, it's one of "comment" or "correspond"
+
+=back 4
+
+It returns two values, the new C<RT::CurrentUser> object, and the new
+authentication level. The authentication level can be zero, not allowed
+to communicate with RT at all, (a "permission denied" error is mailed to
+the correspondent) or one, which is the normal mode of operation.
+Additionally, if C<-1> is returned, then the processing of the plug-ins
+stops immediately and the message is ignored.
+
+=cut
+
diff --git a/rt/bin/webmux.pl.in b/rt/bin/webmux.pl.in
new file mode 100644 (file)
index 0000000..12aad85
--- /dev/null
@@ -0,0 +1,125 @@
+#!@PERL@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+
+BEGIN {
+    $ENV{'PATH'}   = '/bin:/usr/bin';                      # or whatever you need
+    $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'};
+    $ENV{'SHELL'}  = '/bin/sh' if defined $ENV{'SHELL'};
+    $ENV{'ENV'}    = '' if defined $ENV{'ENV'};
+    $ENV{'IFS'}    = '' if defined $ENV{'IFS'};
+}
+
+use lib ("@LOCAL_LIB_PATH@", "@RT_LIB_PATH@");
+use RT;
+
+package RT::Mason;
+
+use CGI qw(-private_tempfiles);    #bring this in before mason, to make sure we
+                                   #set private_tempfiles
+
+BEGIN {
+    if ($CGI::MOD_PERL) {
+       require HTML::Mason::ApacheHandler;
+    }
+    else {
+       require HTML::Mason::CGIHandler;
+    }
+}
+
+use HTML::Mason;                   # brings in subpackages: Parser, Interp, etc.
+
+use vars qw($Nobody $SystemUser $r);
+
+#This drags in RT's config.pm
+RT::LoadConfig();
+
+use Carp;
+
+{
+    package HTML::Mason::Commands;
+    use vars qw(%session);
+
+    use RT::Tickets;
+    use RT::Transactions;
+    use RT::Users;
+    use RT::CurrentUser;
+    use RT::Templates;
+    use RT::Queues;
+    use RT::ScripActions;
+    use RT::ScripConditions;
+    use RT::Scrips;
+    use RT::Groups;
+    use RT::GroupMembers;
+    use RT::CustomFields;
+    use RT::CustomFieldValues;
+    use RT::TicketCustomFieldValues;
+
+    use RT::Interface::Web;
+    use MIME::Entity;
+    use Text::Wrapper;
+    use CGI::Cookie;
+    use Time::ParseDate;
+    use HTML::Entities;
+}
+
+
+# Activate the following if running httpd as root (the normal case).
+# Resets ownership of all files created by Mason at startup.
+# Note that mysql uses DB for sessions, so there's no need to do this.
+unless ($RT::DatabaseType =~ /(mysql|Pg)/) {
+    # Clean up our umask to protect session files
+    umask(0077);
+
+if ( $CGI::MOD_PERL)  {
+    chown( Apache->server->uid, Apache->server->gid, [$RT::MasonSessionDir] )
+       if Apache->server->can('uid');
+        }
+    # Die if WebSessionDir doesn't exist or we can't write to it
+    stat($RT::MasonSessionDir);
+    die "Can't read and write $RT::MasonSessionDir"
+       unless ( ( -d _ ) and ( -r _ ) and ( -w _ ) );
+}
+
+my $ah = &RT::Interface::Web::NewApacheHandler() if $CGI::MOD_PERL;
+
+sub handler {
+    ($r) = @_;
+
+    RT::Init();
+
+    # We don't need to handle non-text items
+    return -1 if defined( $r->content_type ) && $r->content_type !~ m|^text/|io;
+
+    my %session;
+    my $status = $ah->handle_request($r);
+    undef (%session);
+
+    $RT::Logger->crit("Transaction not committed. Usually indicates a software fault. Data loss may have occurred") if $RT::Handle->TransactionDepth;
+    return $status;
+}
+
+1;
diff --git a/rt/config b/rt/config
new file mode 100644 (file)
index 0000000..b9418a6
--- /dev/null
+++ b/rt/config
@@ -0,0 +1,256 @@
+/*
+ * This is the project ``config'' file.  It controls many aspects of
+ * how Aegis interacts with your project.
+ *
+ * There are several sections of this file, each dealing with a different
+ * aspect of the interaction between Aegis and the tools used to manage
+ * yout project.
+ */
+
+/*
+ * -------------------------------------------------------------------------
+ *
+ * The build tool is delegated.
+ */
+
+/*
+ * The build_command field of the config file is used to invoke the relevant
+ * build command.  The following command tells cook where to find the recipes.
+ * The ${s Howto.cook} expands to a path into the baseline during development
+ * if the file is not in the change.  Look in aesub(5) for more information
+ * about command substitutions.
+ */
+build_command =
+       "";
+        
+/*        cook -book ${s Howto.cook} search_path=$search_path \
+project=$p change=$c version=$v -star -no-log -action -notouch";
+
+/* 
+ * The recipes in the User Guide will all remove their targets before
+ * constructing them, which qualifies them to use the following entry in the
+ * config file.  The targets MUST be removed first if this field is true,
+ * otherwise the baseline would cease to be self-consistent.
+ *
+ * Fortunately, Cook has a nifty ``set unlink;'' statement which is
+ * placed at the top of the cookbook.
+ */ 
+link_integration_directory = true;
+
+
+/*
+ * -------------------------------------------------------------------------
+ *
+ * The history tool is delegated.
+ *
+ * The fhist program was written by David I. Bell and is admirably
+ * suited to providing a history mechanism with out the "cruft" that
+ * SCCS and RCS impose.  The fhist program also comes with two other
+ * utilities, fcomp and fmerge, which use the same minimal difference
+ * algorithm.
+ *
+ * Please note that the [# edit #] feature needs to be avoided, or the
+ * -Fored_Update (-fu) flag needs to be used in addition to the
+ * -Conditional_Update (-cu) flag, otherwise updates will complain that
+ * ``Input file "XXX" contains edit A instead of B for module "YYY"''
+ *
+ * The history_create_command and the history_put_command are
+ * intentionally identical.  This minimizes problems when using
+ * branches.
+ *
+ * The ${quote ...} construct is used to quote filesnames whicg contain
+ * shell special characters.  A minimum of quoting is performed, so if
+ * the filenames do not contail shell special characters, no quotes will
+ * be used.
+ */
+
+/*
+ * This command is used to create a new project history.  The command is
+ * always executed as the project owner.  Note he the source is left in
+ * the baseline.  The following substitutions are available:
+ *
+ * ${Input}
+ *     absolute path of the source file
+ * ${History}
+ *     absolute path of the history file
+ *
+ * The history_create_command and the history_put_command are
+ * intentionally identical.  This minimizes problems when using
+ * branches.
+ */
+history_create_command =
+       "fhist ${quote ${basename $input}} -cr -cu -i ${quote $input} \
+-p ${quote ${dirname $history}} -r";
+
+/*
+ * This command is used to get a specific edit back from history.  The
+ * command may be executed by developers.  The following substitutions
+ * are available:
+ *
+ * ${History}
+ *     absolute path of the history file
+ * ${Edit}
+ *     edit number, as given by history_query_command
+ * ${Output}
+ *     absolute path of the destination file
+ *
+ * Note that the destination filename will never look anything like the
+ * history source filename, so the -p is essential.
+ */
+history_get_command =
+       "fhist ${quote ${basename $history}} -e ${quote $e} \
+-o ${quote $output} -p ${quote ${dirname $history}}";
+
+/*
+ * This command is used to add a new "top-most" entry to the history
+ * file.  This command is always executed as the project owner.  Note
+ * that the source file is left in the baseline.  The following
+ * substitutions are available:
+ *
+ * ${Input}
+ *     absolute path of source file
+ * ${History}
+ *     absolute path of history file
+ *
+ * The history_create_command and the history_put_command are
+ * intentionally identical.  This minimizes problems when using
+ * branches.
+ */
+history_put_command =
+       "fhist ${quote ${basename $input}} -cr -cu -i ${quote $input} \
+-p ${quote ${dirname $history}} -r";
+
+/*
+ * This command is used to query what the history mechanism calls the
+ * "top-most" edit of a history file.  The result may be any arbitrary
+ * string, it need not be anything like a number, just so long as it
+ * uniquely identifies the edit for use by the history_get_command at a
+ * later date.  The edit number is to be printed on the standard output.
+ * This command may be executed by developers.  The following
+ * substitutions are available:
+ *
+ * ${History}
+ *     absolute path of the history file
+ */
+history_query_command =
+       "fhist ${quote ${basename $history}} -l 0 \
+-p ${quote ${dirname $history}} -q";
+
+/*
+ * -------------------------------------------------------------------------
+ *
+ * The difference and merge tools are delegated.
+ */
+
+/*
+ * Compare two files using fcomp.  The -w option produces an output of
+ * the entire file, with insertions an deletions marked by "change bars"
+ * in the left margin.  This is superior to context difference, as it
+ * shows the entire file as context.  The -s option could be added to
+ * compare runs of white space as equal.
+ *
+ * This command is used by aed(1) to produce a difference listing when
+ * file in the development directory was originally copied from the
+ * current version in the baseline.
+ *
+ * All of the command substitutions described in aesub(5) are available.
+ * In addition, the following substitutions are also available:
+ *
+ * ${ORiginal}
+ *     The absolute path name of a file containing the version
+ *     originally copied.  Usually in the baseline.
+ * ${Input}
+ *     The absolute path name of the edited version of the file.
+ *     Usually in the development directory.
+ * ${Output}
+ *     The absolute path name of the file in which to write the
+ *     difference listing.  Usually in the development directory.
+ *
+ * An exit status of 0 means successful, even of the files differ (and
+ * they usually do).  An exit status which is non-zero means something
+ * is wrong.
+ *
+ * The non-zero exit status may be used to overload this command with
+ * extra tests, such as line length limits.  The difference files must
+ * be produced in addition to these extra tests.
+ */
+diff_command =
+       "fcomp -w ${quote $original} ${quote $input} -o ${quote $output}";
+
+/*
+ * Compare three files using fmerge.  Conflicts are marked in the
+ * output.
+ *
+ * This command is used by aed(1) to produce a difference listing when a
+ * file in the development directory is out of date compared to the
+ * current version in the baseline.
+ *
+ * All of the command substitutions described in aesub(5) are available.
+ * In addition, the following substitutions are also available:
+ *
+ * ${ORiginal}
+ *     The absolute path name of a file containing the common ancestor
+ *     version of ${MostRecent} and {$Input}.  Usually the version
+ *     originally copied into the change.  Usually in a temporary file.
+ * ${Most_Recent}
+ *     The absolute path name of a file containing the most recent
+ *     version.  Usually in the baseline.
+ * ${Input}
+ *     The absolute path name of the edited version of the file.
+ *     Usually in the development directory.
+ * ${Output}
+ *     The absolute path name of the file in which to write the
+ *     difference listing.  Usually in the development directory.
+ *
+ * An exit status of 0 means successful, even of the files differ (and
+ * they usually do).  An exit status which is non-zero means something
+ * is wrong.
+ */
+merge_command =
+       "fmerge ${quote $original} ${quote $MostRecent} ${quote $input} \
+-o ${quote $output} -c /dev/null";
+
+/*
+ * -------------------------------------------------------------------------
+ *
+ * The new file templates are very handy.  They allow all sorts of things
+ * to be se automatically.  You need to edit them to add your own name,
+ * and copyright conditions.
+ */
+
+file_template =
+[
+       {
+               pattern = [ "*" ];
+                body = "${read_file ${source etc/template/generic abs}}";
+
+       }
+];
+
+/* -------------------------------------------------------------------------
+ *
+ * The integrate_begin_exceptions are files which are not hard linked
+ * from the baseline to the integration directory.  In this case, this
+ * is done to ensure the version stmp is updated appropriately.
+ */
+
+integrate_begin_exceptions = [ ];
+
+
+
+
+/* -------------------------------------------------------------------------
+ *
+ * The trojan_horse_suspect field is a list of filename patterns which
+ * indicate files which *could* host a Trojan horse attack.  It makes
+ * aedist --receive more cautions.  It is NOT a silver bullet: just
+ * about ANY file can host a Trojan, one way or the other.
+ */
+
+trojan_horse_suspect = [ ];
+
+build_covers_all_architectures = true;
+
+test_command = "make test";
+
+build_time_adjust=dont_adjust;
diff --git a/rt/config.layout b/rt/config.layout
new file mode 100644 (file)
index 0000000..81917f1
--- /dev/null
@@ -0,0 +1,83 @@
+##
+##  config.layout -- Pre-defined Installation Path Layouts
+##
+##  Hints:
+##  - layouts can be loaded with configure's --enable-layout=ID option
+##  - when no --enable-layout option is given, the default layout is `RT'
+##  - a trailing plus character (`+') on paths is replaced with a
+##    `/<target>' suffix where <target> is currently hardcoded to 'rt3'.
+##    (This may become a configurable parameter at some point.)
+##
+##  The following variables must _all_ be set:
+##     prefix exec_prefix bindir sbindir sysconfdir mandir libdir
+##     datadir htmldir localstatedir logfiledir masonstatedir
+##     sessionstatedir customdir customhtmldir customlexdir
+##  (This can be seen in m4/rt_layout.m4.)
+##
+
+#   Default RT3 path layout.
+<Layout RT3>
+  prefix:              /opt/rt3
+  exec_prefix:         ${prefix}
+  bindir:              ${exec_prefix}/bin
+  sbindir:             ${exec_prefix}/sbin
+  sysconfdir:          ${prefix}/etc
+  mandir:              ${prefix}/man
+  libdir:              ${prefix}/lib
+  datadir:             ${prefix}/share
+  htmldir:             ${datadir}/html
+  manualdir:           ${datadir}/doc
+  localstatedir:       ${prefix}/var
+  logfiledir:          ${localstatedir}/log
+  masonstatedir:       ${localstatedir}/mason_data
+  sessionstatedir:     ${localstatedir}/session_data
+  customdir:           ${prefix}/local
+  custometcdir:                ${customdir}/etc
+  customhtmldir:       ${customdir}/html
+  customlexdir:                ${customdir}/po
+  customlibdir:                ${customdir}/lib
+</Layout>
+
+<Layout FreeBSD>
+  prefix:              /usr/local
+  exec_prefix:         ${prefix}
+  bindir:              ${exec_prefix}/bin
+  sbindir:             ${exec_prefix}/sbin
+  sysconfdir:          ${prefix}/etc+
+  mandir:              ${prefix}/man
+  libdir:              ${prefix}/lib+
+  datadir:             ${prefix}/share+
+  htmldir:             ${datadir}/html
+  manualdir:           ${prefix}/share/doc+
+  logfiledir:          /var/log
+  localstatedir:       /var/run+
+  masonstatedir:       ${localstatedir}/mason_data
+  sessionstatedir:     ${localstatedir}/session_data
+  customdir:           ${prefix}/share+
+  custometcdir:                ${customdir}/local/etc
+  customhtmldir:       ${customdir}/local/html
+  customlexdir:                ${customdir}/local/po
+  customlibdir:                ${customdir}/local/lib
+</Layout>
+
+<Layout Win32>
+  prefix:              C:/Program Files/Request Tracker
+  exec_prefix:         ${prefix}
+  bindir:              ${exec_prefix}/bin
+  sbindir:             ${exec_prefix}/sbin
+  sysconfdir:          ${prefix}/etc
+  mandir:              ${prefix}/man
+  libdir:              ${prefix}/lib
+  datadir:             ${prefix}
+  htmldir:             ${datadir}/html
+  manualdir:           ${datadir}/doc
+  localstatedir:       ${prefix}/var
+  logfiledir:          ${localstatedir}/log
+  masonstatedir:       ${localstatedir}/mason_data
+  sessionstatedir:     ${localstatedir}/session_data
+  customdir:           ${prefix}/local
+  custometcdir:                ${customdir}/etc
+  customhtmldir:       ${customdir}/html
+  customlexdir:                ${customdir}/po
+  customlibdir:                ${customdir}/lib
+</Layout>
diff --git a/rt/config.log b/rt/config.log
new file mode 100644 (file)
index 0000000..f854948
--- /dev/null
@@ -0,0 +1,117 @@
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by RT configure 3.0.4, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  $ ./configure 
+
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = pallas
+uname -m = i686
+uname -r = 2.4.18-686
+uname -s = Linux
+uname -v = #1 Sun Apr 14 11:32:47 EST 2002
+
+/usr/bin/uname -p = unknown
+/bin/uname -X     = unknown
+
+/bin/arch              = i686
+/usr/bin/arch -k       = unknown
+/usr/convex/getsysinfo = unknown
+hostinfo               = unknown
+/bin/machine           = unknown
+/usr/bin/oslevel       = unknown
+/bin/universe          = unknown
+
+PATH: /usr/X11R6/bin/
+PATH: /opt/rt/bin
+PATH: /usr/athena/bin
+PATH: /usr/local/bin
+PATH: /bin
+PATH: /usr/bin
+PATH: /usr/sbin
+PATH: /usr/bin
+PATH: /usr/games
+PATH: $HOME/bin
+PATH: /opt/kerberos/bin
+PATH: /opt/StarOffice-4.0/bin
+PATH: /opt/mysql/bin/
+PATH: .
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+configure:1217: checking for a BSD-compatible install
+configure:1271: result: /usr/bin/install -c
+configure:1285: checking for perl
+configure:1303: found /usr/bin/perl
+configure:1316: result: /usr/bin/perl
+configure:1638: checking for chosen layout
+configure:1653: result: RT3
+configure:1964: creating ./config.status
+
+## ---------------------- ##
+## Running config.status. ##
+## ---------------------- ##
+
+This file was extended by RT config.status 3.0.4, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  CONFIG_FILES    = 
+  CONFIG_HEADERS  = 
+  CONFIG_LINKS    = 
+  CONFIG_COMMANDS = 
+  $ ./config.status 
+
+on pallas
+
+config.status:637: creating sbin/rt-setup-database
+config.status:637: creating sbin/rt-test-dependencies
+config.status:637: creating Makefile
+config.status:637: creating etc/RT_Config.pm
+config.status:637: creating lib/RT.pm
+config.status:637: creating lib/t/00smoke.t
+config.status:637: creating lib/t/01harness.t
+config.status:637: creating lib/t/02regression.t
+config.status:637: creating lib/t/03web.pl
+config.status:637: creating lib/t/04_send_email.pl
+config.status:637: creating bin/mason_handler.fcgi
+config.status:637: creating bin/mason_handler.scgi
+config.status:637: creating bin/mason_handler.svc
+config.status:637: creating bin/rt-commit-handler
+config.status:637: creating bin/rt-crontool
+config.status:637: creating bin/rt-mailgate
+config.status:637: creating bin/webmux.pl
+
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+
+ac_cv_env_PERL_set=
+ac_cv_env_PERL_value=
+ac_cv_env_build_alias_set=
+ac_cv_env_build_alias_value=
+ac_cv_env_host_alias_set=
+ac_cv_env_host_alias_value=
+ac_cv_env_target_alias_set=
+ac_cv_env_target_alias_value=
+ac_cv_path_PERL=/usr/bin/perl
+ac_cv_path_install='/usr/bin/install -c'
+
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+
+#define PACKAGE_NAME "RT"
+#define PACKAGE_TARNAME "rt"
+#define PACKAGE_VERSION "3.0.4"
+#define PACKAGE_STRING "RT 3.0.4"
+#define PACKAGE_BUGREPORT "rt-3.0-bugs@fsck.com"
+
+configure: exit 0
diff --git a/rt/config.pld b/rt/config.pld
new file mode 100644 (file)
index 0000000..c71c7bb
--- /dev/null
@@ -0,0 +1,19 @@
+(test "x$prefix" = "xNONE" || test "x$prefix" = "x") && prefix=/opt/rt3
+(test "x$exec_prefix" = "xNONE" || test "x$exec_prefix" = "x") && exec_prefix=${prefix}
+bindir=${exec_prefix}/bin
+sbindir=${exec_prefix}/sbin
+sysconfdir=${prefix}/etc
+mandir=${prefix}/man
+libdir=${prefix}/lib
+datadir=${prefix}/share
+(test "x$htmldir" = "xNONE" || test "x$htmldir" = "x") && htmldir=${datadir}/html
+(test "x$manualdir" = "xNONE" || test "x$manualdir" = "x") && manualdir=${datadir}/doc
+localstatedir=${prefix}/var
+(test "x$logfiledir" = "xNONE" || test "x$logfiledir" = "x") && logfiledir=${localstatedir}/log
+(test "x$masonstatedir" = "xNONE" || test "x$masonstatedir" = "x") && masonstatedir=${localstatedir}/mason_data
+(test "x$sessionstatedir" = "xNONE" || test "x$sessionstatedir" = "x") && sessionstatedir=${localstatedir}/session_data
+(test "x$customdir" = "xNONE" || test "x$customdir" = "x") && customdir=${prefix}/local
+(test "x$custometcdir" = "xNONE" || test "x$custometcdir" = "x") && custometcdir=${customdir}/etc
+(test "x$customhtmldir" = "xNONE" || test "x$customhtmldir" = "x") && customhtmldir=${customdir}/html
+(test "x$customlexdir" = "xNONE" || test "x$customlexdir" = "x") && customlexdir=${customdir}/po
+(test "x$customlibdir" = "xNONE" || test "x$customlibdir" = "x") && customlibdir=${customdir}/lib
diff --git a/rt/config.status b/rt/config.status
new file mode 100755 (executable)
index 0000000..e7d8358
--- /dev/null
@@ -0,0 +1,711 @@
+#! /bin/sh
+# Generated by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by RT $as_me 3.0.4, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+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_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+ac_cs_version="\
+RT config.status 3.0.4
+configured by ./configure, generated by GNU Autoconf 2.53,
+  with options \"\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=.
+INSTALL="/usr/bin/install -c"
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running /bin/sh ./configure "  " --no-create --no-recursion"
+    exec /bin/sh ./configure  --no-create --no-recursion ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "sbin/rt-setup-database" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-setup-database" ;;
+  "sbin/rt-test-dependencies" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-test-dependencies" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "etc/RT_Config.pm" ) CONFIG_FILES="$CONFIG_FILES etc/RT_Config.pm" ;;
+  "lib/RT.pm" ) CONFIG_FILES="$CONFIG_FILES lib/RT.pm" ;;
+  "lib/t/00smoke.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/00smoke.t" ;;
+  "lib/t/01harness.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/01harness.t" ;;
+  "lib/t/02regression.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/02regression.t" ;;
+  "lib/t/03web.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/03web.pl" ;;
+  "lib/t/04_send_email.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/04_send_email.pl" ;;
+  "bin/mason_handler.fcgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.fcgi" ;;
+  "bin/mason_handler.scgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.scgi" ;;
+  "bin/mason_handler.svc" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.svc" ;;
+  "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/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;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF
+s,@SHELL@,/bin/sh,;t t
+s,@PATH_SEPARATOR@,:,;t t
+s,@PACKAGE_NAME@,RT,;t t
+s,@PACKAGE_TARNAME@,rt,;t t
+s,@PACKAGE_VERSION@,3.0.4,;t t
+s,@PACKAGE_STRING@,RT 3.0.4,;t t
+s,@PACKAGE_BUGREPORT@,rt-3.0-bugs@fsck.com,;t t
+s,@exec_prefix@,/opt/rt3,;t t
+s,@prefix@,/opt/rt3,;t t
+s,@program_transform_name@,s,x,x,,;t t
+s,@bindir@,/opt/rt3/bin,;t t
+s,@sbindir@,/opt/rt3/sbin,;t t
+s,@libexecdir@,${exec_prefix}/libexec,;t t
+s,@datadir@,/opt/rt3/share,;t t
+s,@sysconfdir@,/opt/rt3/etc,;t t
+s,@sharedstatedir@,${prefix}/com,;t t
+s,@localstatedir@,/opt/rt3/var,;t t
+s,@libdir@,/opt/rt3/lib,;t t
+s,@includedir@,${prefix}/include,;t t
+s,@oldincludedir@,/usr/include,;t t
+s,@infodir@,${prefix}/info,;t t
+s,@mandir@,/opt/rt3/man,;t t
+s,@build_alias@,,;t t
+s,@host_alias@,,;t t
+s,@target_alias@,,;t t
+s,@DEFS@,-DPACKAGE_NAME=\"RT\" -DPACKAGE_TARNAME=\"rt\" -DPACKAGE_VERSION=\"3.0.4\" -DPACKAGE_STRING=\"RT\ 3.0.4\" -DPACKAGE_BUGREPORT=\"rt-3.0-bugs@fsck.com\" ,;t t
+s,@ECHO_C@,,;t t
+s,@ECHO_N@,-n,;t t
+s,@ECHO_T@,,;t t
+s,@LIBS@,,;t t
+s,@rt_version_major@,3,;t t
+s,@rt_version_minor@,0,;t t
+s,@rt_version_patch@,4,;t t
+s,@INSTALL_PROGRAM@,${INSTALL},;t t
+s,@INSTALL_SCRIPT@,${INSTALL},;t t
+s,@INSTALL_DATA@,${INSTALL} -m 644,;t t
+s,@PERL@,/usr/bin/perl,;t t
+s,@SPEEDY_BIN@,/usr/local/bin/speedy,;t t
+s,@exp_prefix@,/opt/rt3,;t t
+s,@exp_exec_prefix@,/opt/rt3,;t t
+s,@exp_bindir@,/opt/rt3/bin,;t t
+s,@exp_sbindir@,/opt/rt3/sbin,;t t
+s,@exp_sysconfdir@,/opt/rt3/etc,;t t
+s,@exp_mandir@,/opt/rt3/man,;t t
+s,@exp_libdir@,/opt/rt3/lib,;t t
+s,@exp_datadir@,/opt/rt3/share,;t t
+s,@htmldir@,/opt/rt3/share/html,;t t
+s,@exp_htmldir@,/opt/rt3/share/html,;t t
+s,@manualdir@,/opt/rt3/share/doc,;t t
+s,@exp_manualdir@,/opt/rt3/share/doc,;t t
+s,@exp_localstatedir@,/opt/rt3/var,;t t
+s,@logfiledir@,/opt/rt3/var/log,;t t
+s,@exp_logfiledir@,/opt/rt3/var/log,;t t
+s,@masonstatedir@,/opt/rt3/var/mason_data,;t t
+s,@exp_masonstatedir@,/opt/rt3/var/mason_data,;t t
+s,@sessionstatedir@,/opt/rt3/var/session_data,;t t
+s,@exp_sessionstatedir@,/opt/rt3/var/session_data,;t t
+s,@customdir@,/opt/rt3/local,;t t
+s,@exp_customdir@,/opt/rt3/local,;t t
+s,@custometcdir@,/opt/rt3/local/etc,;t t
+s,@exp_custometcdir@,/opt/rt3/local/etc,;t t
+s,@customhtmldir@,/opt/rt3/local/html,;t t
+s,@exp_customhtmldir@,/opt/rt3/local/html,;t t
+s,@customlexdir@,/opt/rt3/local/po,;t t
+s,@exp_customlexdir@,/opt/rt3/local/po,;t t
+s,@customlibdir@,/opt/rt3/local/lib,;t t
+s,@exp_customlibdir@,/opt/rt3/local/lib,;t t
+s,@rt_layout_name@,RT3,;t t
+s,@RTGROUP@,rt,;t t
+s,@BIN_OWNER@,root,;t t
+s,@LIBS_OWNER@,root,;t t
+s,@LIBS_GROUP@,bin,;t t
+s,@DB_TYPE@,mysql,;t t
+s,@DB_HOST@,localhost,;t t
+s,@DB_PORT@,,;t t
+s,@DB_RT_HOST@,localhost,;t t
+s,@DB_DBA@,root,;t t
+s,@DB_DATABASE@,rt3,;t t
+s,@DB_RT_USER@,rt_user,;t t
+s,@DB_RT_PASS@,rt_pass,;t t
+s,@WEB_USER@,www,;t t
+s,@WEB_GROUP@,www,;t t
+s,@RT_VERSION_MAJOR@,3,;t t
+s,@RT_VERSION_MINOR@,0,;t t
+s,@RT_VERSION_PATCH@,4,;t t
+s,@RT_PATH@,/opt/rt3,;t t
+s,@RT_DOC_PATH@,/opt/rt3/share/doc,;t t
+s,@RT_LOCAL_PATH@,/opt/rt3/local,;t t
+s,@RT_LIB_PATH@,/opt/rt3/lib,;t t
+s,@RT_ETC_PATH@,/opt/rt3/etc,;t t
+s,@CONFIG_FILE_PATH@,/opt/rt3/etc,;t t
+s,@RT_BIN_PATH@,/opt/rt3/bin,;t t
+s,@RT_SBIN_PATH@,/opt/rt3/sbin,;t t
+s,@RT_VAR_PATH@,/opt/rt3/var,;t t
+s,@RT_MAN_PATH@,/opt/rt3/man,;t t
+s,@MASON_DATA_PATH@,/opt/rt3/var/mason_data,;t t
+s,@MASON_SESSION_PATH@,/opt/rt3/var/session_data,;t t
+s,@MASON_HTML_PATH@,/opt/rt3/share/html,;t t
+s,@LOCAL_ETC_PATH@,/opt/rt3/local/etc,;t t
+s,@MASON_LOCAL_HTML_PATH@,/opt/rt3/local/html,;t t
+s,@LOCAL_LEXICON_PATH@,/opt/rt3/local/po,;t t
+s,@LOCAL_LIB_PATH@,/opt/rt3/local/lib,;t t
+s,@DESTDIR@,/opt/rt3,;t t
+s,@RT_LOG_PATH@,/opt/rt3/var/log,;t t
+CEOF
+
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" ||
+        mkdir "$as_incr_dir" ||
+       { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }
+    ;;
+  esac
+done; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  sed "/^[     ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[   ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[     ]*$//;
+}
+
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+
+{ (exit 0); exit 0; }
diff --git a/rt/configure b/rt/configure
new file mode 100755 (executable)
index 0000000..c89d759
--- /dev/null
@@ -0,0 +1,2747 @@
+#! /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.
+#
+# Report bugs to <rt-3.0-bugs@fsck.com>.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='RT'
+PACKAGE_TARNAME='rt'
+PACKAGE_VERSION='3.0.4'
+PACKAGE_STRING='RT 3.0.4'
+PACKAGE_BUGREPORT='rt-3.0-bugs@fsck.com'
+
+ac_unique_file="lib/RT.pm.in"
+ac_default_prefix=/opt/rt3
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$0" : 'X\(//\)[^/]' \| \
+         X"$0" : 'X\(//\)$' \| \
+         X"$0" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_PERL_set=${PERL+set}
+ac_env_PERL_value=$PERL
+ac_cv_env_PERL_set=${PERL+set}
+ac_cv_env_PERL_value=$PERL
+
+#
+# Report the --help message.
+#
+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.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of RT 3.0.4:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-layout=LAYOUT  Use a specific directory layout (Default: RT3)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-speedycgi=/path/to/speedy
+                          path to your speedycgi binary, if it exists
+  --with-rt-group=GROUP   group to own all files (default: rt)
+  --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-host=HOSTNAME FQDN of database server (default: localhost)
+  --with-db-port=PORT     port on which the database listens on
+  --with-db-rt-host=HOSTNAME
+                          FQDN of RT server which talks to the database server
+                          (default: localhost)
+  --with-db-dba=DBA       name of database administrator (default: root)
+  --with-db-database=DBNAME
+                          name of the database to use (default: rt3)
+  --with-db-rt-user=DBUSER
+                          name of database user (default: rt_user)
+  --with-db-rt-pass=PASSWORD
+                          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)
+
+Some influential environment variables:
+  PERL        Perl interpreter command
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <rt-3.0-bugs@fsck.com>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+           test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+RT configure 3.0.4
+generated by GNU Autoconf 2.53
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+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
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case $ac_arg in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n ) continue ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    continue ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  case " $ac_configure_args " in
+    *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+    *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+       ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core core.* *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+rt_version_major=3
+
+rt_version_minor=0
+
+rt_version_patch=4
+
+test "x$rt_version_major" = 'x' && rt_version_major=0
+test "x$rt_version_minor" = 'x' && rt_version_minor=0
+test "x$rt_version_patch" = 'x' && rt_version_patch=0
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+          if test $ac_prog = install &&
+            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # AIX install.  It has an incompatible calling convention.
+            :
+          elif test $ac_prog = install &&
+            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # program-specific install script used by HP pwplus--don't use.
+            :
+          else
+            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+            break 3
+          fi
+        fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="not found"
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+  echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$PERL" = 'not found'; then
+       { { echo "$as_me:$LINENO: error: cannot use $PACKAGE_NAME without perl" >&5
+echo "$as_me: error: cannot use $PACKAGE_NAME without perl" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# Check whether --with-speedycgi or --without-speedycgi was given.
+if test "${with_speedycgi+set}" = set; then
+  withval="$with_speedycgi"
+  SPEEDY_BIN=$withval
+else
+  SPEEDY_BIN=/usr/local/bin/speedy
+fi;
+
+
+
+
+
+# Check whether --enable-layout or --disable-layout was given.
+if test "${enable_layout+set}" = set; then
+  enableval="$enable_layout"
+  LAYOUT=$enableval
+fi;
+
+if test "x$LAYOUT" = "x"; then
+       LAYOUT="RT3"
+fi
+
+       if test ! -f $srcdir/config.layout; then
+               { echo "$as_me:$LINENO: WARNING: Layout file $srcdir/config.layout not found" >&5
+echo "$as_me: WARNING: Layout file $srcdir/config.layout not found" >&2;}
+               rt_layout_name=no
+       else
+               pldconf=./config.pld
+               $PERL  -0777 -p -e "\$layout = '$LAYOUT';"  -e '
+               s/.*<Layout\s+$layout>//gims;
+               s/\<\/Layout\>.*//s;
+               s/^#.*$//m;
+               s/^\s+//gim;
+               s/\s+$/\n/gim;
+               s/\+$/\/rt3/gim;
+               # m4 will not let us just use $srcdir/config.layout, we need $1
+               s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/$1=$2/gim;
+               s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\$$1" = "xNONE" || test "x\$$1" = "x") && $1=$2/gim;
+                ' < $srcdir/config.layout > $pldconf
+
+               if test -s $pldconf; then
+                       rt_layout_name=$LAYOUT
+                       . $pldconf
+
+                       for var in prefix exec_prefix bindir sbindir \
+                                sysconfdir mandir libdir datadir htmldir \
+                                localstatedir logfiledir masonstatedir \
+                                sessionstatedir customdir custometcdir customhtmldir \
+                                customlexdir customlibdir manualdir; do
+                               eval "val=\"\$$var\""
+                               val=`echo $val | sed -e 's:\(.\)/*$:\1:'`
+                               val=`echo $val |
+                                       sed -e 's:[\$]\([a-z_]*\):$\1:g'`
+                               eval "$var='$val'"
+                       done
+
+               else
+                       rt_layout_name=no
+               fi
+               #rm $pldconf
+       fi
+
+
+       ap_last=''
+       ap_cur='$prefix'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_prefix="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$exec_prefix'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_exec_prefix="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$bindir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_bindir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$sbindir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_sbindir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$sysconfdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_sysconfdir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$mandir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_mandir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$libdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_libdir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$datadir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_datadir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$htmldir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_htmldir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$manualdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_manualdir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$localstatedir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_localstatedir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$logfiledir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_logfiledir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$masonstatedir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_masonstatedir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$sessionstatedir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_sessionstatedir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$customdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customdir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$custometcdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_custometcdir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$customhtmldir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customhtmldir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$customlexdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customlexdir="${ap_cur}"
+
+
+
+
+
+
+       ap_last=''
+       ap_cur='$customlibdir'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       exp_customlibdir="${ap_cur}"
+
+
+
+
+
+echo "$as_me:$LINENO: checking for chosen layout" >&5
+echo $ECHO_N "checking for chosen layout... $ECHO_C" >&6
+if test "x$rt_layout_name" = "xno"; then
+       if test "x$LAYOUT" = "xno"; then
+               echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+       else
+               echo "$as_me:$LINENO: result: $LAYOUT" >&5
+echo "${ECHO_T}$LAYOUT" >&6
+       fi
+       { { echo "$as_me:$LINENO: error: a valid layout must be specified (or the default used)" >&5
+echo "$as_me: error: a valid layout must be specified (or the default used)" >&2;}
+   { (exit 1); exit 1; }; }
+else
+
+       echo "$as_me:$LINENO: result: $rt_layout_name" >&5
+echo "${ECHO_T}$rt_layout_name" >&6
+fi
+
+
+
+# Check whether --with-rt-group or --without-rt-group was given.
+if test "${with_rt_group+set}" = set; then
+  withval="$with_rt_group"
+  RTGROUP=$withval
+else
+  RTGROUP=rt
+fi;
+
+
+
+# Check whether --with-bin-owner or --without-bin-owner was given.
+if test "${with_bin_owner+set}" = set; then
+  withval="$with_bin_owner"
+  BIN_OWNER=$withval
+else
+  BIN_OWNER=root
+fi;
+
+
+
+# Check whether --with-libs-owner or --without-libs-owner was given.
+if test "${with_libs_owner+set}" = set; then
+  withval="$with_libs_owner"
+  LIBS_OWNER=$withval
+else
+  LIBS_OWNER=root
+fi;
+
+
+
+# Check whether --with-libs-group or --without-libs-group was given.
+if test "${with_libs_group+set}" = set; then
+  withval="$with_libs_group"
+  LIBS_GROUP=$withval
+else
+  LIBS_GROUP=bin
+fi;
+
+
+
+# Check whether --with-db-type or --without-db-type was given.
+if test "${with_db_type+set}" = set; then
+  withval="$with_db_type"
+  DB_TYPE=$withval
+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;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+# Check whether --with-db-host or --without-db-host was given.
+if test "${with_db_host+set}" = set; then
+  withval="$with_db_host"
+  DB_HOST=$withval
+else
+  DB_HOST=localhost
+fi;
+
+
+
+# Check whether --with-db-port or --without-db-port was given.
+if test "${with_db_port+set}" = set; then
+  withval="$with_db_port"
+  DB_PORT=$withval
+else
+  DB_PORT=
+fi;
+
+
+
+# Check whether --with-db-rt-host or --without-db-rt-host was given.
+if test "${with_db_rt_host+set}" = set; then
+  withval="$with_db_rt_host"
+  DB_RT_HOST=$withval
+else
+  DB_RT_HOST=localhost
+fi;
+
+
+
+# Check whether --with-db-dba or --without-db-dba was given.
+if test "${with_db_dba+set}" = set; then
+  withval="$with_db_dba"
+  DB_DBA=$withval
+else
+  DB_DBA=root
+fi;
+
+
+
+# Check whether --with-db-database or --without-db-database was given.
+if test "${with_db_database+set}" = set; then
+  withval="$with_db_database"
+  DB_DATABASE=$withval
+else
+  DB_DATABASE=rt3
+fi;
+
+
+
+# Check whether --with-db-rt-user or --without-db-rt-user was given.
+if test "${with_db_rt_user+set}" = set; then
+  withval="$with_db_rt_user"
+  DB_RT_USER=$withval
+else
+  DB_RT_USER=rt_user
+fi;
+
+
+
+# Check whether --with-db-rt-pass or --without-db-rt-pass was given.
+if test "${with_db_rt_pass+set}" = set; then
+  withval="$with_db_rt_pass"
+  DB_RT_PASS=$withval
+else
+  DB_RT_PASS=rt_pass
+fi;
+
+
+
+# Check whether --with-web-user or --without-web-user was given.
+if test "${with_web_user+set}" = set; then
+  withval="$with_web_user"
+  WEB_USER=$withval
+else
+  WEB_USER=www
+fi;
+
+
+
+# Check whether --with-web-group or --without-web-group was given.
+if test "${with_web_group+set}" = set; then
+  withval="$with_web_group"
+  WEB_GROUP=$withval
+else
+  WEB_GROUP=www
+fi;
+
+
+
+RT_VERSION_MAJOR=${rt_version_major}
+
+RT_VERSION_MINOR=${rt_version_minor}
+
+RT_VERSION_PATCH=${rt_version_patch}
+
+
+RT_PATH=${exp_prefix}
+
+RT_DOC_PATH=${exp_manualdir}
+
+RT_LOCAL_PATH=${exp_customdir}
+
+RT_LIB_PATH=${exp_libdir}
+
+RT_ETC_PATH=${exp_sysconfdir}
+
+CONFIG_FILE_PATH=${exp_sysconfdir}
+
+RT_BIN_PATH=${exp_bindir}
+
+RT_SBIN_PATH=${exp_sbindir}
+
+RT_VAR_PATH=${exp_localstatedir}
+
+RT_MAN_PATH=${exp_mandir}
+
+MASON_DATA_PATH=${exp_masonstatedir}
+
+MASON_SESSION_PATH=${exp_sessionstatedir}
+
+MASON_HTML_PATH=${exp_htmldir}
+
+LOCAL_ETC_PATH=${exp_custometcdir}
+
+MASON_LOCAL_HTML_PATH=${exp_customhtmldir}
+
+LOCAL_LEXICON_PATH=${exp_customlexdir}
+
+LOCAL_LIB_PATH=${exp_customlibdir}
+
+DESTDIR=${exp_prefix}
+
+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"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[   ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[     ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[   ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\),-D\1=\2,g
+t quote
+s,^[   ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[    `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output.  A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+    { $as_unset LANG || test "${LANG+set}" != set; } ||
+      { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+      { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+      { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+      { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+      { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+      { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+      { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conftest.sh
+  echo  "exit 0"   >>conftest.sh
+  chmod +x conftest.sh
+  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conftest.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by RT $as_me 3.0.4, which was
+generated by GNU Autoconf 2.53.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+RT config.status 3.0.4
+configured by $0, generated by GNU Autoconf 2.53,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "sbin/rt-setup-database" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-setup-database" ;;
+  "sbin/rt-test-dependencies" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-test-dependencies" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "etc/RT_Config.pm" ) CONFIG_FILES="$CONFIG_FILES etc/RT_Config.pm" ;;
+  "lib/RT.pm" ) CONFIG_FILES="$CONFIG_FILES lib/RT.pm" ;;
+  "lib/t/00smoke.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/00smoke.t" ;;
+  "lib/t/01harness.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/01harness.t" ;;
+  "lib/t/02regression.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/02regression.t" ;;
+  "lib/t/03web.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/03web.pl" ;;
+  "lib/t/04_send_email.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/04_send_email.pl" ;;
+  "bin/mason_handler.fcgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.fcgi" ;;
+  "bin/mason_handler.scgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.scgi" ;;
+  "bin/mason_handler.svc" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.svc" ;;
+  "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/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;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@rt_version_major@,$rt_version_major,;t t
+s,@rt_version_minor@,$rt_version_minor,;t t
+s,@rt_version_patch@,$rt_version_patch,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@PERL@,$PERL,;t t
+s,@SPEEDY_BIN@,$SPEEDY_BIN,;t t
+s,@exp_prefix@,$exp_prefix,;t t
+s,@exp_exec_prefix@,$exp_exec_prefix,;t t
+s,@exp_bindir@,$exp_bindir,;t t
+s,@exp_sbindir@,$exp_sbindir,;t t
+s,@exp_sysconfdir@,$exp_sysconfdir,;t t
+s,@exp_mandir@,$exp_mandir,;t t
+s,@exp_libdir@,$exp_libdir,;t t
+s,@exp_datadir@,$exp_datadir,;t t
+s,@htmldir@,$htmldir,;t t
+s,@exp_htmldir@,$exp_htmldir,;t t
+s,@manualdir@,$manualdir,;t t
+s,@exp_manualdir@,$exp_manualdir,;t t
+s,@exp_localstatedir@,$exp_localstatedir,;t t
+s,@logfiledir@,$logfiledir,;t t
+s,@exp_logfiledir@,$exp_logfiledir,;t t
+s,@masonstatedir@,$masonstatedir,;t t
+s,@exp_masonstatedir@,$exp_masonstatedir,;t t
+s,@sessionstatedir@,$sessionstatedir,;t t
+s,@exp_sessionstatedir@,$exp_sessionstatedir,;t t
+s,@customdir@,$customdir,;t t
+s,@exp_customdir@,$exp_customdir,;t t
+s,@custometcdir@,$custometcdir,;t t
+s,@exp_custometcdir@,$exp_custometcdir,;t t
+s,@customhtmldir@,$customhtmldir,;t t
+s,@exp_customhtmldir@,$exp_customhtmldir,;t t
+s,@customlexdir@,$customlexdir,;t t
+s,@exp_customlexdir@,$exp_customlexdir,;t t
+s,@customlibdir@,$customlibdir,;t t
+s,@exp_customlibdir@,$exp_customlibdir,;t t
+s,@rt_layout_name@,$rt_layout_name,;t t
+s,@RTGROUP@,$RTGROUP,;t t
+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,@DB_HOST@,$DB_HOST,;t t
+s,@DB_PORT@,$DB_PORT,;t t
+s,@DB_RT_HOST@,$DB_RT_HOST,;t t
+s,@DB_DBA@,$DB_DBA,;t t
+s,@DB_DATABASE@,$DB_DATABASE,;t t
+s,@DB_RT_USER@,$DB_RT_USER,;t t
+s,@DB_RT_PASS@,$DB_RT_PASS,;t t
+s,@WEB_USER@,$WEB_USER,;t t
+s,@WEB_GROUP@,$WEB_GROUP,;t t
+s,@RT_VERSION_MAJOR@,$RT_VERSION_MAJOR,;t t
+s,@RT_VERSION_MINOR@,$RT_VERSION_MINOR,;t t
+s,@RT_VERSION_PATCH@,$RT_VERSION_PATCH,;t t
+s,@RT_PATH@,$RT_PATH,;t t
+s,@RT_DOC_PATH@,$RT_DOC_PATH,;t t
+s,@RT_LOCAL_PATH@,$RT_LOCAL_PATH,;t t
+s,@RT_LIB_PATH@,$RT_LIB_PATH,;t t
+s,@RT_ETC_PATH@,$RT_ETC_PATH,;t t
+s,@CONFIG_FILE_PATH@,$CONFIG_FILE_PATH,;t t
+s,@RT_BIN_PATH@,$RT_BIN_PATH,;t t
+s,@RT_SBIN_PATH@,$RT_SBIN_PATH,;t t
+s,@RT_VAR_PATH@,$RT_VAR_PATH,;t t
+s,@RT_MAN_PATH@,$RT_MAN_PATH,;t t
+s,@MASON_DATA_PATH@,$MASON_DATA_PATH,;t t
+s,@MASON_SESSION_PATH@,$MASON_SESSION_PATH,;t t
+s,@MASON_HTML_PATH@,$MASON_HTML_PATH,;t t
+s,@LOCAL_ETC_PATH@,$LOCAL_ETC_PATH,;t t
+s,@MASON_LOCAL_HTML_PATH@,$MASON_LOCAL_HTML_PATH,;t t
+s,@LOCAL_LEXICON_PATH@,$LOCAL_LEXICON_PATH,;t t
+s,@LOCAL_LIB_PATH@,$LOCAL_LIB_PATH,;t t
+s,@DESTDIR@,$DESTDIR,;t t
+s,@RT_LOG_PATH@,$RT_LOG_PATH,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" ||
+        mkdir "$as_incr_dir" ||
+       { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }
+    ;;
+  esac
+done; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/rt/configure.ac b/rt/configure.ac
new file mode 100644 (file)
index 0000000..cd82c44
--- /dev/null
@@ -0,0 +1,209 @@
+dnl
+dnl Process this file with autoconf to produce a configure script
+dnl
+dnl Embed in generated ./configure script the following CVS info:
+AC_REVISION($Revision: 1.1 $)dnl
+
+dnl Setup autoconf
+AC_PREREQ(2.53)
+AC_INIT(RT, [3.0.4], [rt-3.0-bugs@fsck.com])
+AC_CONFIG_SRCDIR([lib/RT.pm.in])
+
+dnl Extract RT version number components
+AC_SUBST([rt_version_major],
+       m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\)\.\(\w+\)\(\.\(\w+\)\)?],[\1]))
+AC_SUBST([rt_version_minor],
+       m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\)\.\(\w+\)\(\.\(\w+\)\)?],[\2]))
+AC_SUBST([rt_version_patch],
+       m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\)\.\(\w+\)\(\.\(\w+\)\)?],[\4]))
+test "x$rt_version_major" = 'x' && rt_version_major=0
+test "x$rt_version_minor" = 'x' && rt_version_minor=0
+test "x$rt_version_patch" = 'x' && rt_version_patch=0
+
+dnl Check for programs
+AC_PROG_INSTALL
+AC_ARG_VAR([PERL],[Perl interpreter command])
+AC_PATH_PROG([PERL], [perl], [not found])
+if test "$PERL" = 'not found'; then
+       AC_MSG_ERROR([cannot use $PACKAGE_NAME without perl])
+fi
+dnl SPEED_BIN
+AC_ARG_WITH(speedycgi,
+           AC_HELP_STRING([--with-speedycgi=/path/to/speedy],
+                          [path to your speedycgi binary, if it exists]),
+            SPEEDY_BIN=$withval,
+            SPEEDY_BIN=/usr/local/bin/speedy) 
+AC_SUBST(SPEEDY_BIN)
+
+
+dnl Defaults paths for installation
+AC_PREFIX_DEFAULT([/opt/rt3])
+RT_ENABLE_LAYOUT
+
+dnl RTGROUP
+AC_ARG_WITH(rt-group,
+           AC_HELP_STRING([--with-rt-group=GROUP],
+                          [group to own all files (default: rt)]),
+            RTGROUP=$withval,
+            RTGROUP=rt)
+AC_SUBST(RTGROUP)
+
+dnl BIN_OWNER
+AC_ARG_WITH(bin-owner,
+           AC_HELP_STRING([--with-bin-owner=OWNER],
+                          [user that will own rt binaries (default root)]),
+            BIN_OWNER=$withval,
+            BIN_OWNER=root)
+AC_SUBST(BIN_OWNER)
+
+dnl LIBS_OWNER
+AC_ARG_WITH(libs-owner,
+           AC_HELP_STRING([--with-libs-owner=OWNER],
+                          [user that will own RT libraries (default root)]),
+            LIBS_OWNER=$withval,
+            LIBS_OWNER=root)
+AC_SUBST(LIBS_OWNER)
+
+dnl LIBS_GROUP
+AC_ARG_WITH(libs-group,
+           AC_HELP_STRING([--with-libs-group=GROUP],
+                          [group that will own rt binaries (default bin)]),
+            LIBS_GROUP=$withval,
+            LIBS_GROUP=bin)
+AC_SUBST(LIBS_GROUP)
+
+dnl DB_TYPE
+AC_ARG_WITH(db-type,
+           AC_HELP_STRING([--with-db-type=TYPE],
+                          [sort of database RT will use (default: mysql) (mysql and Pg are valid)]), 
+            DB_TYPE=$withval,
+            DB_TYPE=mysql)
+if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite'; then
+       AC_MSG_ERROR([Only Pg and mysql are valid db types])
+fi
+AC_SUBST(DB_TYPE)
+
+dnl DB_HOST
+AC_ARG_WITH(db-host,
+           AC_HELP_STRING([--with-db-host=HOSTNAME],
+                          [FQDN of database server (default: localhost)]),
+            DB_HOST=$withval,
+            DB_HOST=localhost)
+AC_SUBST(DB_HOST)
+
+dnl DB_PORT
+AC_ARG_WITH(db-port,
+           AC_HELP_STRING([--with-db-port=PORT],
+                          [port on which the database listens on]),
+            DB_PORT=$withval,
+            DB_PORT=)
+AC_SUBST(DB_PORT)
+
+dnl DB_RT_HOST
+AC_ARG_WITH(db-rt-host,
+           AC_HELP_STRING([--with-db-rt-host=HOSTNAME],
+                          [FQDN of RT server which talks to the database server (default: localhost)]),
+            DB_RT_HOST=$withval,
+            DB_RT_HOST=localhost)
+AC_SUBST(DB_RT_HOST)
+
+dnl DB_DATABASE_ADMIN
+AC_ARG_WITH(db-dba,
+           AC_HELP_STRING([--with-db-dba=DBA],
+                          [name of database administrator (default: root)]),
+            DB_DBA=$withval,
+            DB_DBA=root)
+AC_SUBST(DB_DBA)
+
+dnl DB_DATABASE
+AC_ARG_WITH(db-database,
+           AC_HELP_STRING([--with-db-database=DBNAME],
+                          [name of the database to use (default: rt3)]),
+            DB_DATABASE=$withval,
+            DB_DATABASE=rt3)
+AC_SUBST(DB_DATABASE)
+
+dnl DB_RT_USER
+AC_ARG_WITH(db-rt-user,
+           AC_HELP_STRING([--with-db-rt-user=DBUSER],
+                          [name of database user (default: rt_user)]),
+            DB_RT_USER=$withval,
+            DB_RT_USER=rt_user)
+AC_SUBST(DB_RT_USER)
+
+dnl DB_RT_PASS
+AC_ARG_WITH(db-rt-pass,
+           AC_HELP_STRING([--with-db-rt-pass=PASSWORD],
+                          [password for database user (default: rt_pass)]),
+            DB_RT_PASS=$withval,
+            DB_RT_PASS=rt_pass)
+AC_SUBST(DB_RT_PASS)
+
+dnl WEB_USER
+AC_ARG_WITH(web-user,
+           AC_HELP_STRING([--with-web-user=USER],
+                          [user the web server runs as (default: www)]),
+            WEB_USER=$withval,
+            WEB_USER=www)
+AC_SUBST(WEB_USER)
+
+dnl WEB_GROUP
+AC_ARG_WITH(web-group,
+            AC_HELP_STRING([--with-web-group=GROUP],
+                          [group the web server runs as (default: www)]),
+            WEB_GROUP=$withval,
+            WEB_GROUP=www)
+AC_SUBST(WEB_GROUP)
+
+dnl This section maps the variable names this script 'natively' generates
+dnl to their existing names. They should be removed from here as the .in
+dnl files are changed to use the new names.
+
+dnl version numbers
+AC_SUBST(RT_VERSION_MAJOR,             ${rt_version_major})
+AC_SUBST(RT_VERSION_MINOR,             ${rt_version_minor})
+AC_SUBST(RT_VERSION_PATCH,             ${rt_version_patch})
+
+dnl layout paths
+AC_SUBST([RT_PATH],                    ${exp_prefix})
+AC_SUBST([RT_DOC_PATH],                        ${exp_manualdir})
+AC_SUBST([RT_LOCAL_PATH],              ${exp_customdir})
+AC_SUBST([RT_LIB_PATH],                        ${exp_libdir})
+AC_SUBST([RT_ETC_PATH],                        ${exp_sysconfdir})
+AC_SUBST([CONFIG_FILE_PATH],           ${exp_sysconfdir})
+AC_SUBST([RT_BIN_PATH],                        ${exp_bindir})
+AC_SUBST([RT_SBIN_PATH],               ${exp_sbindir})
+AC_SUBST([RT_VAR_PATH],                        ${exp_localstatedir})
+AC_SUBST([RT_MAN_PATH],                        ${exp_mandir})
+AC_SUBST([MASON_DATA_PATH],            ${exp_masonstatedir})
+AC_SUBST([MASON_SESSION_PATH],         ${exp_sessionstatedir})
+AC_SUBST([MASON_HTML_PATH],            ${exp_htmldir})
+AC_SUBST([LOCAL_ETC_PATH],             ${exp_custometcdir})
+AC_SUBST([MASON_LOCAL_HTML_PATH],      ${exp_customhtmldir})
+AC_SUBST([LOCAL_LEXICON_PATH],         ${exp_customlexdir})
+AC_SUBST([LOCAL_LIB_PATH],             ${exp_customlibdir})
+AC_SUBST([DESTDIR],                    ${exp_prefix})
+AC_SUBST([RT_LOG_PATH],                        ${exp_logfiledir})
+
+dnl Configure the output files, and generate them.
+
+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_OUTPUT
diff --git a/rt/docs/design_docs/approval_notices b/rt/docs/design_docs/approval_notices
new file mode 100644 (file)
index 0000000..5e76119
--- /dev/null
@@ -0,0 +1,8 @@
+Notification on "your request approved by"
+Notification on "your request approved by all approvers"
+Notification on "your request denied by"
+Reject ticket on rejection of any approval
+
+"Ticket N is pending your approval"
+
+
diff --git a/rt/docs/design_docs/approval_template b/rt/docs/design_docs/approval_template
new file mode 100644 (file)
index 0000000..16a988c
--- /dev/null
@@ -0,0 +1,25 @@
+===Create-Ticket: approval
+ {  my $name = "HR";
+     my $groups = RT::Groups->new($RT::SystemUser);
+   $groups->LimitToUserDefinedGroups();
+   $groups->Limit(FIELD => 'Name', OPERATOR => '=', VALUE => "$name");
+   $groups->WithMember($TransactionObj->CreatorObj->Id);
+
+   my $groupid = $groups->First->Id;
+
+   my $adminccs = RT::Users->new($RT::SystemUser);
+   $adminccs->WhoHaveRight(Right => 'AdminGroup', IncludeSystemRights => undef, IncludeSuperusers => 0, IncludeSubgroupMembers => 0, Object => $groups->First);
+
+    my @admins;
+    while (my $admin = $adminccs->Next) {
+        push (@admins, $admin->Name); 
+    }
+ }
+ Queue: Approvals
+ Type: Approval
+ AdminCcs: {join (", ",@admins) }
+ Depended-On-By: {$tickets{'TOP'}->Id}
+ Refers-To: {$tickets{'TOP'}->Id}
+ Due: {time + 86400}
+ Content-Type: text/plain
+ Content: Your approval is requested for the ticket {%$tickets{'TOP'}->Id}: {$tickets{'TOP'}->Subject}
diff --git a/rt/docs/design_docs/cf_search b/rt/docs/design_docs/cf_search
new file mode 100644 (file)
index 0000000..456a9fe
--- /dev/null
@@ -0,0 +1,72 @@
+find all tickets where:
+
+
+        CF Foo 
+                Has values (talk or read) AND
+                Has values (bar and baz) AND 
+                doesn't have values (bing or bong) 
+
+
+LimitCustomFieldValues {
+        my %args = ( CustomField => undef, 
+                     ClauseId => 'CustomFields',
+                     OPERATOR => undef,
+                     ENTRYAGGREGATOR => undef,
+                     VALUES => undef,
+                     @_) ;
+
+        unless ( $self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField'} ) {
+        $self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField'} = $self->NewAlias('CustomFields');
+        $self->Join(TABLE1 =>$self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField' },  
+                    FIELD1 => 'QueueId',
+                    TABLE2 => 'main', FIELD2 => 'QueueId');
+
+        if ($args{'OPERATOR'} =~ /!=|IS/i) {
+        }
+        else {
+        }
+
+}
+        # {{{ if it's a keyword
+        elsif ( $TYPES{ $restriction->{'FIELD'} } eq 'CUSTOMFIELD' ) {
+
+            my $null_columns_ok;
+            my $TicketCFs = $self->Join( TYPE   => 'left',
+                                                ALIAS1 => 'main',
+                                                FIELD1 => 'id',
+                                                TABLE2 => 'TicketCustomFieldValues',
+                                                FIELD2 => 'Ticket' );
+
+            foreach my $value ( @{ $restriction->{'VALUES'} } ) {
+                $self->SUPER::Limit( ALIAS      => $TicketCFs,
+                                     FIELD      => 'Content',
+                                     OPERATOR   => $restriction->{'OPERATOR'},
+                                     VALUE      => $value,
+                                     QUOTEVALUE => $restriction->{'QUOTEVALUE'},
+                                     ENTRYAGGREGATOR => 'AND', );
+            }
+            if (    ( $restriction->{'OPERATOR'} =~ /^IS$/i ) or ( $restriction->{'OPERATOR'} eq '!=' ) ) {
+                $null_columns_ok = 1;
+            }
+
+            #If we're trying to find tickets where the keyword isn't somethng, also check ones where it _IS_ null
+            if ( $restriction->{'OPERATOR'} eq '!=' ) {
+                $self->SUPER::Limit( ALIAS           => $TicketCFs,
+                                     FIELD           => 'Content',
+                                     OPERATOR        => 'IS',
+                                     VALUE           => 'NULL',
+                                     QUOTEVALUE      => 0,
+                                     ENTRYAGGREGATOR => 'OR', );
+            }
+
+            $self->SUPER::Limit( LEFTJOIN => $TicketCFs,
+                                 FIELD    => 'CustomField',
+                                 VALUE    => $restriction->{'CUSTOMFIELD'},
+                                 ENTRYAGGREGATOR => 'OR' );
+
+        }
+
+        # }}}
+
+    }
+
diff --git a/rt/docs/design_docs/delegation b/rt/docs/design_docs/delegation
new file mode 100644 (file)
index 0000000..0e57059
--- /dev/null
@@ -0,0 +1,115 @@
+Group ACLs
+        
+        the rights:
+
+
+        CreatePersonalGroup
+        CreateGroup
+
+        AdminGroup
+                * Update group metadata and access control list
+        AdminGroupMembers
+                * Add ad delete members of this group
+        ModifyOwnMembership
+                * Join and quit this group
+
+
+        the primitives:
+       
+In user.pm
+
+=item HasRight  { Right => 'somerightname', ObjectType => 'Group', ObjectId => 'GroupId'
+
+        Returns true if this user has the right 'somerightname' for
+the group with id 'Id'
+
+=cut
+
+
+=item RightsForObject { ObjectType => 'Group', ObjectId =>'GroupId' }
+
+in users.pm
+
+=item WhoHaveRight { Right =>'somerightname', ObjectType => 'Group', ObjectId => 'GroupId' }
+
+
+        Finds all users who have the right 'somerightname' for the group
+in question.
+
+        If a user has "AdminGroupMembers" globally and we ask about 
+        group 23, that user should be found.
+
+=cut
+
+Users must be able to delegate individual rights 
+
+        * Is it that users can delegate any and all rights but it's
+        only rights they _have_ which actually grant rights.
+
+rights must not be redelegated
+
+users must be able to create groups to which rights can be delegated.
+
+Only users who have the "delegate rights" right can delegate rights.
+
+
+When a user's right to do something is revoked, the delegation must 
+be revoked
+
+        * For any delegated ACL check, the delegator's right must be 
+          checked immediately after the delegatee's right.
+          If a user has had a right delegated by multiple parties, 
+          this may mean that we need to actually loop through and check
+          a bunch of possible delegations. Or can we craft a "has delegated 
+          right" ACL check.
+          
+
+
+
+
+
+
+ACL 1 Group Q has the right to Frob ObjectI.
+ACL 2 User A has the right "DelegateRights"
+
+Group Q has the member Group S
+Group S has the member Group R
+Group S has the member Group T
+Group R has the member user A
+Group T has the member user A
+
+User A delegates to  Group P the right to Frob  ObjectI
+
+        New ACL rule:
+
+        ACL 3: Group P has the right to Frob ObjectI 
+                     as delegated from ACL1 by User A
+
+
+In the case where ACL1 is revoked:
+
+        find all acls which are delegated from ACL1.
+                Delete them
+
+In the case where User A is removed from group R
+
+        Get the list of all groups that A was in by way of group R before the removal
+        Get the list of all groups that A is in _after_ the removal.
+
+        Find all the ACEs granted to each group that A is no longer in.
+        For each ACE in that list, find all the rights that A has delegated.
+                Whack them.        
+
+In the case where Group S is removed from group Q
+
+
+        Get a list of all groups that S was in by way of Q before the removal
+        Call this list O.
+
+        For each user X who's a member of S (directly or indirectly):
+        Get a list of  all groups that X is in after removal.
+        For each group in O that X is no longer a member of:
+                Find all ACEs granted to O
+                For each ACE, look up all the delegations that X has made.
+                        For each delegation 
+                                WHACK IT
diff --git a/rt/docs/design_docs/groups_notes b/rt/docs/design_docs/groups_notes
new file mode 100644 (file)
index 0000000..234fd37
--- /dev/null
@@ -0,0 +1,88 @@
+CREATE TABLE Prinicpals (
+        id int auto_increment 
+        PrincipalType VARCHAR(16) not_null,
+        PrincipalId int # foreign key to Users or Groups, depending
+)
+
+CREATE TABLE Groups (
+        id int auto_increment,
+        Domain varchar(255), 
+        Instance varchar(16),
+        Name varchar(255),
+        Description varchar(255),
+);
+CREATE TABLE ACL (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Principal integer NULL  , #Foreign key to principals
+  RightName varchar(25) NULL  ,
+  RightDomain varchar(25) NULL  ,
+  RightInstance integer NULL  ,
+  PRIMARY KEY (id)
+);      
+
+CREATE TABLE GroupMembers (
+        id int auto_increment,
+        Group int, # foreign key to Principals
+        Member int # foreign key to Principals
+)
+
+create table GroupMembersCache (
+        id int auto_increment,
+        Group int, # foreign key to Principals
+        Member int, # foreign key to Principals
+        Via int, #foreign key to g_m_u
+)
+
+insert into principals values ('bubbles);
+insert into principals values ('fubar');
+insert into principals values ('sheeri');
+insert into principals values ('sgw');
+
+insert into principals values ('staff');
+insert into principals values ('sysadmin');
+insert into principals values ('senior admin');
+
+
+insert into group_members values(1, 'staff', 'bubbles');
+insert into group_members values(2, 'sysadmin', 'sheeri');
+insert into group_members values(3,'senior admin', 'sgw');
+insert into group_members values(4,'senior admin', 'fubar');
+insert into group_members values(5, 'sysadmin', 'senior admin')
+        
+Groups
+
+
+      
+Domain          Queues
+Instance        <queueid#>
+Name            AdminCc, Cc
+
+/Queues/1/AdminCc
+/Queues/3/Cc
+
+Domain          Tickets
+Instance        <#n>
+Name            Owner, Requestor, Cc, AdminCc
+
+/Tickets/1/Owner
+/Tickets/1/Requestor
+/Tickets/1/Cc
+       Has members: /Queues/whatever queue the ticket has/Cc 
+/Tickets/1/AdminCc
+       Has members: /Queues/whatever queue the ticket has/AdminCc 
+
+
+Domain          Users
+Instance        <userid>
+
+/Users/1/MyDelegates
+/Users/1/MyOtherDelegates
+
+
+Domain          System
+Name            Admins, AdminManagers
+
+/System/Administrators
+/System/Blah
+
+
diff --git a/rt/docs/design_docs/recursive_group_membership_algorithm b/rt/docs/design_docs/recursive_group_membership_algorithm
new file mode 100644 (file)
index 0000000..250b9ad
--- /dev/null
@@ -0,0 +1,109 @@
+Group A has members 1, 2, 3
+
+       Cached members  1 is a member of A via ""
+                       2 is a member of A via ""
+                       3 is a member of A via ""
+
+
+Group B has members A, 4, 5
+
+       Cached members: 4 is a member of B via ""  $1
+                       5 is a member of B via ""  $2
+                       A is a member of B via ""  $3
+                               1 is a member of B via "$3" $4
+                               2 is a member of B via "$3" $5
+                               3 is a member of B via "$3" $6
+
+Group C has members A, B, 6
+                       6 is a member of C via "" $7
+                       A is a member of C via "" $8
+                               1 is a member of C via $8 $9
+                               2 is a member of C via $8 $10
+                               3 is a member of C via $8 $11
+                       B is a member of C via "" $12
+                               4 is a member of C via $12 $13
+                               5 is a member of C via $12 $14
+                               A is a member of C via $12 $15
+                                       1 is a member of C via $15 $16
+                                       2 is a member of C via $15 $17
+                                       3 is a member of C via $15 $18
+
+
+
+Group D has members A, C
+
+                       A is a member of D via "" $19
+                               1 is a member of D via $19 $20
+                               2 is a member of D via $19 $21
+                               3 is a member of D via $19 $22
+                       C is a member of D via "" $23
+                               6 is a member of D via $23 $24
+                               A is a member of D via $23 $25
+                                       1 is a member of D via $25 $26
+                                       2 is a member of D via $25 $27
+                                       3 is a member of D via $25 $28
+                               B is a member of D via $23 $29
+                                       4 is a member of D via $29 $30
+                                       5 is a member of D via $29 $31
+                                       A is a member of D via $29 $32
+                                               1 is a member of D via $32 $33
+                                               2 is a member of D via $32 $34
+                                               3 is a member of D via $32 $35
+
+                       
+
+Adding a new user, 7,  to group A.
+
+
+       Add the user to group A in the groups table.
+
+       Find all entries for group A in the cache table.
+
+       For each entry in that list:
+               Add "7 is a member of $entry->top  via $entry->id"
+
+Deleting a user, 7, from group A:
+
+       Remove the user from group A in the groups table.
+       find all entries in the cache table where the principal id is user 7 and
+       the parent id is A. (requires a self join)
+               nuke them
+
+       Alternatively:
+        find all entries for A in the cache table.
+               For each one, find the child whose id is 7. 
+                       Nuke it
+
+
+Adding a group, B to group D.
+
+       Add group B as a member of D in the groups table.
+       In the cache table:
+               $id = Add group B as a member of D via ""
+                
+                For each member of group B (4, 5, A):
+
+                       $sid= 4 is a member of D via $id
+                       $sid=  5 is a member of D via $id
+                       $sid=  A is a member of D via $id
+
+                        if the member is a group itself, recurse down:
+                                
+                                1 is a member of D via $sid
+                                2 is a member of D via $sid
+                                3 is a member of D via $sid
+                               
+                Find all places where D is a member of $foo.
+                        Repeat the above procedure, substituting $foo for D
+                        and making $id D's id.
+
+Removing B as a member of D:
+
+        Remove B as a member of D in the groups table.
+        Find all references to D in the pseudogroups table.
+                Find all children of D which are B:
+                        Recurse down with the following algorithm:
+                        If it's a user, delete it.
+                        If it's a group,  recurse through each member, 
+                                deleting its children and then deleting the
+                                group itself.
diff --git a/rt/docs/design_docs/rql_parser_machine.graphviz b/rt/docs/design_docs/rql_parser_machine.graphviz
new file mode 100644 (file)
index 0000000..36463ec
--- /dev/null
@@ -0,0 +1,32 @@
+
+/* GraphViz graph representing the state diagram of the RQL parser.
+*/
+
+digraph G {
+
+    PAREN -> PAREN;
+    PAREN -> KEYWORD;
+    PAREN -> AGGREG;
+
+    AGGREG -> KEYWORD;
+    AGGREG -> PAREN;
+
+    KEYWORD -> OP;
+
+    OP -> VALUE;
+
+    VALUE -> PAREN;
+    VALUE -> AGGREG;
+
+/*
+    Blue lines represent added complexity of q[IN (x,y,z)] support.
+    The only place that the "blue tree" can be entered is at IN, and
+    exited at PAREN.
+*/
+    KEYWORD -> IN [color=blue];
+    IN -> PAREN [color=blue];
+    PAREN -> VALUE [color=blue];
+    VALUE -> COMMA [color=blue];
+    COMMA -> VALUE [color=blue]; 
+    VALUE -> PAREN [color=blue];
+}
diff --git a/rt/docs/design_docs/string-extraction-guide.txt b/rt/docs/design_docs/string-extraction-guide.txt
new file mode 100644 (file)
index 0000000..bd60a43
--- /dev/null
@@ -0,0 +1,100 @@
+# $File: //depot/RT/rt-devel/docs/design_docs/string-extraction-guide.txt $ $Author: ivan $
+# $Revision: 1.1 $ $Change: 1431 $ $DateTime: 2002/10/15 17:24:45 $
+
+Run 'p4 edit lib/RT/I18N/zh_tw.pm' and 'perl l10n.pl' to add new
+extractions to the zh_tw.pm.
+
+Edit lib/RT/I18N/zh_tw.pm for chinese counterparts.
+
+Attached is a copy of the freshly rewritten string extraction style guide.
+Please point out anything that's unclear or underspecified.   I
+localized a number of the core modules in RT 2.1.3 (Starting with 
+Queue_Overlay.pm). I only touched a couple of the web templates in the 
+Elements/ directory of the web ui.
+
+RT String extraction styleguide:
+
+Web templates:
+
+Templates should use the /l filtering component to call the localisation
+framework
+
+The string             Foo!
+
+Should become          <&|/l&>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              <input type="submit" value="New ticket in">&nbsp<& /Elements/SelectNewTicketQueue&>
+
+should become          <&|/l, $m->scomp('/Elements/SelectNewTicketQueue')&><input type="submit" value="New ticket in">&nbsp;[_1]</&>
+
+
+
+There are places inside the web ui where strings are defined, which need to be
+localised. it is important to note here that each localized string is split out
+onto its own line, but never split across two lines and two localized strings
+are never included on the same line. It is also important to note
+that this will genereate code which will not work in RT 2.1.3. I need
+to add a bit of framework to make it work in 2.1.4
+
+
+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'),
+               &>
+       
+
+                       
+
+
+
+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.
+
+
+
+
+
+-- 
+http://www.bestpractical.com/products/rt  -- Trouble Ticketing. Free.
+
diff --git a/rt/docs/design_docs/ticket_templates b/rt/docs/design_docs/ticket_templates
new file mode 100644 (file)
index 0000000..7850edf
--- /dev/null
@@ -0,0 +1,16 @@
+===Create-Ticket: foo
+ Subject: APPROVE <%TOP-Subject%>
+ Status: status
+ Queue: <%TOP-Queue%>
+ Owner: <%TOP-Owner%>
+ Depends-on: <%TOP-Id%>
+ Child-of: <%TOP-Id%>
+ Refers-to: <%TOP-Id%>
+ Content-Type: text/plain
+ Content: This is content
+blah
+blah
+blah
+===Create-Ticket: bar
+Subject:  <%foo-Subject%>
+
diff --git a/rt/etc/RT_Config.pm b/rt/etc/RT_Config.pm
new file mode 100644 (file)
index 0000000..2b3f4f9
--- /dev/null
@@ -0,0 +1,349 @@
+#
+# WARNING: NEVER EDIT RT_Config.pm. Instead, copy any sections you want to change to RT_SiteConfig.pm
+# and edit them there.
+#
+
+package RT;
+
+=head1 NAME
+
+RT::Config
+
+=for testing
+
+use RT::Config;
+
+=cut
+
+# {{{ Base Configuration
+
+# $rtname the string that RT will look for in mail messages to
+# figure out what ticket a new piece of mail belongs to
+
+# Your domain name is recommended, so as not to pollute the namespace.
+# once you start using a given tag, you should probably never change it.
+# (otherwise, mail for existing tickets won't get put in the right place
+
+Set($rtname , "example.com");
+
+# You should set this to your organization's DNS domain. For example,
+# fsck.com or asylum.arkham.ma.us. It's used by the linking interface to
+# guarantee that ticket URIs are unique and easy to construct.
+
+Set($Organization , "example.com");
+
+# $user_passwd_min defines the minimum length for user passwords. Setting
+# it to 0 disables this check
+Set($MinimumPasswordLength , "5");
+
+# $Timezone is used to convert times entered by users into GMT and back again
+# It should be set to a timezone recognized by your local unix box.
+Set($Timezone , 'US/Eastern');
+
+# }}}
+
+# }}}
+
+# {{{ Database Configuration
+
+# Database driver beeing used. Case matters
+# Valid types are "mysql" and "Pg"
+
+Set($DatabaseType , 'mysql');
+
+# The domain name of your database server
+# If you're running mysql and it's on localhost,
+# leave it blank for enhanced performance
+Set($DatabaseHost   , 'localhost');
+Set($DatabaseRTHost , 'localhost');
+
+# The port that your database server is running on.  Ignored unless it's
+# a positive integer. It's usually safe to leave this blank
+Set($DatabasePort , '');
+
+#The name of the database user (inside the database)
+Set($DatabaseUser , 'rt_user');
+
+# Password the DatabaseUser should use to access the database
+Set($DatabasePassword , 'rt_pass');
+
+# The name of the RT's database on your database server
+Set($DatabaseName , 'rt3');
+
+# If you're using Postgres and have compiled in SSL support,
+# set DatabaseRequireSSL to 1 to turn on SSL communication
+Set($DatabaseRequireSSL , undef);
+
+# }}}
+
+# {{{ Incoming mail gateway configuration
+
+# OwnerEmail is the address of a human who manages RT. RT will send
+# errors generated by the mail gateway to this address.  This address
+# should _not_ be an address that's managed by your RT instance.
+
+Set($OwnerEmail , 'root');
+
+# If $LoopsToRTOwner is defined, RT will send mail that it believes
+# might be a loop to $RT::OwnerEmail
+
+Set($LoopsToRTOwner , 1);
+
+# If $StoreLoopss is defined, RT will record messages that it believes
+# to be part of mail loops.
+# As it does this, it will try to be careful not to send mail to the
+# sender of these messages
+
+Set($StoreLoops , undef);
+
+# $MaxAttachmentSize sets the maximum size (in bytes) of attachments stored
+# in the database.
+
+# For mysql and oracle, we set this size at 10 megabytes.
+# If you're running a postgres version earlier than 7.1, you will need
+# to drop this to 8192. (8k)
+
+Set($MaxAttachmentSize , 10000000);
+
+# $TruncateLongAttachments: if this is set to a non-undef value,
+# RT will truncate attachments longer than MaxAttachmentLength.
+
+Set($TruncateLongAttachments , undef);
+
+# $DropLongAttachments: if this is set to a non-undef value,
+# RT will silently drop attachments longer than MaxAttachmentLength.
+
+Set($DropLongAttachments , undef);
+
+# If $ParseNewMessageForTicketCcs is true, RT will attempt to divine
+# Ticket 'Cc' watchers from the To and Cc lines of incoming messages
+# Be forewarned that if you have _any_ addresses which forward mail to
+# RT automatically and you enable this option without modifying
+# "RTAddressRegexp" below, you will get yourself into a heap of trouble.
+
+Set($ParseNewMessageForTicketCcs , undef);
+
+# RTAddressRegexp is used to make sure RT doesn't add itself as a ticket CC if
+# the setting above is enabled.
+
+Set($RTAddressRegexp , '^rt\@example.com$');
+
+# RT provides functionality which allows the system to rewrite
+# incoming email addresses.  In its simplest form,
+# you can substitute the value in CanonicalizeEmailAddressReplace
+# for the value in CanonicalizeEmailAddressMatch
+# (These values are passed to the CanonicalizeEmailAddress subroutine in RT/User.pm)
+# By default, that routine performs a s/$Match/$Replace/gi on any address passed to it
+
+Set($CanonicalizeEmailAddressMatch   , 'subdomain.example.com$');
+Set($CanonicalizeEmailAddressReplace , 'example.com');
+
+# If $SenderMustExistInExternalDatabase is true, RT will refuse to
+# create non-privileged accounts for unknown users if you are using
+# the "LookupSenderInExternalDatabase" option.
+# Instead, an error message will be mailed and RT will forward the
+# message to $RTOwner.
+#
+# If you are not using $LookupSenderInExternalDatabase, this option
+# has no effect.
+#
+# If you define an AutoRejectRequest template, RT will use this
+# template for the rejection message.
+
+Set($SenderMustExistInExternalDatabase , undef);
+
+# }}}
+
+# {{{ Outgoing mail configuration
+
+# RT is designed such that any mail which already has a ticket-id associated
+# with it will get to the right place automatically.
+
+# $CorrespondAddress and $CommentAddress are the default addresses
+# that will be listed in From: and Reply-To: headers of correspondence
+# and comment mail tracked by RT, unless overridden by a queue-specific
+# address.
+
+Set($CorrespondAddress , 'RT::CorrespondAddress.not.set');
+
+Set($CommentAddress , 'RT::CommentAddress.not.set');
+
+#Sendmail Configuration
+
+# $MailCommand defines which method RT will use to try to send mail
+# We know that 'sendmailpipe' works fairly well.
+# If 'sendmailpipe' doesn't work well for you, try 'sendmail'
+#
+# Note that you should remove the '-t' from $SendmailArguments
+# if you use 'sendmail rather than 'sendmailpipe'
+
+Set($MailCommand , 'sendmailpipe');
+
+# $SendmailArguments defines what flags to pass to $Sendmail
+# assuming you picked 'sendmail' or 'sendmailpipe' as the $MailCommand above.
+# If you picked 'sendmailpipe', you MUST add a -t flag to $SendmailArguments
+
+# These options are good for most sendmail wrappers and workalikes
+Set($SendmailArguments , "-oi -t");
+
+# These arguments are good for sendmail brand sendmail 8 and newer
+#Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m");
+
+# If you selected 'sendmailpipe' above, you MUST specify the path
+# to your sendmail binary in $SendmailPath.
+# !! If you did not # select 'sendmailpipe' above, this has no effect!!
+Set($SendmailPath , "/usr/sbin/sendmail");
+
+# By default, RT sets the outgoing mail's "From:" header to
+# "SenderName via RT".  Setting this option to 0 disables it.
+
+Set($UseFriendlyFromLine , 1);
+
+# sprintf() format of the friendly 'From:' header; its arguments
+# are SenderName and SenderEmailAddress.
+Set($FriendlyFromLineFormat , "\"%s via RT\" <%s>");
+
+# RT can optionally set a "Friendly" 'To:' header when sending messages to
+# Ccs or AdminCcs (rather than having a blank 'To:' header.
+
+# This feature DOES NOT WORK WITH SENDMAIL[tm] BRAND SENDMAIL
+# If you are using sendmail, rather than postfix, qmail, exim or some other MTA,
+# you _must_ disable this option.
+
+Set($UseFriendlyToLine , 0);
+
+# sprintf() format of the friendly 'From:' header; its arguments
+# are WatcherType and TicketId.
+Set($FriendlyToLineFormat, "\"%s of $RT::rtname Ticket #%s\":;");
+
+# By default RT doesn't notify the person who performs an update, as they
+# already know what they've done. If you'd like to change this behaviour,
+# Set $NotifyActor to 1
+
+Set($NotifyActor, 0);
+
+
+# }}}
+
+# {{{ Logging
+
+# Logging.  The default is to log anything except debugging
+# information to syslog.  Check the Log::Dispatch POD for
+# information about how to get things by syslog, mail or anything
+# else, get debugging info in the log, etc.
+
+#  It might generally make
+# sense to send error and higher by email to some administrator.
+# If you do this, be careful that this email isn't sent to this RT instance.
+
+# the minimum level error that will be logged to the specific device.
+# levels from lowest to highest:
+#  debug info notice warning error critical alert emergency
+
+#  Mail loops will generate a critical log message.
+Set($LogToSyslog    , 'debug');
+Set($LogToScreen    , 'error');
+Set($LogToFile      , undef);
+Set($LogDir, '/opt/rt3/var/log');
+Set($LogToFileNamed , "rt.log");    #log to rt.log
+
+# }}}
+
+# {{{ Web interface configuration
+
+# Define the directory name to be used for images in rt web
+# documents.
+
+# If you're putting the web ui somewhere other than at the root of
+# your server
+# $WebPath requires a leading / but no trailing /
+
+Set($WebPath , "");
+
+# This is the Scheme, server and port for constructing urls to webrt
+# $WebBaseURL doesn't need a trailing /
+
+Set($WebBaseURL , "http://RT::WebBaseURL.not.configured:80");
+
+Set($WebURL , $WebBaseURL . $WebPath . "/");
+
+# $WebImagesURL points to the base URL where RT can find its images.
+# If you're running the FastCGI version of the RT web interface,
+# you should make RT's WebRT/html/NoAuth/images directory available on
+# a static web server and supply that URL as $WebImagesURL.
+
+Set($WebImagesURL , $WebURL . "NoAuth/images/");
+
+# $RTLogoURL points to the URL of the RT logo displayed in the web UI
+
+Set($LogoURL , $WebImagesURL . "rt.jpg");
+
+# if TrustHTMLAttachments is not defined, we will display them
+# as text. This prevents malicious HTML and javascript from being
+# sent in a request (although there is probably more to it than that)
+Set($TrustHTMLAttachments , undef);
+
+# If $WebExternalAuth is defined, RT will defer to the environment's
+# REMOTE_USER variable.
+
+Set($WebExternalAuth , undef);
+
+# If $WebFallbackToInternalAuth is undefined, the user is allowed a chance
+# of fallback to the login screen, even if REMOTE_USER failed.
+
+Set($WebFallbackToInternalAuth , undef);
+
+# $WebExternalGecos means to match 'gecos' field as the user identity);
+# useful with mod_auth_pwcheck and IIS Integrated Windows logon.
+
+Set($WebExternalGecos , undef);
+
+# $WebExternalAuto will create users under the same name as REMOTE_USER
+# upon login, if it's missing in the Users table.
+
+Set($WebExternalAuto , undef);
+
+# $WebSessionClass is the class you wish to use for managing Sessions.
+# It defaults to use your SQL database, but if you are using MySQL 3.x and
+# plans to use non-ascii Queue names, uncomment and add this line to
+# RT_SiteConfig.pm will prevent session corruption.
+
+# Set($WebSessionClass , 'Apache::Session::File');
+
+# }}}
+
+# {{{ RT UTF-8 Settings
+
+# An array that contains languages supported by RT's internationalization
+# interface.  Defaults to all *.po lexicons; set it to qw(en ja) will make
+# RT bilingual instead of multilingual, but will save same memory.
+
+@LexiconLanguages = qw(*) unless (@LexiconLanguages);
+
+# An array that contains default encodings used to guess which charset
+# an attachment uses if not specified.  Must be recognized by
+# Encode::Guess.
+
+@EmailInputEncodings = qw(utf-8 iso-8859-1 us-ascii) unless (@EmailInputEncodings);
+
+# The charset for localized email.  Must be recognized by Encode.
+
+Set($EmailOutputEncoding , 'utf-8');
+
+# }}}
+
+# {{{ RT Date Handling Options (for Time::ParseDate)
+
+# Set this to 1 if your local date convention looks like "dd/mm/yy"
+# instead of "mm/dd/yy".
+
+Set($DateDayBeforeMonth , 1);
+
+# Should "Tuesday" default to meaning "Next Tuesday" or "Last Tuesday"?
+# Set to 0 for "Next" or 1 for "Last".
+
+Set($AmbiguousDayInPast , 1);
+
+# }}}
+
+1;
diff --git a/rt/etc/RT_Config.pm.in b/rt/etc/RT_Config.pm.in
new file mode 100644 (file)
index 0000000..5f97eb0
--- /dev/null
@@ -0,0 +1,349 @@
+#
+# WARNING: NEVER EDIT RT_Config.pm. Instead, copy any sections you want to change to RT_SiteConfig.pm
+# and edit them there.
+#
+
+package RT;
+
+=head1 NAME
+
+RT::Config
+
+=for testing
+
+use RT::Config;
+
+=cut
+
+# {{{ Base Configuration
+
+# $rtname the string that RT will look for in mail messages to
+# figure out what ticket a new piece of mail belongs to
+
+# Your domain name is recommended, so as not to pollute the namespace.
+# once you start using a given tag, you should probably never change it.
+# (otherwise, mail for existing tickets won't get put in the right place
+
+Set($rtname , "example.com");
+
+# You should set this to your organization's DNS domain. For example,
+# fsck.com or asylum.arkham.ma.us. It's used by the linking interface to
+# guarantee that ticket URIs are unique and easy to construct.
+
+Set($Organization , "example.com");
+
+# $user_passwd_min defines the minimum length for user passwords. Setting
+# it to 0 disables this check
+Set($MinimumPasswordLength , "5");
+
+# $Timezone is used to convert times entered by users into GMT and back again
+# It should be set to a timezone recognized by your local unix box.
+Set($Timezone , 'US/Eastern');
+
+# }}}
+
+# }}}
+
+# {{{ Database Configuration
+
+# Database driver beeing used. Case matters
+# Valid types are "mysql" and "Pg"
+
+Set($DatabaseType , '@DB_TYPE@');
+
+# The domain name of your database server
+# If you're running mysql and it's on localhost,
+# leave it blank for enhanced performance
+Set($DatabaseHost   , '@DB_HOST@');
+Set($DatabaseRTHost , '@DB_RT_HOST@');
+
+# The port that your database server is running on.  Ignored unless it's
+# a positive integer. It's usually safe to leave this blank
+Set($DatabasePort , '@DB_PORT@');
+
+#The name of the database user (inside the database)
+Set($DatabaseUser , '@DB_RT_USER@');
+
+# Password the DatabaseUser should use to access the database
+Set($DatabasePassword , '@DB_RT_PASS@');
+
+# The name of the RT's database on your database server
+Set($DatabaseName , '@DB_DATABASE@');
+
+# If you're using Postgres and have compiled in SSL support,
+# set DatabaseRequireSSL to 1 to turn on SSL communication
+Set($DatabaseRequireSSL , undef);
+
+# }}}
+
+# {{{ Incoming mail gateway configuration
+
+# OwnerEmail is the address of a human who manages RT. RT will send
+# errors generated by the mail gateway to this address.  This address
+# should _not_ be an address that's managed by your RT instance.
+
+Set($OwnerEmail , 'root');
+
+# If $LoopsToRTOwner is defined, RT will send mail that it believes
+# might be a loop to $RT::OwnerEmail
+
+Set($LoopsToRTOwner , 1);
+
+# If $StoreLoopss is defined, RT will record messages that it believes
+# to be part of mail loops.
+# As it does this, it will try to be careful not to send mail to the
+# sender of these messages
+
+Set($StoreLoops , undef);
+
+# $MaxAttachmentSize sets the maximum size (in bytes) of attachments stored
+# in the database.
+
+# For mysql and oracle, we set this size at 10 megabytes.
+# If you're running a postgres version earlier than 7.1, you will need
+# to drop this to 8192. (8k)
+
+Set($MaxAttachmentSize , 10000000);
+
+# $TruncateLongAttachments: if this is set to a non-undef value,
+# RT will truncate attachments longer than MaxAttachmentLength.
+
+Set($TruncateLongAttachments , undef);
+
+# $DropLongAttachments: if this is set to a non-undef value,
+# RT will silently drop attachments longer than MaxAttachmentLength.
+
+Set($DropLongAttachments , undef);
+
+# If $ParseNewMessageForTicketCcs is true, RT will attempt to divine
+# Ticket 'Cc' watchers from the To and Cc lines of incoming messages
+# Be forewarned that if you have _any_ addresses which forward mail to
+# RT automatically and you enable this option without modifying
+# "RTAddressRegexp" below, you will get yourself into a heap of trouble.
+
+Set($ParseNewMessageForTicketCcs , undef);
+
+# RTAddressRegexp is used to make sure RT doesn't add itself as a ticket CC if
+# the setting above is enabled.
+
+Set($RTAddressRegexp , '^rt\@example.com$');
+
+# RT provides functionality which allows the system to rewrite
+# incoming email addresses.  In its simplest form,
+# you can substitute the value in CanonicalizeEmailAddressReplace
+# for the value in CanonicalizeEmailAddressMatch
+# (These values are passed to the CanonicalizeEmailAddress subroutine in RT/User.pm)
+# By default, that routine performs a s/$Match/$Replace/gi on any address passed to it
+
+Set($CanonicalizeEmailAddressMatch   , 'subdomain.example.com$');
+Set($CanonicalizeEmailAddressReplace , 'example.com');
+
+# If $SenderMustExistInExternalDatabase is true, RT will refuse to
+# create non-privileged accounts for unknown users if you are using
+# the "LookupSenderInExternalDatabase" option.
+# Instead, an error message will be mailed and RT will forward the
+# message to $RTOwner.
+#
+# If you are not using $LookupSenderInExternalDatabase, this option
+# has no effect.
+#
+# If you define an AutoRejectRequest template, RT will use this
+# template for the rejection message.
+
+Set($SenderMustExistInExternalDatabase , undef);
+
+# }}}
+
+# {{{ Outgoing mail configuration
+
+# RT is designed such that any mail which already has a ticket-id associated
+# with it will get to the right place automatically.
+
+# $CorrespondAddress and $CommentAddress are the default addresses
+# that will be listed in From: and Reply-To: headers of correspondence
+# and comment mail tracked by RT, unless overridden by a queue-specific
+# address.
+
+Set($CorrespondAddress , 'RT::CorrespondAddress.not.set');
+
+Set($CommentAddress , 'RT::CommentAddress.not.set');
+
+#Sendmail Configuration
+
+# $MailCommand defines which method RT will use to try to send mail
+# We know that 'sendmailpipe' works fairly well.
+# If 'sendmailpipe' doesn't work well for you, try 'sendmail'
+#
+# Note that you should remove the '-t' from $SendmailArguments
+# if you use 'sendmail rather than 'sendmailpipe'
+
+Set($MailCommand , 'sendmailpipe');
+
+# $SendmailArguments defines what flags to pass to $Sendmail
+# assuming you picked 'sendmail' or 'sendmailpipe' as the $MailCommand above.
+# If you picked 'sendmailpipe', you MUST add a -t flag to $SendmailArguments
+
+# These options are good for most sendmail wrappers and workalikes
+Set($SendmailArguments , "-oi -t");
+
+# These arguments are good for sendmail brand sendmail 8 and newer
+#Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m");
+
+# If you selected 'sendmailpipe' above, you MUST specify the path
+# to your sendmail binary in $SendmailPath.
+# !! If you did not # select 'sendmailpipe' above, this has no effect!!
+Set($SendmailPath , "/usr/sbin/sendmail");
+
+# By default, RT sets the outgoing mail's "From:" header to
+# "SenderName via RT".  Setting this option to 0 disables it.
+
+Set($UseFriendlyFromLine , 1);
+
+# sprintf() format of the friendly 'From:' header; its arguments
+# are SenderName and SenderEmailAddress.
+Set($FriendlyFromLineFormat , "\"%s via RT\" <%s>");
+
+# RT can optionally set a "Friendly" 'To:' header when sending messages to
+# Ccs or AdminCcs (rather than having a blank 'To:' header.
+
+# This feature DOES NOT WORK WITH SENDMAIL[tm] BRAND SENDMAIL
+# If you are using sendmail, rather than postfix, qmail, exim or some other MTA,
+# you _must_ disable this option.
+
+Set($UseFriendlyToLine , 0);
+
+# sprintf() format of the friendly 'From:' header; its arguments
+# are WatcherType and TicketId.
+Set($FriendlyToLineFormat, "\"%s of $RT::rtname Ticket #%s\":;");
+
+# By default RT doesn't notify the person who performs an update, as they
+# already know what they've done. If you'd like to change this behaviour,
+# Set $NotifyActor to 1
+
+Set($NotifyActor, 0);
+
+
+# }}}
+
+# {{{ Logging
+
+# Logging.  The default is to log anything except debugging
+# information to syslog.  Check the Log::Dispatch POD for
+# information about how to get things by syslog, mail or anything
+# else, get debugging info in the log, etc.
+
+#  It might generally make
+# sense to send error and higher by email to some administrator.
+# If you do this, be careful that this email isn't sent to this RT instance.
+
+# the minimum level error that will be logged to the specific device.
+# levels from lowest to highest:
+#  debug info notice warning error critical alert emergency
+
+#  Mail loops will generate a critical log message.
+Set($LogToSyslog    , 'debug');
+Set($LogToScreen    , 'error');
+Set($LogToFile      , undef);
+Set($LogDir, '@RT_LOG_PATH@');
+Set($LogToFileNamed , "rt.log");    #log to rt.log
+
+# }}}
+
+# {{{ Web interface configuration
+
+# Define the directory name to be used for images in rt web
+# documents.
+
+# If you're putting the web ui somewhere other than at the root of
+# your server
+# $WebPath requires a leading / but no trailing /
+
+Set($WebPath , "");
+
+# This is the Scheme, server and port for constructing urls to webrt
+# $WebBaseURL doesn't need a trailing /
+
+Set($WebBaseURL , "http://RT::WebBaseURL.not.configured:80");
+
+Set($WebURL , $WebBaseURL . $WebPath . "/");
+
+# $WebImagesURL points to the base URL where RT can find its images.
+# If you're running the FastCGI version of the RT web interface,
+# you should make RT's WebRT/html/NoAuth/images directory available on
+# a static web server and supply that URL as $WebImagesURL.
+
+Set($WebImagesURL , $WebURL . "NoAuth/images/");
+
+# $RTLogoURL points to the URL of the RT logo displayed in the web UI
+
+Set($LogoURL , $WebImagesURL . "rt.jpg");
+
+# if TrustHTMLAttachments is not defined, we will display them
+# as text. This prevents malicious HTML and javascript from being
+# sent in a request (although there is probably more to it than that)
+Set($TrustHTMLAttachments , undef);
+
+# If $WebExternalAuth is defined, RT will defer to the environment's
+# REMOTE_USER variable.
+
+Set($WebExternalAuth , undef);
+
+# If $WebFallbackToInternalAuth is undefined, the user is allowed a chance
+# of fallback to the login screen, even if REMOTE_USER failed.
+
+Set($WebFallbackToInternalAuth , undef);
+
+# $WebExternalGecos means to match 'gecos' field as the user identity);
+# useful with mod_auth_pwcheck and IIS Integrated Windows logon.
+
+Set($WebExternalGecos , undef);
+
+# $WebExternalAuto will create users under the same name as REMOTE_USER
+# upon login, if it's missing in the Users table.
+
+Set($WebExternalAuto , undef);
+
+# $WebSessionClass is the class you wish to use for managing Sessions.
+# It defaults to use your SQL database, but if you are using MySQL 3.x and
+# plans to use non-ascii Queue names, uncomment and add this line to
+# RT_SiteConfig.pm will prevent session corruption.
+
+# Set($WebSessionClass , 'Apache::Session::File');
+
+# }}}
+
+# {{{ RT UTF-8 Settings
+
+# An array that contains languages supported by RT's internationalization
+# interface.  Defaults to all *.po lexicons; set it to qw(en ja) will make
+# RT bilingual instead of multilingual, but will save same memory.
+
+@LexiconLanguages = qw(*) unless (@LexiconLanguages);
+
+# An array that contains default encodings used to guess which charset
+# an attachment uses if not specified.  Must be recognized by
+# Encode::Guess.
+
+@EmailInputEncodings = qw(utf-8 iso-8859-1 us-ascii) unless (@EmailInputEncodings);
+
+# The charset for localized email.  Must be recognized by Encode.
+
+Set($EmailOutputEncoding , 'utf-8');
+
+# }}}
+
+# {{{ RT Date Handling Options (for Time::ParseDate)
+
+# Set this to 1 if your local date convention looks like "dd/mm/yy"
+# instead of "mm/dd/yy".
+
+Set($DateDayBeforeMonth , 1);
+
+# Should "Tuesday" default to meaning "Next Tuesday" or "Last Tuesday"?
+# Set to 0 for "Next" or 1 for "Last".
+
+Set($AmbiguousDayInPast , 1);
+
+# }}}
+
+1;
diff --git a/rt/etc/RT_SiteConfig.pm b/rt/etc/RT_SiteConfig.pm
new file mode 100644 (file)
index 0000000..0afc604
--- /dev/null
@@ -0,0 +1 @@
+1;
diff --git a/rt/etc/constraints.mysql b/rt/etc/constraints.mysql
new file mode 100644 (file)
index 0000000..33a0376
--- /dev/null
@@ -0,0 +1,52 @@
+#ALTER TABLE Users ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+#ALTER TABLE Users ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  ALTER TABLE Links ADD FOREIGN KEY (LocalBase) REFERENCES Tickets(id) ;
+  ALTER TABLE Links ADD FOREIGN KEY (LocalTarget) REFERENCES Tickets(id);
+        ObjectId integer, #  FOREIGN KEY to Users or Groups, depending
+  ALTER TABLE Tickets ADD FOREIGN KEY (Queue) REFERENCES Queues(id);
+  ALTER TABLE Tickets ADD FOREIGN KEY (EffectiveId) REFERENCES Tickets(id);
+  ALTER TABLE Tickets ADD FOREIGN KEY (Owner) REFERENCES Principals(id);
+  ALTER TABLE Tickets ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE Tickets ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  ALTER TABLE Transactions ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE Transactions ADD FOREIGN KEY (Ticket) REFERENCES Tickets(id);
+  ALTER TABLE Transactions ADD FOREIGN KEY (EffectiveTicket) REFERENCES Tickets(id);
+  ALTER TABLE Attachments ADD FOREIGN KEY (TransactionId) REFERENCES Transactions(id);
+  ALTER TABLE Attachments ADD FOREIGN KEY (Parent) REFERENCES Attachments(id);
+  ALTER TABLE Scrips ADD FOREIGN KEY (ScripCondition) REFERENCES ScripConditions(id);
+  ALTER TABLE Scrips ADD FOREIGN KEY (ScripAction) REFERENCES ScripActions(id);
+  ALTER TABLE Scrips ADD FOREIGN KEY (Template) REFERENCES Templates(id);
+  ALTER TABLE Scrips ADD FOREIGN KEY (Queue) REFERENCES Queues(id);
+  ALTER TABLE Scrips ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE Scrips ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  PrincipalId integer NOT NULL  , #ALTER TABLE ADD FOREIGN KEY to principals
+  DelegatedBy integer NOT NULL default 0, #ALTER TABLE ADD FOREIGN KEY to principals with a userid
+  DelegatedFrom integer NOT NULL default 0, #ALTER TABLE ADD FOREIGN KEY to ACL
+  ALTER TABLE ACL ADD FOREIGN KEY (PrincipalId) REFERENCES Principals(id);
+  ALTER TABLE ACL ADD FOREIGN KEY (DelegatedBy) REFERENCES Principals(id);
+  ALTER TABLE ACL ADD FOREIGN KEY (DelegatedFrom) REFERENCES ACL(id);
+  ALTER TABLE GroupMembers ADD FOREIGN KEY (GroupId) REFERENCES Principals(id);
+  ALTER TABLE GroupMembers ADD FOREIGN KEY (MemberId) REFERENCES Principals(id);
+        GroupId int, # ALTER TABLE ADD FOREIGN KEY to Principals
+        MemberId int, # ALTER TABLE ADD FOREIGN KEY to Principals
+        Via int, #ALTER TABLE ADD FOREIGN KEY to CachedGroupMembers. (may point to $self->id)
+        ImmediateParentId int, #ALTER TABLE ADD FOREIGN KEY to prinicpals.         
+  ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (ImmediateParentId) REFERENCES Principals(id);
+  ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (GroupId) REFERENCES Principals(id);
+  ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (MemberId) REFERENCES Principals(id);
+  ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (Via) REFERENCES CachedGroupMembers(id);
+  ALTER TABLE ScripActions ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE ScripActions ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  ALTER TABLE Templates ADD FOREIGN KEY (Queue) REFERENCES Queues(id);
+  ALTER TABLE Templates ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE Templates ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  ALTER TABLE CustomFields ADD FOREIGN KEY (Queue) REFERENCES Queues(id);
+  ALTER TABLE CustomFields ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE CustomFields ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (Ticket) REFERENCES Ticketss(id);
+  ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (CustomField) REFERENCES CustomFields(id);
+  ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
+  ALTER TABLE CustomFieldValues ADD FOREIGN KEY (CustomField) REFERENCES CustomFields(id);
+  ALTER TABLE CustomFieldValues ADD FOREIGN KEY (Creator) REFERENCES Users(id);
+  ALTER TABLE CustomFieldValues ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id);
diff --git a/rt/etc/initialdata b/rt/etc/initialdata
new file mode 100644 (file)
index 0000000..62b35ac
--- /dev/null
@@ -0,0 +1,569 @@
+# Initial data for a fresh RT3 Installation.
+
+@Users = (
+    {  Name     => 'Nobody',
+       RealName => 'Nobody in particular',
+       Comments => 'Do not delete or modify this user. It is integral '
+         . 'to RT\'s internal data structures',
+       Privileged => '0', },
+
+    {  Name         => 'root',
+       Gecos        => 'root',
+       RealName     => 'Enoch Root',
+       Password     => 'password',
+       EmailAddress => "root\@localhost",
+       Comments     => 'SuperUser',
+       Privileged   => '1', } );
+
+@Groups = (
+    { Name        => '',
+      Type        => 'Everyone',                        # loc
+      Domain      => 'SystemInternal',
+      Instance    => '',
+      Description => 'Pseudogroup for internal use',    # loc
+    },
+    { Type        => 'Privileged',                      # loc
+      Domain      => 'SystemInternal',
+      Instance    => '',
+      Name        => '',
+      Description => 'Pseudogroup for internal use',    # loc
+    },
+    { Name        => '',
+      Type        => 'Unprivileged',                    # loc
+      Domain      => 'SystemInternal',
+      Instance    => '',
+      Description => 'Pseudogroup for internal use',    # loc
+    },
+    { Name        => '',
+      Type        => 'Owner',                               # loc
+      Domain      => 'RT::System-Role',
+      Instance    => '',
+      Description => 'SystemRolegroup for internal use',    # loc
+    },
+    { Name        => '',
+      Type        => 'Requestor',                           # loc
+      Domain      => 'RT::System-Role',
+      Instance    => '',
+      Description => 'SystemRolegroup for internal use',    # loc
+    },
+    { Name        => '',
+      Type        => 'Cc',                                  # loc
+      Domain      => 'RT::System-Role',
+      Instance    => '',
+      Description => 'SystemRolegroup for internal use',    # loc
+    },
+    { Name        => '',
+      Type        => 'AdminCc',                             # loc
+      Domain      => 'RT::System-Role',
+      Instance    => '',
+      Description => 'Pseudogroup for internal use',        # loc
+    }, );
+
+@Queues = ({ Name              => 'General',
+             Description       => 'The default queue',
+             CorrespondAddress => "",
+             CommentAddress    => "", },
+           { Name        => '___Approvals',
+             Description => 'A system-internal queue for the approvals system',
+             Disabled    => 2, } );
+
+@ScripActions = (
+
+    {  Name        => 'Autoreply To Requestors',    # loc
+       Description =>
+'Always sends a message to the requestors independent of message sender' ,                                            # loc
+       ExecModule => 'Autoreply',
+       Argument   => 'Requestor' },
+    { Name        => 'Notify Requestors',                    # loc
+      Description => 'Sends a message to the requestors',    # loc
+      ExecModule  => 'Notify',
+      Argument    => 'Requestor' },
+    { Name        => 'Notify Owner as Comment',              # loc
+      Description => 'Sends mail to the owner',              # loc
+      ExecModule  => 'NotifyAsComment',
+      Argument    => 'Owner' },
+    { Name        => 'Notify Owner',                         # loc
+      Description => 'Sends mail to the owner',              # loc
+      ExecModule  => 'Notify',
+      Argument    => 'Owner' },
+    { Name        => 'Notify AdminCcs as Comment',                        # loc
+      Description => 'Sends mail to the administrative Ccs as a comment', # loc
+      ExecModule  => 'NotifyAsComment',
+      Argument    => 'AdminCc' },
+    { Name        => 'Notify AdminCcs',                                   # loc
+      Description => 'Sends mail to the administrative Ccs',              # loc
+      ExecModule  => 'Notify',
+      Argument    => 'AdminCc' },
+
+    { Name        => 'Notify Requestors and Ccs as Comment',              # loc
+      Description => 'Send mail to requestors and Ccs as a comment',      # loc
+      ExecModule  => 'NotifyAsComment',
+      Argument    => 'Requestor,Cc' },
+
+    { Name        => 'Notify Requestors and Ccs',                         # loc
+      Description => 'Send mail to requestors and Ccs',                   # loc
+      ExecModule  => 'Notify',
+      Argument    => 'Requestor,Cc' },
+
+    { Name        => 'Notify Requestors, Ccs and AdminCcs as Comment',    # loc
+      Description => 'Send mail to all watchers as a "comment"',          # loc
+      ExecModule  => 'NotifyAsComment',
+      Argument    => 'All' },
+    { Name        => 'Notify Requestors, Ccs and AdminCcs',               # loc
+      Description => 'Send mail to all watchers',                         # loc
+      ExecModule  => 'Notify',
+      Argument    => 'All' },
+    { Name        => 'Notify Other Recipients as Comment',                # loc
+      Description => 'Sends mail to explicitly listed Ccs and Bccs',      # loc
+      ExecModule  => 'NotifyAsComment',
+      Argument    => 'OtherRecipients' },
+    { Name        => 'Notify Other Recipients',                           # loc
+      Description => 'Sends mail to explicitly listed Ccs and Bccs',      # loc
+      ExecModule  => 'Notify',
+      Argument    => 'OtherRecipients' },
+    { Name        => 'User Defined',                                      # loc
+      Description => 'Perform a user-defined action',                     # loc
+      ExecModule  => 'UserDefined', },
+    {  Name        => 'Create Tickets',                                    # loc
+       Description =>
+         'Create new tickets based on this scrip\'s template',             # loc
+       ExecModule => 'CreateTickets', },
+    { Name        => 'Open Tickets',
+      Description => 'Open tickets on correspondence',                    # loc
+      ExecModule  => 'AutoOpen' },
+);
+
+@ScripConditions = (
+    { Name                 => 'On Create',                                # loc
+      Description          => 'When a ticket is created',                 # loc
+      ApplicableTransTypes => 'Create',
+      ExecModule           => 'AnyTransaction', },
+
+    { Name                 => 'On Transaction',                           # loc
+      Description          => 'When anything happens',                    # loc
+      ApplicableTransTypes => 'Any',
+      ExecModule           => 'AnyTransaction', },
+    {
+
+      Name                 => 'On Correspond',                             # loc
+      Description          => 'Whenever correspondence comes in',          # loc
+      ApplicableTransTypes => 'Correspond',
+      ExecModule           => 'AnyTransaction', },
+
+    {
+
+      Name                 => 'On Comment',                                # loc
+      Description          => 'Whenever comments come in',                 # loc
+      ApplicableTransTypes => 'Comment',
+      ExecModule           => 'AnyTransaction' },
+    {
+
+      Name                 => 'On Status Change',                          # loc
+      Description          => 'Whenever a ticket\'s status changes',       # loc
+      ApplicableTransTypes => 'Status',
+      ExecModule           => 'AnyTransaction',
+
+    },
+    {
+
+      Name                 => 'On Owner Change',                           # loc
+      Description          => 'Whenever a ticket\'s owner changes',        # loc
+      ApplicableTransTypes => 'Any',
+      ExecModule           => 'OwnerChange',
+
+    },
+    {
+
+      Name                 => 'On Queue Change',                           # loc
+      Description          => 'Whenever a ticket\'s queue changes',        # loc
+      ApplicableTransTypes => 'Set',
+      ExecModule           => 'QueueChange',
+
+    },
+    {  Name                 => 'On Resolve',                               # loc
+       Description          => 'Whenever a ticket is resolved',            # loc
+       ApplicableTransTypes => 'Status',
+       ExecModule           => 'StatusChange',
+       Argument             => 'resolved'
+
+    },
+
+    {  Name                 => 'User Defined',                             # loc
+       Description          => 'Whenever a user-defined condition occurs', # loc
+       ApplicableTransTypes => 'Any',
+       ExecModule           => 'UserDefined'
+
+    },
+
+);
+
+@Templates = (
+    { Queue       => '0',
+      Name        => 'Blank',                                             # loc
+      Description => 'A blank template',                                  # loc
+      Content     => '', },
+    {  Queue       => '0',
+       Name        => 'Autoreply',                                         # loc
+       Description => 'Default Autoresponse template',                     # loc
+       Content     => 'Subject: AutoReply: {$Ticket->Subject}
+
+
+Greetings,
+
+This message has been automatically generated in response to the
+creation of a trouble ticket regarding:
+       "{$Ticket->Subject()}", 
+a summary of which appears below.
+
+There is no need to reply to this message right now.  Your ticket has been
+assigned an ID of [{$rtname} #{$Ticket->id()}].
+
+Please include the string:
+
+         [{$rtname} #{$Ticket->id}]
+
+in the subject line of all future correspondence about this issue. To do so, 
+you may reply to this message.
+
+                        Thank you,
+                        {$Ticket->QueueObj->CorrespondAddress()}
+
+-------------------------------------------------------------------------
+{$Transaction->Content()}
+'
+    },
+
+    {  Queue       => '0',
+       Name        => 'Transaction',                     # loc
+       Description => 'Default transaction template',    # loc
+       Content     => 'RT-Attach-Message: yes
+
+
+{$Transaction->CreatedAsString}: Request {$Ticket->id} was acted upon.
+Transaction: {$Transaction->Description}
+       Queue: {$Ticket->QueueObj->Name}
+     Subject: {$Transaction->Subject || $Ticket->Subject || "(No subject given)"}
+       Owner: {$Ticket->OwnerObj->Name}
+  Requestors: {$Ticket->RequestorAddresses}
+      Status: {$Ticket->Status}
+ Ticket <URL: {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} >
+
+
+{$Transaction->Content()}
+'
+    },
+
+    {
+
+      Queue       => '0',
+      Name        => 'Admin Correspondence',                     # loc
+      Description => 'Default admin correspondence template',    # loc
+      Content     => 'RT-Attach-Message: yes
+
+
+<URL: {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} >
+
+{$Transaction->Content()}
+'
+    },
+
+    {  Queue       => '0',
+       Name        => 'Correspondence',                          # loc
+       Description => 'Default correspondence template',         # loc
+       Content     => 'RT-Attach-Message: yes
+
+{$Transaction->Content()}
+'
+    },
+
+    {  Queue       => '0',
+       Name        => 'Admin Comment',                           # loc
+       Description => 'Default admin comment template',          # loc
+       Content     =>
+'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject); $s =~ s/\\[Comment\\]//g; $comment =~ s/^Re//i; $s;}
+
+
+{$RT::WebURL}Ticket/Display.html?id={$Ticket->id}
+This is a comment.  It is not sent to the Requestor(s):
+
+{$Transaction->Content()}
+'
+    },
+
+    {  Queue       => '0',
+       Name        => 'Status Change',                                     # loc
+       Description => 'Ticket status changed',                             # loc
+       Content     => 'Subject: Status Changed to: {$Transaction->NewValue}
+
+
+{$RT::WebURL}Ticket/Display.html?id={$Ticket->id}
+
+{$Transaction->Content()}
+'
+    },
+
+    {
+
+      Queue       => '0',
+      Name        => 'Resolved',                 # loc
+      Description => 'Ticket Resolved',          # loc
+      Content     => 'Subject: Ticket Resolved
+
+According to our records, your request has been resolved. If you have any
+further questions or concerns, please respond to this message.
+'
+    },
+    {  Queue       => '___Approvals',
+       Name        => "New Pending Approval",    # loc
+       Description =>
+         "Notify Owners and AdminCcs of new items pending their approval", # loc
+       Content => 'Subject: New Pending Approval: {$Ticket->Subject}
+
+Greetings,
+
+There is a new item pending your approval: "{$Ticket->Subject()}", 
+a summary of which appears below.
+
+Please visit {$RT::WebURL}Approvals/Display.html?id={$Ticket->id}
+to approve or reject this ticket, or {$RT::WebURL}Approvals/ to
+batch-process all your pending approvals.
+
+-------------------------------------------------------------------------
+{$Transaction->Content()}
+'
+    },
+    {  Queue       => '___Approvals',
+       Name        => "Approval Passed",    # loc
+       Description =>
+         "Notify Owner of their ticket has been approved by some approver", # loc
+       Content => 'Subject: Ticket Rejected: {$Ticket->Subject}
+
+Greetings,
+
+Your ticket has been approved by { eval { $Approval->OwnerObj->Name } }.
+Other approvals may be pending.
+'
+    },
+    {  Queue       => '___Approvals',
+       Name        => "All Approvals Passed",    # loc
+       Description =>
+         "Notify Owner of their ticket has been approved by all approvers", # loc
+       Content => 'Subject: Ticket Rejected: {$Ticket->Subject}
+
+Greetings,
+
+Your ticket has been approved.  Its Owner may now start to act on it.
+'
+    },
+    {  Queue       => '___Approvals',
+       Name        => "Approval Rejected",    # loc
+       Description =>
+         "Notify Owner of their rejected ticket", # loc
+       Content => 'Subject: Ticket Rejected: {$Ticket->Subject}
+
+Greetings,
+
+Your ticket has been rejected by { eval { $Approval->OwnerObj->Name } }.
+'
+    },
+);
+# }}}
+
+@Scrips = (
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Open Tickets',
+       Template       => 'Blank' },
+    {  ScripCondition => 'On Create',
+       ScripAction    => 'AutoReply To Requestors',
+       Template       => 'AutoReply' },
+    {  ScripCondition => 'On Create',
+       ScripAction    => 'Notify AdminCcs',
+       Template       => 'Transaction' },
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Notify AdminCcs',
+       Template       => 'Admin Correspondence' },
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Notify Requestors And Ccs',
+       Template       => 'Correspondence' },
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Notify Other Recipients',
+       Template       => 'Correspondence' },
+    {  ScripCondition => 'On Comment',
+       ScripAction    => 'Notify AdminCcs As Comment',
+       Template       => 'Admin Comment' },
+    {  ScripCondition => 'On Comment',
+       ScripAction    => 'Notify Other Recipients As Comment',
+       Template       => 'Correspondence' },
+    {  ScripCondition => 'On Resolve',
+       ScripAction    => 'Notify Requestors',
+       Template       => 'Resolved' },
+    {  Description => "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval",    # loc
+       Queue          => '___Approvals',
+       ScripCondition => 'User Defined',
+       CustomIsApplicableCode => q[
+           $self->TicketObj->Type eq 'approval'        and
+           $self->TransactionObj->Field eq 'Status'    and
+           $self->TransactionObj->NewValue eq 'open'   and
+           eval { $T::Approving = ($self->TicketObj->AllDependedOnBy( Type => 'ticket' ))[0] }
+       ],
+       ScripAction    => 'Notify Owner',
+       Template       => 'New Pending Approval' },
+    {  Description => "If an approval is rejected, reject the original and delete pending approvals",    # loc
+       Queue            => '___Approvals',
+       ScripCondition   => 'On Status Change',
+       ScripAction      => 'User Defined',
+       CustomPrepareCode => q[
+# ------------------------------------------------------------------- #
+return(0) unless ( lc($self->TransactionObj->NewValue) eq "rejected" or
+                  lc($self->TransactionObj->NewValue) eq "deleted" );
+
+my $rejected = 0;
+my $links = $self->TicketObj->DependedOnBy;
+foreach my $link (@{ $links->ItemsArrayRef }) {
+    my $obj = $link->BaseObj;
+    if ($obj->QueueObj->IsActiveStatus($obj->Status)) {
+       if ($obj->Type eq 'ticket') {
+           $obj->Comment(
+               Content => $self->loc("Your request was rejected."),
+           );
+           $obj->SetStatus(
+               Status  => 'rejected',
+               Force   => 1,
+           );
+
+           $T::Approval = $self->TicketObj; # so we can access it inside templates
+           $self->{TicketObj} = $obj;  # we want the original id in the token line
+           $rejected = 1;
+       }
+       else {
+           $obj->SetStatus(
+               Status  => 'deleted',
+               Force   => 1,
+           );
+       }
+    }
+}
+
+$links = $self->TicketObj->DependsOn;
+foreach my $link (@{ $links->ItemsArrayRef }) {
+    my $obj = $link->TargetObj;
+    if ($obj->QueueObj->IsActiveStatus($obj->Status)) {
+       $obj->SetStatus(
+           Status      => 'deleted',
+           Force       => 1,
+       );
+    }
+}
+
+# Now magically turn myself into a Requestor Notify object...
+require RT::Action::Notify; bless($self, 'RT::Action::Notify');
+$self->{Argument} = 'Requestor'; $self->Prepare;
+
+return $rejected;
+# ------------------------------------------------------------------- #
+       ],
+       CustomCommitCode => '"never needed"',
+       Template          => 'Approval Rejected', },
+    {  Description => "When a ticket has been approved by any approver, add correspondence to the original ticket", # loc
+       Queue             => '___Approvals',
+       ScripCondition    => 'On Resolve',
+       ScripAction       => 'User Defined',
+       CustomPrepareCode => q[
+# ------------------------------------------------------------------- #
+return(0) unless ($self->TicketObj->Type eq 'approval');
+
+my $note;
+my $t = $self->TicketObj->Transactions;
+while (my $o = $t->Next) {
+    $note .= $o->Content . "\n" if $o->ContentObj
+           and $o->Content !~ /Default Approval/;
+}
+
+foreach my $obj ($self->TicketObj->AllDependedOnBy( Type => 'ticket' )) {
+    $obj->Comment(
+       Content => $self->loc( "Your request has been approved by [_1]. Other approvals may still be pending.", # loc
+           $self->TransactionObj->CreatorObj->Name,
+       ) . "\n" . $self->loc( "Approver's notes: [_1]", # loc
+           $note
+       ),
+    );
+    $T::Approval = $self->TicketObj; # so we can access it inside templates
+    $self->{TicketObj} = $obj;  # we want the original id in the token line
+}
+
+# Now magically turn myself into a Requestor Notify object...
+require RT::Action::Notify; bless($self, 'RT::Action::Notify');
+$self->{Argument} = 'Requestor'; $self->Prepare;
+
+return 1;
+# ------------------------------------------------------------------- #
+       ],
+       CustomCommitCode => '"never needed"',
+       Template => 'Approval Passed' },
+    {  Description => "When a ticket has been approved by all approvers, add correspondence to the original ticket", # loc
+       Queue             => '___Approvals',
+       ScripCondition    => 'On Resolve',
+       ScripAction       => 'User Defined',
+       CustomPrepareCode  => q[
+# ------------------------------------------------------------------- #
+# Find all the tickets that depend on this (that this is approving)
+
+my $Ticket = $self->TicketObj;
+my @TOP    = $Ticket->AllDependedOnBy( Type => 'ticket' );
+my $links  = $Ticket->DependedOnBy;
+my $passed = 0;
+
+while (my $link = $links->Next) {
+    my $obj = $link->BaseObj;
+    next if ($obj->HasUnresolvedDependencies( Type => 'approval' ));
+
+    if ($obj->Type eq 'ticket') {
+       $obj->Comment(
+           Content     => $self->loc("Your request has been approved."),
+       );
+       $T::Approval  = $Ticket;    # so we can access it inside templates
+       $self->{TicketObj} = $obj;  # we want the original id in the token line
+       $passed = 1;
+    }
+    elsif ($obj->Type eq 'approval') {
+       $obj->SetStatus( Status => 'open', Force => 1 );
+    }
+    elsif ($RT::UseCodeTickets and $obj->Type eq 'code') {
+       my $code = $obj->Transactions->First->Content;
+       my $rv;
+
+       foreach my $TOP (@TOP) {
+           local $@;
+           $rv++ if eval $code;
+           $RT::Logger->error("Cannot eval code: $@") if $@;
+       }
+
+       if ($rv or !@TOP) {
+           $obj->SetStatus( Status     => 'resolved', Force    => 1,);
+       }
+       else {
+           $obj->SetStatus( Status     => 'rejected', Force    => 1,);
+       }
+    }
+}
+
+# Now magically turn myself into a Requestor Notify object...
+require RT::Action::Notify; bless($self, 'RT::Action::Notify');
+$self->{Argument} = 'Requestor'; $self->Prepare;
+
+return $passed;
+# ------------------------------------------------------------------- #
+       ],
+       CustomCommitCode => '"never needed"',
+       Template => 'All Approvals Passed', },
+
+);
+
+@ACL = (
+    { UserId => 'Nobody',      # - principalId
+      Right  => 'OwnTicket', },
+
+    { UserId => 'root',        # - principalid
+      Right  => 'SuperUser', },
+
+);
diff --git a/rt/etc/schema.SQLite b/rt/etc/schema.SQLite
new file mode 100644 (file)
index 0000000..f24bdbd
--- /dev/null
@@ -0,0 +1,384 @@
+--- {{{ Attachments
+
+CREATE TABLE Attachments (
+  id INTEGER PRIMARY KEY  ,
+  TransactionId INTEGER  ,
+  Parent integer NULL  ,
+  MessageId varchar(160) NULL  ,
+  Subject varchar(255) NULL  ,
+  Filename varchar(255) NULL  ,
+  ContentType varchar(80) NULL  ,
+  ContentEncoding varchar(80) NULL  ,
+  Content LONGTEXT NULL  ,
+  Headers LONGTEXT NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL 
+  
+) ;
+
+CREATE INDEX Attachments1 ON Attachments (Parent) ;
+CREATE INDEX Attachments2 ON Attachments (TransactionId) ;
+CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId) ;
+--- }}}
+
+--- {{{ Queues
+CREATE TABLE Queues (
+  id INTEGER PRIMARY KEY  ,
+  Name varchar(200) NOT NULL  ,
+  Description varchar(255) NULL  ,
+  CorrespondAddress varchar(120) NULL  ,
+  CommentAddress varchar(120) NULL  ,
+  InitialPriority integer NULL  ,
+  FinalPriority integer NULL  ,
+  DefaultDueIn integer NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  ,
+  Disabled int2 NOT NULL DEFAULT 0 
+) ;
+CREATE UNIQUE INDEX Queues1 ON Queues (Name) ;
+
+--- }}}
+
+--- {{{ Links
+
+CREATE TABLE Links (
+  id INTEGER PRIMARY KEY  ,
+  Base varchar(240) NULL  ,
+  Target varchar(240) NULL  ,
+  Type varchar(20) NOT NULL  ,
+  LocalTarget integer NULL  ,
+  LocalBase integer NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL  
+  
+) ;
+CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type) ;
+
+--- }}}
+
+--- {{{ Principals
+
+CREATE TABLE Principals (
+        id INTEGER PRIMARY KEY,
+        PrincipalType VARCHAR(16) not null,
+        ObjectId integer,
+        Disabled int2 NOT NULL DEFAULT 0 
+        
+) ;
+
+--- }}}
+
+--- {{{ Groups
+
+CREATE TABLE Groups (
+  id INTEGER ,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  Domain varchar(64),
+  Type varchar(64),
+  Instance varchar(64)
+  
+) ;
+
+CREATE UNIQUE INDEX Groups1 ON Groups (Name,Domain,Type,Instance) ;
+
+--- }}}
+
+--- {{{ ScripConditions
+
+CREATE TABLE ScripConditions (
+  id INTEGER PRIMARY KEY  ,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  ExecModule varchar(60) NULL  ,
+  Argument varchar(255) NULL  ,
+  ApplicableTransTypes varchar(60) NULL  ,
+
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  
+  
+) ;
+
+--- }}}
+
+--- {{{ Transactions
+CREATE TABLE Transactions (
+  id INTEGER PRIMARY KEY  ,
+  EffectiveTicket integer NULL  ,
+  Ticket integer NULL  ,
+  TimeTaken integer NULL  ,
+  Type varchar(20) NULL  ,
+  Field varchar(40) NULL  ,
+  OldValue varchar(255) NULL  ,
+  NewValue varchar(255) NULL  ,
+  Data varchar(100) NULL  ,
+
+  Creator integer NULL  ,
+  Created DATETIME NULL  
+  
+) ;
+CREATE INDEX Transactions1 ON Transactions (Ticket);
+CREATE INDEX Transactions2 ON Transactions (EffectiveTicket);
+
+--- }}}
+
+--- {{{ Scrips 
+
+CREATE TABLE Scrips (
+  id INTEGER PRIMARY KEY  ,
+  Description varchar(255),
+  ScripCondition integer NULL  ,
+  ScripAction integer NULL  ,
+  ConditionRules text NULL  ,
+  ActionRules text NULL  ,
+  CustomIsApplicableCode text NULL  ,
+  CustomPrepareCode text NULL  ,
+  CustomCommitCode text NULL  ,
+  Stage varchar(32) NULL  ,
+  Queue integer NULL  ,
+  Template integer NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  
+  
+) ;
+
+--- }}}
+
+--- {{{ ACL
+CREATE TABLE ACL (
+  id INTEGER PRIMARY KEY  ,
+  PrincipalType varchar(25) NOT NULL,
+
+  PrincipalId INTEGER,
+  RightName varchar(25) NOT NULL  ,
+  ObjectType varchar(25) NOT NULL  ,
+  ObjectId INTEGER default 0,
+  DelegatedBy integer NOT NULL default 0, 
+  DelegatedFrom integer NOT NULL default 0
+  
+) ;
+
+
+--- }}}
+
+--- {{{ GroupMembers 
+
+CREATE TABLE GroupMembers (
+  id INTEGER PRIMARY KEY  ,
+  GroupId integer NULL,
+  MemberId integer NULL
+  
+) ;
+
+--- }}}
+
+--- {{{ CachedGroupMembers
+
+create table CachedGroupMembers (
+        id integer primary key ,
+        GroupId int, 
+        MemberId int, 
+        Via int, 
+        ImmediateParentId int,
+        Disabled int2 NOT NULL DEFAULT 0  # if this cached group member is a member of this group by way of a disabled
+                                           # group or this group is disabled, this will be set to 1
+                                           # this allows us to not find members of disabled subgroups when listing off
+                                           # group members recursively.
+                                           # Also, this allows us to have the ACL system elide members of disabled groups
+
+        
+) ;
+
+--- }}}
+
+--- {{{ Users
+
+CREATE TABLE Users (
+  id INTEGER ,
+  Name varchar(200) NOT NULL  ,
+  Password varchar(40) NULL  ,
+  Comments blob NULL  ,
+  Signature blob NULL  ,
+  EmailAddress varchar(120) NULL  ,
+  FreeformContactInfo blob NULL  ,
+  Organization varchar(200) NULL  ,
+  RealName varchar(120) NULL  ,
+  NickName varchar(16) NULL  ,
+  Lang varchar(16) NULL  ,
+  EmailEncoding varchar(16) NULL  ,
+  WebEncoding varchar(16) NULL  ,
+  ExternalContactInfoId varchar(100) NULL  ,
+  ContactInfoSystem varchar(30) NULL  ,
+  ExternalAuthId varchar(100) NULL  ,
+  AuthSystem varchar(30) NULL  ,
+  Gecos varchar(16) NULL  ,
+  HomePhone varchar(30) NULL  ,
+  WorkPhone varchar(30) NULL  ,
+  MobilePhone varchar(30) NULL  ,
+  PagerPhone varchar(30) NULL  ,
+  Address1 varchar(200) NULL  ,
+  Address2 varchar(200) NULL  ,
+  City varchar(100) NULL  ,
+  State varchar(100) NULL  ,
+  Zip varchar(16) NULL  ,
+  Country varchar(50) NULL  ,
+  Timezone char(50) NULL  ,
+  PGPKey text NULL,
+
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  
+  
+) ;
+
+
+CREATE UNIQUE INDEX Users1 ON Users (Name) ;
+CREATE INDEX Users2 ON Users (Name);
+CREATE INDEX Users3 ON Users (id, EmailAddress);
+CREATE INDEX Users4 ON Users (EmailAddress);
+
+
+--- }}}
+
+--- {{{ Tickets
+
+CREATE TABLE Tickets (
+  id INTEGER PRIMARY KEY  ,
+  EffectiveId integer NULL  ,
+  Queue integer NULL  ,
+  Type varchar(16) NULL  ,
+  IssueStatement integer NULL  ,
+  Resolution integer NULL  ,
+  Owner integer NULL  ,
+  Subject varchar(200) NULL DEFAULT '[no subject]' ,
+  InitialPriority integer NULL  ,
+  FinalPriority integer NULL  ,
+  Priority integer NULL  ,
+  TimeEstimated integer NULL  ,
+  TimeWorked integer NULL  ,
+  Status varchar(10) NULL  ,
+  TimeLeft integer NULL  ,
+  Told DATETIME NULL  ,
+  Starts DATETIME NULL  ,
+  Started DATETIME NULL  ,
+  Due DATETIME NULL  ,
+  Resolved DATETIME NULL  ,
+
+
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  Disabled int2 NOT NULL DEFAULT 0
+  
+) ;
+
+CREATE INDEX Tickets1 ON Tickets (Queue, Status) ;
+CREATE INDEX Tickets2 ON Tickets (Owner) ;
+CREATE INDEX Tickets3 ON Tickets (EffectiveId) ;
+CREATE INDEX Tickets4 ON Tickets (id, Status) ;
+CREATE INDEX Tickets5 ON Tickets (id, EffectiveId) ;
+
+--- }}}
+
+--- {{{ ScripActions
+
+CREATE TABLE ScripActions (
+  id INTEGER PRIMARY KEY  ,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  ExecModule varchar(60) NULL  ,
+  Argument varchar(255) NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  
+  
+) ;
+
+--- }}}
+
+--- {{{ Templates
+
+CREATE TABLE Templates (
+  id INTEGER PRIMARY KEY  ,
+  Queue integer NOT NULL DEFAULT 0 ,
+  Name varchar(200) NOT NULL  ,
+  Description varchar(255) NULL  ,
+  Type varchar(16) NULL  ,
+  Language varchar(16) NULL  ,
+  TranslationOf integer NULL  ,
+  Content blob NULL  ,
+  LastUpdated DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  Creator integer NULL  ,
+  Created DATETIME NULL  
+  
+) ;
+
+--- }}}
+
+--- {{{ TicketCustomFieldValues 
+
+CREATE TABLE TicketCustomFieldValues (
+  id INTEGER PRIMARY KEY  ,
+  Ticket int NOT NULL  ,
+  CustomField int NOT NULL  ,
+  Content varchar(255) NULL  ,
+
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL  
+  
+) ;
+
+--- }}}
+
+--- {{{ CustomFields
+
+CREATE TABLE CustomFields (
+  id INTEGER PRIMARY KEY  ,
+  Name varchar(200) NULL  ,
+  Type varchar(200) NULL  ,
+  Queue int NULL ,
+  Description varchar(255) NULL  ,
+  SortOrder integer NULL  ,
+
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL ,
+  Disabled int2 NOT NULL DEFAULT 0 
+  
+) ;
+
+--- }}}
+
+--- {{{ CustomFieldValues 
+
+CREATE TABLE CustomFieldValues (
+  id INTEGER PRIMARY KEY  ,
+  CustomField int NOT NULL  ,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  SortOrder integer NULL  ,
+
+  Creator integer NULL  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NULL  ,
+  LastUpdated DATETIME NULL 
+  
+) ;
+
+--- }}}
diff --git a/rt/etc/upgrade/2.1.71 b/rt/etc/upgrade/2.1.71
new file mode 100644 (file)
index 0000000..cb89a3a
--- /dev/null
@@ -0,0 +1,211 @@
+@Queues = ( {
+        Name        => '___Approvals',
+    Description => 'A system-internal queue for the approvals system',
+        Disabled    => 2,
+        }
+);
+
+
+
+
+
+# {{{ Templates
+@Templates = (
+    {
+        Queue       => '___Approvals',
+        Name        => "New Pending Approval", # loc
+        Description => "Notify Owners and AdminCcs of new items pending their approval", # loc
+       Content     => 'Subject: New Pending Approval: {$Ticket->Subject}
+
+Greetings,
+
+There is a new item pending your approval: "{$Ticket->Subject()}", 
+a summary of which appears below.
+
+Please visit {$RT::WebURL}Approvals/Display.html?id={$Ticket->id}
+to approve or reject this ticket, or {$RT::WebURL}Approvals/ to
+batch-process all your pending approvals.
+
+-------------------------------------------------------------------------
+{$Transaction->Content()}
+'
+    },
+);
+
+# }}}
+
+1;
+
+@ScripActions = (
+     { Name => 'Open Tickets',
+       Description => 'Open tickets on correspondence',
+        ExecModule => 'AutoOpen' },
+
+);
+
+ @Scrips = (
+        { ScripCondition => 'On Correspond',
+          ScripAction => 'Open Tickets',
+          Template => 'Blank',
+          Queue => '0'
+        }, 
+    {  ScripCondition => 'On Create',
+       ScripAction    => 'AutoReply To Requestors',
+       Template       => 'AutoReply' },
+    {  ScripCondition => 'On Create',
+       ScripAction    => 'Notify AdminCcs',
+       Template       => 'Transaction' },
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Notify AdminCcs',
+       Template       => 'Admin Correspondence' },
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Notify Requestors And Ccs',
+       Template       => 'Correspondence' },
+    {  ScripCondition => 'On Correspond',
+       ScripAction    => 'Notify Other Recipients',
+       Template       => 'Correspondence' },
+    {  ScripCondition => 'On Comment',
+       ScripAction    => 'Notify AdminCcs As Comment',
+       Template       => 'Admin Comment' },
+    {  ScripCondition => 'On Comment',
+       ScripAction    => 'Notify Other Recipients As Comment',
+       Template       => 'Correspondence' },
+    {  ScripCondition => 'On Resolve',
+       ScripAction    => 'Notify Requestors',
+       Template       => 'Resolved' },
+
+
+    {
+        Description    => "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval", # loc
+        Queue          => '___Approvals',
+        ScripCondition => 'On Create',
+        ScripAction    => 'Notify AdminCcs',
+        Template       => 'New Pending Approval'
+    },
+    {
+        Description           => "If an approval is rejected, reject the original and delete pending approvals",       # loc
+        Queue                  => '___Approvals',
+        ScripCondition         => 'On Status Change',
+        ScripAction            => 'User Defined',
+        CustomCommitCode       => q[
+# ------------------------------------------------------------------- #
+return(1) unless ( lc($self->TransactionObj->NewValue) eq "rejected" or
+                  lc($self->TransactionObj->NewValue) eq "deleted" );
+
+my $links = $self->TicketObj->DependedOnBy;
+foreach my $link (@{ $links->ItemsArrayRef }) {
+    my $obj = $link->BaseObj;
+    if ($obj->QueueObj->IsActiveStatus($obj->Status)) {
+       if ($obj->Type eq 'ticket') {
+           $obj->Correspond(
+               Content => $self->loc("Your request was rejected."),
+           );
+           $obj->SetStatus(
+               Status  => 'rejected',
+               Force   => 1,
+           );
+       }
+       else {
+           $obj->SetStatus(
+               Status  => 'deleted',
+               Force   => 1,
+           );
+       }
+    }
+}
+
+$links = $self->TicketObj->DependsOn;
+foreach my $link (@{ $links->ItemsArrayRef }) {
+    my $obj = $link->TargetObj;
+    if ($obj->QueueObj->IsActiveStatus($obj->Status)) {
+       $obj->SetStatus(
+           Status      => 'deleted',
+           Force       => 1,
+       );
+    }
+}
+
+return 1;
+# ------------------------------------------------------------------- #
+       ],
+        CustomPrepareCode => '1',
+        Template          => 'Admin Comment',
+    },
+    {
+        Description      => "When a ticket has been approved by any approver, add correspondence to the original ticket", # loc
+        Queue             => '___Approvals',
+        ScripCondition    => 'On Resolve',
+        ScripAction       => 'User Defined',
+        CustomPrepareCode => 'return(1);',
+        CustomCommitCode  => q[
+# ------------------------------------------------------------------- #
+return(1) unless ($self->TicketObj->Type eq 'approval');
+
+foreach my $obj ($self->TicketObj->AllDependedOnBy( Type => 'ticket' )) {
+    $obj->Correspond(
+       Content => $self->loc( "Your request has been approved by [_1]. Other approvals may still be pending.", # loc
+           $self->TransactionObj->CreatorObj->Name,
+       ) . "\n" . $self->loc( "Approver's notes: [_1]", # loc
+           $self->TicketObj->Transactions->Last->Content,
+       ),
+       _reopen => 0,
+    );
+}
+
+return 1;
+# ------------------------------------------------------------------- #
+       ],
+       Template => 'Admin Comment'
+    },
+    {
+        Description      => "When a ticket has been approved by all approvers, add correspondence to the original ticket", # loc
+        Queue             => '___Approvals',
+        ScripCondition    => 'On Resolve',
+        ScripAction       => 'User Defined',
+        CustomPrepareCode => 'return(1);',
+        CustomCommitCode  => q[
+# ------------------------------------------------------------------- #
+# Find all the tickets that depend on this (that this is approving)
+
+my $Ticket = $self->TicketObj;
+my @TOP    = $Ticket->AllDependedOnBy( Type => 'ticket' );
+my $links  = $Ticket->DependedOnBy;
+
+while (my $link = $links->Next) {
+    my $obj = $link->BaseObj;
+    next if ($obj->HasUnresolvedDependencies( Type => 'approval' ));
+
+    if ($obj->Type eq 'ticket') {
+       $obj->Correspond(
+           Content     => $self->loc("Your request has been approved."),
+           _reopen     => 0,
+       );
+    }
+    elsif ($obj->Type eq 'code') {
+       my $code = $obj->Transactions->First->Content;
+       my $rv;
+
+       foreach my $TOP (@TOP) {
+           local $@;
+           $rv++ if eval $code;
+           $RT::Logger->error("Cannot eval code: $@") if $@;
+       }
+
+       if ($rv or !@TOP) {
+           $obj->SetStatus( Status     => 'resolved', Force    => 1,);
+       }
+       else {
+           $obj->SetStatus( Status     => 'rejected', Force    => 1,);
+       }
+    }
+}
+
+return 1;
+# ------------------------------------------------------------------- #
+       ],
+        Template    => 'Admin Comment',
+    },
+);
+
+# }}}
+
diff --git a/rt/html/Admin/Elements/AddCustomFieldValue b/rt/html/Admin/Elements/AddCustomFieldValue
new file mode 100644 (file)
index 0000000..8850734
--- /dev/null
@@ -0,0 +1,44 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<b><&|/l&>Add Value</&></b></b></b></b>
+<TABLE BORDER="0">
+<TR><TD><small>
+<&|/l&>Sort</&>:<br>
+<input name="CustomField-<% $CustomField->Id %>-AddValue-SortOrder" size="5">
+</TD>
+<TD><small>
+<&|/l&>Name</&>:<br>
+<input size=20 name="CustomField-<% $CustomField->Id %>-AddValue-Name">
+</TD>
+<TD><small>
+<&|/l&>Description</&>:<br>
+<input size="60" name="CustomField-<% $CustomField->Id %>-AddValue-Description">
+</TD></TR>
+</TABLE>
+
+<%init>
+</%init>
+<%args>
+$CustomField => undef
+</%args>
diff --git a/rt/html/Admin/Elements/CreateUserCalled b/rt/html/Admin/Elements/CreateUserCalled
new file mode 100644 (file)
index 0000000..8ceccca
--- /dev/null
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<FORM METHOD=get ACTION="<% $RT::WebPath %>/Admin/Users/Create.html">
+<&|/l&>New user called</&> <INPUT NAME="Name" size=10><input type=submit value="<&|/l&>Create</&>">
+</form>
diff --git a/rt/html/Admin/Elements/EditCustomField b/rt/html/Admin/Elements/EditCustomField
new file mode 100644 (file)
index 0000000..a09600b
--- /dev/null
@@ -0,0 +1,127 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/ListActions, actions => \@results &>
+
+
+<FORM METHOD=GET ACTION="CustomField.html">
+<INPUT TYPE=HIDDEN NAME="CustomField" VALUE="<%$id %>">
+<INPUT TYPE=HIDDEN name="Queue" value="<%$Queue%>">
+
+<TABLE WIDTH="100%" BORDER="0">
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Name</&>:
+</TD><TD>
+<input name="Name" VALUE="<%$CustomFieldObj->Name%>" SIZE=20>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Description</&>:
+</TD><TD>
+<input name="Description" VALUE="<%$CustomFieldObj->Description%>" SIZE=80>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Type</&>:
+</TD><TD>
+<& /Admin/Elements/SelectCustomFieldType, Name => "Type", Default => $CustomFieldObj->Type &>
+</TD></TR>
+<TR><TD>
+</TD><TD>
+<INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1">
+<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>> <&|/l&>Enabled (Unchecking this box disables this custom field)</&>
+</TD></TR>
+</TABLE>
+
+<P>
+% if ($CustomFieldObj->Id and $CustomFieldObj->Type =~ /Select/) {
+<h2><&|/l&>Values</&></h2>
+<font size=-1>
+<& /Admin/Elements/EditCustomFieldValues, CustomField => $CustomFieldObj &>
+<& /Admin/Elements/AddCustomFieldValue, CustomField => $CustomFieldObj &>
+</font>
+% }
+<&/Elements/Submit&>
+</FORM>
+
+
+
+<%INIT>
+
+my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
+my $EnabledChecked = "CHECKED";
+my (@results);
+
+if (! $CustomField ) { 
+  $title = loc("Create a CustomField");
+  $id = 'new';
+} else {
+
+    if ($CustomField eq 'new') {
+      my ($val, $msg) =  $CustomFieldObj->Create(Queue => $Queue, 
+                                                 Name => $Name, 
+                                                 Type => $Type,
+                                                 Description => $Description,
+                                                );
+      Abort(loc("Could not create CustomField", $msg)) unless ($val);
+     push @results, $msg;
+     $CustomFieldObj->SetSortOrder($CustomFieldObj->id);
+     $title = loc('Created CustomField [_1]', $CustomFieldObj->Name()); 
+    } else {
+       $CustomFieldObj->Load($CustomField) || Abort(loc('No CustomField'));
+      $title = loc('Editing CustomField [_1]', $CustomFieldObj->Name()); 
+
+      my @aresults = ProcessCustomFieldUpdates ( 
+                        CustomFieldObj => $CustomFieldObj,
+                        ARGSRef => \%ARGS );
+     push @results, @aresults;
+    }
+
+
+$id = $CustomFieldObj->id;
+
+  #we're asking about enabled on the web page but really care about disabled.
+  my $Disabled = ($Enabled ? 0 : 1);
+
+  if  ( ($SetEnabled) and ( $Disabled != $CustomFieldObj->Disabled) ) { 
+      my  ($code, $msg) = $CustomFieldObj->SetDisabled($Disabled);
+      push @results, loc('Enabled status [_1]', loc_fuzzy($msg));
+  }
+  
+  if ($CustomFieldObj->Disabled()) {
+      $EnabledChecked ="";
+  }
+
+}
+
+
+</%INIT>
+<%ARGS>
+$id => undef
+$title => undef
+$Queue => undef
+$CustomField => undef
+$Type => undef
+$Description => undef
+$Name => undef
+$SetEnabled => undef
+$Enabled => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/EditCustomFieldValues b/rt/html/Admin/Elements/EditCustomFieldValues
new file mode 100644 (file)
index 0000000..64564ad
--- /dev/null
@@ -0,0 +1,42 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<i><&|/l&>(Check box to delete)</&></i>
+<ul>
+% while (my $v = $values->Next) {
+<li>
+<font size=-1 color="#336699"><%$v->SortOrder%>:</font>
+<input type="checkbox" name="CustomField-<%$CustomField->Id%>-DeleteValue" value="<%$v->id%>">
+<%$v->Name%>
+% if ($v->Description) {
+<i>(<%$v->Description%>)</i>
+% }
+</li>
+% }
+</ul>
+<%init>
+my $values = $CustomField->Values();
+</%init>
+<%args>
+$CustomField => undef
+</%args>
diff --git a/rt/html/Admin/Elements/EditCustomFields b/rt/html/Admin/Elements/EditCustomFields
new file mode 100644 (file)
index 0000000..a86b051
--- /dev/null
@@ -0,0 +1,214 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/ListActions, actions => \@actions &>
+
+<TABLE>
+<TR>
+<TD VALIGN=TOP>
+<%$caption%>:<BR>
+</TD></TR></TABLE>
+% if ($CustomFields->Count == 0 ) {
+<P><i><&|/l&>(No custom fields)</&></i></P>
+% } else {
+<TABLE>
+
+<TR>
+<TD ROWSPAN="<% $CustomFields->Count %>">
+<UL>
+% while (my $CustomFieldObj = $CustomFields->Next) { 
+<LI><A HREF="CustomField.html?Queue=<%$id%>&CustomField=<%$CustomFieldObj->id()%>"><b><%$CustomFieldObj->Name%></b></a> (<% $CustomFieldObj->FriendlyType %>)<br>
+<%$CustomFieldObj->Description%>
+</LI>
+% }
+</UL>
+</TD>
+
+% my $count;
+% while (my $CustomFieldObj = $CustomFields->Next) { 
+%  # show 'move up' unless it's the first item
+%  if ($count++) {
+<TR><TD>
+<a href="CustomFields.html?id=<%$id%>&CustomField=<%$CustomFieldObj->id%>&Move=-1"><&|/l&>Move up</&></a>
+%  } else {
+<TD ALIGN=RIGHT>
+%  }
+
+%  # show 'move down' unless it's the last item
+%  if (!$CustomFields->IsLast) {
+%  $m->print(' | ') if $count > 1;
+<a href="CustomFields.html?id=<%$id%>&CustomField=<%$CustomFieldObj->id%>&Move=1"><&|/l&>Move down</&></a>
+%  }
+</TD></TR>
+% }
+
+</TD>
+</TR>
+</TABLE>
+% }
+<FORM METHOD=GET ACTION="CustomFields.html">
+% if ($id) {
+<INPUT TYPE="Hidden" NAME="id" VALUE="<%$id%>">
+% }
+<input type="checkbox" name="FindDisabledCustomFields"> <&|/l&>Include disabled custom fields in listing.</&>
+<input type=submit value="<&|/l&>Go!</&>">
+</FORM>
+
+
+<%INIT>
+my $CustomFields = RT::CustomFields->new($session{'CurrentUser'});
+my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+my $caption;
+
+if ($id)  {
+        $QueueObj->Load($id);                        
+}
+
+if ($QueueObj->id) {
+       $CustomFields->LimitToQueue($id);
+}                                            
+else {                                       
+        $CustomFields->LimitToGlobal();
+}                                           
+
+if ($FindDisabledCustomFields) {
+    $caption = loc("All Custom Fields");
+    $CustomFields->{'find_disabled_rows'} = 1;
+} else {
+    $caption = loc("Enabled Custom Fields");
+}
+
+# {{{ deal with moving sortorder of custom fields
+if ($CustomField and $Move) {
+    my $SourceObj = RT::CustomField->new($session{'CurrentUser'});
+    $SourceObj->Load($CustomField) || Abort(loc('No CustomField'));
+
+    my $TargetObj;
+    my $target_order = $SourceObj->SortOrder + $Move;
+    while (my $CustomFieldObj = $CustomFields->Next) { 
+       my $this_order = $CustomFieldObj->SortOrder;
+
+       # if we have an exact match, finish the loop now
+       ($TargetObj = $CustomFieldObj, last) if $this_order == $target_order;
+
+       # otherwise, we need to apropos toward the general direction
+       # ... first, check the sign is correct
+       next unless ($this_order - $SourceObj->SortOrder) * $Move > 0;
+
+       # ... next, see if we already have a candidate
+       if ($TargetObj) {
+           # ... if yes, compare the delta and choose the smaller one
+           my $orig_delta = abs($TargetObj->SortOrder - $target_order);
+           my $this_delta = abs($this_order - $target_order);
+           next if $orig_delta < $this_delta;
+       }
+
+       $TargetObj = $CustomFieldObj;
+    }
+
+    if ($TargetObj) {
+       # swap their sort order
+       my ($s, $t) = ($SourceObj->SortOrder, $TargetObj->SortOrder);
+       $TargetObj->SetSortOrder($s);
+       $SourceObj->SetSortOrder($t);
+       # because order changed, we must redo search for subsequent uses
+       $CustomFields->RedoSearch;
+    }
+
+    $CustomFields->GotoFirstItem;
+}
+# }}}
+
+# {{{ now process the 'copy queue' action
+my @actions;
+if ($Source and $Source ne $id) {
+    my $SourceQueue = RT::Queue->new($session{'CurrentUser'});
+    $SourceQueue->Load($Source) || Abort(loc("Couldn't load queue"));
+    my $SourceCustomFields = RT::CustomFields->new($session{'CurrentUser'});
+    $SourceCustomFields->LimitToQueue($SourceQueue->id);
+
+    # delete old fields
+    foreach my $CustomFieldObj ( @{$CustomFields->ItemsArrayRef} ) { 
+       $CustomFieldObj->Delete;
+    }
+
+    # add new fields
+    while (my $SourceCustomFieldObj = $SourceCustomFields->Next) {
+       my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
+       my ($val, $msg) =  $CustomFieldObj->Create(
+           id => $SourceCustomFieldObj->id,
+           Queue => $id,
+           Name => $SourceCustomFieldObj->Name,
+           Type => $SourceCustomFieldObj->Type,
+           Description => $SourceCustomFieldObj->Description,
+       );
+       Abort(loc("Could not create CustomField") . ": $msg") unless ($val);
+       push @actions, $msg;
+
+       $CustomFieldObj->SetSortOrder($SourceCustomFieldObj->SortOrder);
+
+       # add new values
+       my $values = $SourceCustomFieldObj->Values();
+       while (my $v = $values->Next) {
+           my ( $addval, $addmsg ) = $CustomFieldObj->AddValue(
+               Name => $v->Name,
+               Description => $v->Description,
+               SortOrder => $v->SortOrder
+           );
+       }
+    }
+
+    # because content changed, we must redo search for subsequent uses
+    $CustomFields->RedoSearch;
+    $CustomFields->GotoFirstItem;
+}
+# }}}
+
+# {{{ deal with deleting existing custom fields
+foreach my $key (keys %ARGS) {
+  # {{{ if we're trying to delete the custom field
+  if ($key =~ /^DeleteCustomField-(\d+)/) {
+    my $id = $1;
+    my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
+    $CustomFieldObj->Load($id);
+    my ($retval, $msg) = $CustomFieldObj->Delete;
+    if ($retval) {
+      push @actions, loc("Custom field deleted");
+    }
+    else {
+      push @actions, $msg;
+    }
+  }
+  # }}}
+}
+# }}}
+
+</%INIT>
+<%ARGS>
+$id => 0
+$title => undef
+$Move => undef
+$Source => undef
+$CustomField => undef
+$FindDisabledCustomFields => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/EditQueueWatchers b/rt/html/Admin/Elements/EditQueueWatchers
new file mode 100644 (file)
index 0000000..db39bfb
--- /dev/null
@@ -0,0 +1,55 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%if ($Members->Count == 0 ) {
+<ul>
+<li><i><&|/l&>none</&></i>
+% } else {
+<i><&|/l&>(Check box to delete)</&></i><br><BR>
+<ul>
+% while (my $watcher=$Members->Next) {
+<li>
+<INPUT  TYPE=CHECKBOX 
+        NAME="Queue-<%$QueueObj->Id%>-DelWatcher-Type-<%$Watchers->Type%>-Principal-<%$watcher->MemberId%>" 
+        UNCHECKED>
+% if ($watcher->MemberObj->IsUser) { 
+<a href="<%$RT::WebPath%>/Admin/Users/Modify.html?id=<%$watcher->MemberObj->ObjectId%>">
+% } else {
+<a href="<%$RT::WebPath%>/Admin/Groups/Modify.html?id=<%$watcher->MemberObj->ObjectId%>">
+% }
+<%$watcher->MemberObj->Object->Name%></a>
+% }
+% }
+</ul>
+
+<%INIT>
+my $Members = $Watchers->MembersObj;
+</%INIT>
+
+<%ARGS>
+$QueueObj => undef
+$Watchers => undef
+</%ARGS>
+
+
+
diff --git a/rt/html/Admin/Elements/EditScrip b/rt/html/Admin/Elements/EditScrip
new file mode 100644 (file)
index 0000000..5393ebf
--- /dev/null
@@ -0,0 +1,149 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/ListActions, actions => \@actions &>
+
+  
+<FORM METHOD=POST ACTION="Scrip.html">
+<input type="hidden" name="id" value="<%$id%>">
+<input type="hidden" name="Queue" value="<%$Queue%>">
+<TABLE>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Description</&>:
+</TD>
+<TD>
+<input Name="Scrip-<%$id%>-Description" value="<%$scrip->Description%>">
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Condition</&>:
+</TD>
+<TD>
+<& /Admin/Elements/SelectScripCondition, Name => "Scrip-$id-ScripCondition", Default => $scrip->ConditionObj->Id &><BR>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Custom condition</&>:
+</TD>
+<TD>
+<TEXTAREA COLS=80 ROWS=5 NAME="Scrip-<%$id%>-CustomIsApplicableCode"><%$scrip->CustomIsApplicableCode%></TEXTAREA>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Action</&>:
+</TD>
+<TD>
+<& /Admin/Elements/SelectScripAction, Name => "Scrip-$id-ScripAction", Default => $scrip->ActionObj->Id &>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Custom action preparation code</&>:
+</TD>
+<TD>
+<TEXTAREA COLS=80 ROWS=5 NAME="Scrip-<%$id%>-CustomPrepareCode"><%$scrip->CustomPrepareCode%></TEXTAREA>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Custom action cleanup code</&>:
+</TD>
+<TD>
+<TEXTAREA COLS=80 ROWS=5 NAME="Scrip-<%$id%>-CustomCommitCode"><%$scrip->CustomCommitCode%></TEXTAREA>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Template</&>: 
+</TD>
+<TD>
+<& /Admin/Elements/SelectTemplate, Name => "Scrip-$id-Template", Default => $scrip->TemplateObj->Id, Queue => $Queue &>
+</TD>
+</TR>
+
+<& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+</FORM>
+<%init>
+my (@actions);
+
+
+my $scrip = new RT::Scrip($session{'CurrentUser'});
+
+if ( $id eq 'new' ) {
+
+    my ( $retval, $msg ) = $scrip->Create(
+            Queue                  => $Queue,
+            ScripAction            => $ARGS{"Scrip-new-ScripAction"},
+            ScripCondition         => $ARGS{"Scrip-new-ScripCondition"},
+            Template               => $ARGS{"Scrip-new-Template"},
+            Description            => $ARGS{"Scrip-new-Description"},
+            CustomPrepareCode      => $ARGS{"Scrip-new-CustomPrepareCode"},
+            CustomCommitCode       => $ARGS{"Scrip-new-CustomCommitCode"},
+            CustomIsApplicableCode => $ARGS{"Scrip-new-CustomIsApplicableCode"},
+    );
+    if ( defined $retval ) {
+        push @actions, $msg;
+    }
+    else {
+        Abort( $msg);
+    }
+}
+elsif ($id) {
+    my ($val,$msg) =$scrip->Load($id);
+    if  ($val) {
+        $id = $scrip->id;
+    } else {
+       Abort ($msg);
+    }
+    my @attribs = qw (
+      Queue
+      ScripAction
+      ScripCondition
+      Template
+      Description
+      CustomPrepareCode
+      CustomCommitCode
+      CustomIsApplicableCode
+    );
+    my @results = UpdateRecordObject( AttributesRef => \@attribs,
+                                      AttributePrefix => 'Scrip-'.$scrip->Id,
+                                      Object        => $scrip,
+                                      ARGSRef       => \%ARGS );
+    push (@actions, @results);
+}
+
+elsif ($ARGS{'create'}) {
+    $id = 'new';
+}
+
+# }}}
+</%init>
+
+<%ARGS>
+$id => undef
+$title => undef
+$Queue => 0
+</%ARGS>
diff --git a/rt/html/Admin/Elements/EditScrips b/rt/html/Admin/Elements/EditScrips
new file mode 100644 (file)
index 0000000..24515d8
--- /dev/null
@@ -0,0 +1,97 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/ListActions, actions => \@actions &>
+
+<form action="Scrips.html" method="post">
+<input type="hidden" name="id" value="<%$id%>">
+
+<P><&|/l&>Current Scrips</&>:</P>
+% if ($Scrips->Count == 0 ) {
+<P><i><&|/l&>(No scrips)</&></i></P>
+% } else {
+<TABLE>
+<P><i><&|/l&>(Check box to delete)</&></i></P>
+
+%   while (my $scrip = $Scrips->Next ) {
+<TR>
+<TD>
+<input type="checkbox" name="DeleteScrip-<%$scrip->Id%>">
+</TD>
+<TD>
+<a href="Scrip.html?id=<%$scrip->Id%>&Queue=<%$id%>"><% $scrip->Description || "<i>(".loc('no value').")</i>" |n %></a><br>
+<small><&|/l, loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name) &>[_1] [_2] with template [_3]</&></small>
+</TD>
+</TR>
+%   }
+
+</TABLE>
+
+% }
+<& /Elements/Submit &>
+</form>
+<%init>
+my (@actions);
+
+my $Scrips = RT::Scrips->new($session{'CurrentUser'});
+
+
+my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+if ($id)  {
+        $QueueObj->Load($id);                        
+}
+
+if ($QueueObj->id) {                         
+       $Scrips->LimitToQueue($id);
+}                                            
+else {                                       
+        $Scrips->LimitToGlobal();
+}                                           
+
+
+
+
+# {{{ deal with modifying and deleting existing scrips
+foreach my $key (keys %ARGS) {
+  # {{{ if we're trying to delete the scrip
+  if ($key =~ /^DeleteScrip-(\d+)/) {
+    my $id = $1;
+    my $scrip = new RT::Scrip($session{'CurrentUser'});
+    $scrip->Load($id);
+    my ($retval, $msg) = $scrip->Delete;
+    if ($retval) {
+      push @actions, loc("Scrip deleted");
+    }
+    else {
+      push @actions, $msg;
+    }
+  }
+  # }}}
+}
+# }}}
+</%init>
+
+<%ARGS>
+$id => undef
+$title => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/EditTemplates b/rt/html/Admin/Elements/EditTemplates
new file mode 100644 (file)
index 0000000..12677ca
--- /dev/null
@@ -0,0 +1,104 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/ListActions, actions => \@actions &>
+
+<FORM METHOD=GET ACTION="Templates.html">
+<INPUT TYPE="Hidden" NAME="id" VALUE="<%$id%>">
+
+% if ($Templates->Count == 0 ) {
+<P><i><&|/l&>(No templates)</&></i></P>
+% } else {
+<TABLE>
+<TR>
+<TH>
+<i><&|/l&>(Check box to delete)</&></i>
+</TH>
+<TH>
+</TH>
+</TR>
+% my $count;
+% while (my $TemplateObj = $Templates->Next) { 
+<TR>
+<TD>
+<input type="checkbox" name="DeleteTemplate-<%$TemplateObj->Id%>">
+</TD>
+<TD>
+<A HREF="Template.html?Queue=<%$id%>&Template=<%$TemplateObj->id()%>">
+<B><% loc($TemplateObj->Name) %></B></A>
+<br><% loc($TemplateObj->Description) %>
+</TD>
+</TR>
+
+% }
+</TABLE>
+% }
+
+<& /Elements/Submit &>
+</FORM>
+
+<%INIT>
+my $Templates = RT::Templates->new($session{'CurrentUser'});
+my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+my @actions;
+
+if ($id)  {
+        $QueueObj->Load($id);                        
+}
+
+if ($QueueObj->id) {
+       $Templates->LimitToQueue($id);
+}                                            
+else {                                       
+        $Templates->LimitToGlobal();
+}                                           
+
+# Now let callbacks add their extra limits
+$m->comp('/Elements/Callback', Templates => $Templates, %ARGS);
+
+# {{{ deal with deleting existing templates
+foreach my $key (keys %ARGS) {
+  # {{{ if we're trying to delete the template
+  if ($key =~ /^DeleteTemplate-(\d+)/) {
+    my $id = $1;
+    my $TemplateObj = RT::Template->new($session{'CurrentUser'});
+    $TemplateObj->Load($id);
+    my ($retval, $msg) = $TemplateObj->Delete;
+    if ($retval) {
+      push @actions, loc("Template deleted");
+    }
+    else {
+      push @actions, $msg;
+    }
+  }
+  # }}}
+}
+# }}}
+</%INIT>
+<%ARGS>
+$id => 0
+$title => undef
+$Move => undef
+$Source => undef
+$Template => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/EditUserComments b/rt/html/Admin/Elements/EditUserComments
new file mode 100644 (file)
index 0000000..f791876
--- /dev/null
@@ -0,0 +1,32 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => "Comments about $name" &>
+<&|/l&>These comments aren't generally visible to the user</&>:<br>
+<input type="hidden" name="id" value="<%$id%>">
+<TEXTAREA COLS=60 ROWS=15 WRAP=SOFT NAME="Comments"><% $UserObj->Comments %></TEXTAREA>
+</FORM>
+
+<%ARGS>
+$UserObj => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/GroupTabs b/rt/html/Admin/Elements/GroupTabs
new file mode 100644 (file)
index 0000000..8737782
--- /dev/null
@@ -0,0 +1,76 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Tabs, 
+    subtabs => $tabs, 
+    current_tab => 'Admin/Groups/', 
+    current_subtab => $current_tab, 
+    Title => $Title &>
+<%INIT>
+my $tabs;
+
+if ( $GroupObj and $GroupObj->id ) {
+$tabs->{"this"} = { class => "currentnav",                                                           
+                    path  => "Admin/Groups/Modify.html?id=" . $GroupObj->id,
+                    title => $GroupObj->Name,
+                    current_subtab => $current_subtab,
+        subtabs => {
+        C => { title => loc('Basics'),
+               path  => "Admin/Groups/Modify.html?id=" . $GroupObj->id },
+
+        D => { title => loc('Members'),
+               path  => "Admin/Groups/Members.html?id=" . $GroupObj->id },
+
+        F => { title => loc('Group Rights'),
+               path  => "Admin/Groups/GroupRights.html?id=" . $GroupObj->id, },
+        G => { title => loc('User Rights'),
+               path  => "Admin/Groups/UserRights.html?id=" . $GroupObj->id, },
+    }
+}
+}
+$tabs->{"A"} = { title => loc('Select group'),
+                 path  => "Admin/Groups/", };
+$tabs->{"B"} = { title     => loc('New group'),
+                 path      => "Admin/Groups/Modify.html?Create=1",
+                 separator => 1, };
+
+# Now let callbacks add their extra tabs
+$m->comp( '/Elements/Callback', tabs => $tabs, %ARGS );
+foreach my $tab ( sort keys %{$tabs->{'this'}->{'subtabs'}} ) {  
+    if ( $tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab ) {
+        $tabs->{'this'}->{'subtabs'}->{$tab}->{"subtabs"}        = $subtabs; 
+        $tabs->{'this'}->{'subtabs'}->{$tab}->{"current_subtab"} = $current_subtab; 
+    }                                                                           
+}   
+        $tabs->{'this'}->{"current_subtab"} = $current_tab; 
+        $current_tab = "Admin/Groups/Modify.html?id=".$GroupObj->id if $GroupObj;
+
+</%INIT>
+<%ARGS>
+$GroupObj => undef
+$subtabs => undef
+$current_subtab => undef
+$current_tab => undef
+$Title => undef
+</%ARGS>
+
diff --git a/rt/html/Admin/Elements/Header b/rt/html/Admin/Elements/Header
new file mode 100644 (file)
index 0000000..92a7c54
--- /dev/null
@@ -0,0 +1,28 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => $Title &>
+
+<%ARGS>
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/ListGlobalCustomFields b/rt/html/Admin/Elements/ListGlobalCustomFields
new file mode 100644 (file)
index 0000000..032f680
--- /dev/null
@@ -0,0 +1,37 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%   my $count = 0;
+%   while (my $CustomFieldObj = $CustomFields->Next) { 
+%   $count++;
+<font size="-1"><%$CustomFieldObj->id%>/<% loc($CustomFieldObj->Type) %>/<%$CustomFieldObj->Name%>: <%$CustomFieldObj->Description%></font>
+<BR>
+%   }
+%   if (!$count) {
+<font size="-1"><&|/l&>(No custom fields)</&></font>
+%   }
+
+<%init>
+my $CustomFields = new RT::CustomFields ($session{'CurrentUser'});
+$CustomFields->LimitToGlobal();
+</%INIT>
diff --git a/rt/html/Admin/Elements/ListGlobalScrips b/rt/html/Admin/Elements/ListGlobalScrips
new file mode 100644 (file)
index 0000000..8dba3b6
--- /dev/null
@@ -0,0 +1,37 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%   my $count = 0;
+%   while (my $scrip = $Scrips->Next ) {
+%   $count++;
+<font size="-1"><&|/l, loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name) &>[_1] [_2] with template [_3]</&></font>
+<BR>
+%   }
+%   if (!$count) {
+<font size="-1"><&|/l&>(No scrips)</&></font>
+%   }
+
+<%init>
+my $Scrips = new RT::Scrips ($session{'CurrentUser'});
+$Scrips->LimitToGlobal();
+</%INIT>
diff --git a/rt/html/Admin/Elements/ModifyQueue b/rt/html/Admin/Elements/ModifyQueue
new file mode 100644 (file)
index 0000000..e5761df
--- /dev/null
@@ -0,0 +1,78 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, title => loc('Editing Configuration for queue [_1]', $QueueObj->Id) &>
+
+<FORM ACTION="<%$RT::WebPath%>/Admin/Queues/Modify.html" METHOD=POST>
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>">
+<TABLE>
+<TR><TD ALIGN=RIGHT>
+<&|/l&>Queue Name</&>:
+</TD>
+<TD><INPUT name="Name" value="<%$QueueObj->Name%>"></TD>
+</TR><TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Description</&>:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$QueueObj->Description%>" size=60></TD></TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Correspondence Address</&>:
+</TD><TD>
+<INPUT name="CorrespondAddress" value="<%$QueueObj->CorrespondAddress%>">
+</TD>
+<TD ALIGN=RIGHT>
+
+<&|/l&>Comment Address</&>: </TD><TD>
+<INPUT NAME="CommentAddress" value="<%$QueueObj->CommentAddress%>">
+</TD>
+</TR><TR>
+
+<TD ALIGN=RIGHT>
+<&|/l&>Priority starts at</&>:
+</TD><TD><INPUT NAME="InitialPriority" value="<%$QueueObj->InitialPriority %>">
+</TD>
+<TD ALIGN=RIGHT>
+<&|/l&>Over time, priority moves toward</&>:
+</TD><TD><INPUT NAME="FinalPriority" value="<%$QueueObj->FinalPriority %>">
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Requests should be due in</&>:
+</TD><TD>
+<INPUT NAME="DefaultDueIn" VALUE="<%$QueueObj->DefaultDueIn%>"> <&|/l&>days</&>.
+</TD>
+</TR>
+</TABLE>
+<& /Elements/Submit &>
+</form>
+<& /Elements/TitleBoxEnd &>
+
+<%INIT>
+
+</%INIT>
+
+<%ARGS>
+
+
+$QueueObj => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/ModifyTemplate b/rt/html/Admin/Elements/ModifyTemplate
new file mode 100644 (file)
index 0000000..5f75bac
--- /dev/null
@@ -0,0 +1,60 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Name</&>:
+</TD>
+<TD>
+<input name="Name" VALUE="<%$Name%>" SIZE=20><BR>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Description</&>: 
+</TD>
+<TD>
+<input name="Description" VALUE="<%$Description%>" SIZE=80><BR>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT VALIGN=TOP>
+<&|/l&>Content</&>:<BR>
+</TD>
+<TD>
+<TEXTAREA NAME=Content ROWS=25 COLS=80 WRAP=SOFT>
+<%$Content%></TEXTAREA>
+</TD>
+</TR>
+</TABLE>
+
+<%INIT>
+
+</%INIT>
+
+<%ARGS>
+$Name => undef
+$Description => undef
+$Content => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/ModifyUser b/rt/html/Admin/Elements/ModifyUser
new file mode 100644 (file)
index 0000000..876e8a7
--- /dev/null
@@ -0,0 +1,99 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, title => loc('Editing Configuration for user [_1]', $UserObj->Name) &>
+
+<FORM ACTION="<%$RT::WebPath%>/Admin/Users/Modify.html" METHOD=POST>
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>">
+
+<&|/l&>Name</&>: <input name="Name" value="<%$UserObj->Name%>">
+<BR>
+<&|/l&>New Password</&>: <input type=password name="Pass1"><BR>
+<&|/l&>Retype Password</&>: <input type=password name="Pass2"><BR>
+
+<&|/l&>Comments</&>: <TEXTAREA name="Comments" COLS=80 ROWS=5 WRAP=VIRTUAL>
+<%$UserObj->Comments%></TEXTAREA>
+
+<BR>
+<&|/l&>Signature</&>: <TEXTAREA COLS=80 ROWS=5 name="Signature" WRAP=HARD>
+<%$UserObj->Signature%></TEXTAREA>
+<BR>
+<&|/l&>EmailAddress</&>: <input name="EmailAddress" value="<%$UserObj->EmailAddress%>">
+<BR>
+<&|/l&>FreeformContactInfo</&>: <input name="FreeformContactInfo" value="<%$UserObj->FreeformContactInfo%>">
+<BR>
+<&|/l&>Organization</&>: <input name="Organization" value="<%$UserObj->Organization%>">
+<BR>
+<&|/l&>RealName</&>: <input name="RealName" value="<%$UserObj->RealName%>">
+<BR>
+<&|/l&>NickName</&>: <input name="NickName" value="<%$UserObj->NickName%>">
+<BR>
+<&|/l&>Lang</&>: <input name="Lang" value="<%$UserObj->Lang%>">
+<BR>
+<&|/l&>EmailEncoding</&>: <input name="EmailEncoding" value="<%$UserObj->EmailEncoding%>">
+<BR>
+<&|/l&>WebEncoding</&>: <input name="WebEncoding" value="<%$UserObj->WebEncoding%>">
+<BR>
+<&|/l&>ExternalContactInfoId</&>: <input name="ExternalContactInfoId" value="<%$UserObj->ExternalContactInfoId%>">
+<BR>
+<&|/l&>ContactInfoSystem</&>: <input name="ContactInfoSystem" value="<%$UserObj->ContactInfoSystem%>">
+<BR>
+<&|/l&>UnixUsername</&>: <input name="Gecos" value="<%$UserObj->Gecos%>">
+<BR>
+<&|/l&>ExternalAuthId</&>: <input name="ExternalAuthId" value="<%$UserObj->ExternalAuthId%>">
+<BR>
+<&|/l&>AuthSystem</&>: <input name="AuthSystem" value="<%$UserObj->AuthSystem%>">
+<BR>
+<&|/l&>HomePhone</&>: <input name="HomePhone" value="<%$UserObj->HomePhone%>">
+<BR>
+<&|/l&>WorkPhone</&>: <input name="WorkPhone" value="<%$UserObj->WorkPhone%>">
+<BR>
+<&|/l&>MobilePhone</&>: <input name="MobilePhone" value="<%$UserObj->MobilePhone%>">
+<BR>
+<&|/l&>PagerPhone</&>: <input name="PagerPhone" value="<%$UserObj->PagerPhone%>">
+<BR>
+<&|/l&>Address1</&>: <input name="Address1" value="<%$UserObj->Address1%>">
+<BR>
+<&|/l&>Address2</&>: <input name="Address2" value="<%$UserObj->Address2%>">
+<BR>
+<&|/l&>City</&>: <input name="City" value="<%$UserObj->City%>">
+<BR>
+<&|/l&>State</&>: <input name="State" value="<%$UserObj->State%>">
+<BR>
+<&|/l&>Zip</&>: <input name="Zip" value="<%$UserObj->Zip%>">
+<BR>
+<&|/l&>Country</&>: <input name="Country" value="<%$UserObj->Country%>">
+<BR>
+<& /Elements/Submit &>
+</form>
+<& /Elements/TitleBoxEnd &>
+
+<%INIT>
+
+</%INIT>
+
+<%ARGS>
+
+
+$UserObj => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/QueueRightsForUser b/rt/html/Admin/Elements/QueueRightsForUser
new file mode 100644 (file)
index 0000000..05bb511
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<UL>
+%while(my $ACE = $ACL->Next) {
+
+<LI><checkbox name="delete_ace_<%$ACE->id%>"> <% loc($ACE->RightName) %> (<%$ACE->UserObj->RealName%>)
+
+%}
+</UL>
+
+<%INIT>
+my $ACL = new RT::ACL($session{'CurrentUser'});
+$ACL->LimitToQueue($QueueObj->id);
+$ACL->LimitPrincipalToUser($PrincipalId);
+</%INIT>
+<%ARGS>
+$PrincipalId => undef
+$QueueObj => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/QueueTabs b/rt/html/Admin/Elements/QueueTabs
new file mode 100644 (file)
index 0000000..3b4805a
--- /dev/null
@@ -0,0 +1,93 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Tabs, 
+    subtabs => $tabs, 
+    current_tab => 'Admin/Queues/', 
+    current_subtab => $current_tab, 
+    Title => $Title &>
+
+<%INIT>
+my $tabs;
+if ($id) {
+  $tabs->{'this'}  = {
+                title => $QueueObj->Name,
+                       path => "Admin/Queues/Modify.html?id=".$id,
+                    current_subtab => $current_tab,     
+                subtabs => {
+                C => { title => loc('Basics'),
+                       path => "Admin/Queues/Modify.html?id=".$id,
+                          },
+                D => { title => loc('Watchers'),
+                       path => "Admin/Queues/People.html?id=".$id,
+                     },
+
+                E => { title => loc('Scrips'),
+                            path => "Admin/Queues/Scrips.html?id=".$id,
+                          },
+                F => { title => loc('Templates'),
+                               path => "Admin/Queues/Templates.html?id=".$id,
+                             },
+
+                 G => { title => loc('Custom Fields'),
+                        path => 'Admin/Queues/CustomFields.html?id='.$id,
+                        },
+
+                H => { title => loc('Group Rights'),
+                         path => "Admin/Queues/GroupRights.html?id=".$id,
+                       },      
+                I => { title => loc('User Rights'),
+                         path => "Admin/Queues/UserRights.html?id=".$id,
+                       }
+        }
+        };
+}
+if ($session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue')) {
+  $tabs->{"A"} = { title => loc('Select queue'),
+                       path => "Admin/Queues/",
+                          };
+  $tabs->{"B"} = { title => loc('New queue'),
+                       path => "Admin/Queues/Modify.html?Create=1",
+                       separator => 1,
+                          };
+}
+
+  # Now let callbacks add their extra tabs
+  $m->comp('/Elements/Callback', tabs => $tabs, %ARGS);
+foreach my $tab ( sort keys %{$tabs->{'this'}->{'subtabs'}} ) {  
+    if ( $tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab ) {
+        $tabs->{'this'}->{'subtabs'}->{$tab}->{"subtabs"}        = $subtabs; 
+        $tabs->{'this'}->{'subtabs'}->{$tab}->{"current_subtab"} = $current_subtab; 
+    }                                                                           
+}   
+                       $current_tab = "Admin/Queues/Modify.html?id=".$id if $id;
+</%INIT>
+  
+<%ARGS>
+$QueueObj => undef
+$id => undef
+$subtabs => undef
+$current_subtab => undef
+$current_tab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectCustomFieldType b/rt/html/Admin/Elements/SelectCustomFieldType
new file mode 100644 (file)
index 0000000..b5f4c07
--- /dev/null
@@ -0,0 +1,36 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+%for my $option ($cf->Types) {
+<OPTION VALUE="<%$option%>" <%$option eq $Default && "SELECTED"%>><% $cf->FriendlyType($option) %></OPTION>
+%}
+</SELECT>
+<%INIT>
+my $cf = RT::CustomField->new($session{'CurrentUser'});
+
+</%INIT>
+<%ARGS>
+$Default=>undef
+$Name => 'Type'
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectGroups b/rt/html/Admin/Elements/SelectGroups
new file mode 100644 (file)
index 0000000..5df49ad
--- /dev/null
@@ -0,0 +1,37 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT MULTIPLE NAME="<%$Name%>"  SIZE=10>
+%while (my $group = $groups->Next) {
+<OPTION VALUE="<%$group->id%>"><%$group->Name%>
+%}
+</SELECT>
+
+<%INIT>
+my $groups = new RT::Groups($session{'CurrentUser'});
+$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'System');
+
+</%INIT>
+<%ARGS>
+$Name => 'groups'
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectModifyGroup b/rt/html/Admin/Elements/SelectModifyGroup
new file mode 100644 (file)
index 0000000..47978d3
--- /dev/null
@@ -0,0 +1,33 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%while ( $Group = $Groups->Next) {
+<A HREF="Modify.html?id=<%$Group->id%>"><%$Group->id%>: <%$Group->Name%></a><BR>
+%}
+<%INIT>
+my ($Group);
+my $Groups = new RT::Groups($session{'CurrentUser'});
+$Groups->UnLimit;
+</%INIT>
+<%ARGS>
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectModifyQueue b/rt/html/Admin/Elements/SelectModifyQueue
new file mode 100644 (file)
index 0000000..c5152ac
--- /dev/null
@@ -0,0 +1,33 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%while ( $queue = $queues->Next) {
+<A HREF="Modify.html?id=<%$queue->id%>"><%$queue->id%>: <%$queue->Name%></a><BR>
+%}
+<%INIT>
+my ($queue);
+my $queues = new RT::Queues($session{'CurrentUser'});
+$queues->UnLimit;
+</%INIT>
+<%ARGS>
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectModifyUser b/rt/html/Admin/Elements/SelectModifyUser
new file mode 100644 (file)
index 0000000..9e7789b
--- /dev/null
@@ -0,0 +1,49 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%while ( $user = $users->Next) {
+<A HREF="Modify.html?id=<%$user->id%>"><%$user->id%>: <%$user->Name%></a><BR>
+%}
+<%INIT>
+my ($user);
+my $users = new RT::Users($session{'CurrentUser'});
+$users->Limit(FIELD => 'id',
+              VALUE => $RT::SystemUser->id,
+              OPERATOR => '!=' );
+
+if (defined $IdLike) {
+$users->Limit(FIELD => 'Name',
+              VALUE => $IdLike,
+              OPERATOR => 'LIKE' );
+}
+if (defined $EmailLike) {
+$users->Limit(FIELD => 'EmailAddress',
+              VALUE => $EmailLike,
+              OPERATOR => 'LIKE');
+
+}
+</%INIT>
+<%ARGS>
+$IdLike => undef
+$EmailLike => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectNewGroupMembers b/rt/html/Admin/Elements/SelectNewGroupMembers
new file mode 100644 (file)
index 0000000..e5c28e9
--- /dev/null
@@ -0,0 +1,61 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% if ($Show ne 'Groups') {
+<b><&|/l&>Users</&></b>
+<SELECT MULTIPLE NAME="<%$Name%>Users"  SIZE=10>
+%while (my $user = $users->Next) {
+<OPTION VALUE="User-<%$user->id%>"><%$user->Name%></OPTION>
+%}
+</SELECT>
+<br>
+% }
+% if ($Show ne 'Users') {
+<b><&|/l&>Groups</&></b>
+<SELECT MULTIPLE NAME="<%$Name%>Groups"  SIZE=10>
+%while (my $group = $groups->Next) {
+<OPTION VALUE="Group-<%$group->id%>"><%$group->Name%></OPTION>
+%}
+</SELECT>
+% }
+
+<%INIT>
+my $users = new RT::Users($session{'CurrentUser'});
+
+$users->Limit(FIELD => 'id', VALUE => $RT::SystemUser->id, OPERATOR => '!=' );
+$users->Limit(FIELD => 'id', VALUE => $RT::Nobody->id, OPERATOR => '!=' );
+$users->LimitToPrivileged();
+
+my $groups = new RT::Groups($session{'CurrentUser'});
+
+# self-recursive group membership considered harmful!
+$groups->Limit(FIELD => 'id', VALUE => $Group->id, OPERATOR => '!=' );
+$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'UserDefined');
+
+
+</%INIT>
+<%ARGS>
+$Name => 'Users'
+$Show => 'All'
+$Group
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectRights b/rt/html/Admin/Elements/SelectRights
new file mode 100644 (file)
index 0000000..37a06dc
--- /dev/null
@@ -0,0 +1,90 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<INPUT TYPE=HIDDEN NAME="CheckACL"  VALUE="<%$ACLDesc%>">
+     <TABLE BORDER=0>
+<TR>
+<TD valign=top width="180"> 
+<h3><&|/l&>Current rights</&></h3>
+% if ($ACLObj->Count() > 0) {
+<i>(<&|/l&>Check box to revoke right</&>)</i> <BR>
+% } else {
+<i><&|/l&>No rights granted.</&></i> <BR>    
+% }
+% while (my $right = $ACLObj->Next()) {
+% if ($right->RightName) {
+<input type=checkbox value="<%$right->Id%>" name="RevokeRight-<%$ACLDesc%>-<%$right->RightName%>"> <% loc($right->RightName) %><br>
+% }
+%  }
+</TD>
+<TD valign=top>
+<h3><&|/l&>New rights</&></h3> 
+<SELECT SIZE=5  MULTIPLE  NAME="GrantRight-<%$ACLDesc%>">
+% foreach $right (sort keys %Rights) {
+      <OPTION VALUE="<%$right%>"  
+       ><% loc($right) %></OPTION>
+% }
+<OPTION VALUE="" SELECTED><&|/l&>(no value)</&></OPTION>
+</SELECT>
+</TD>
+</TR>
+</TABLE>
+<%INIT>
+    my ($right, $ACLDesc, $AppliesTo, %Rights);
+
+    # if the principal id points to a user, we really want to point
+    # to their ACL equivalence group. The machinations we're going through
+    # lead me to start to suspect that we really want users and groups
+    # to just be the same table. or _maybe_ that we want an object db.
+    my $princ = RT::Principal->new($RT::SystemUser);
+    $princ->Load($PrincipalId);
+    if ($princ->PrincipalType eq 'User') {
+    my $group = RT::Group->new($RT::SystemUser);
+        $group->LoadACLEquivalenceGroup($princ);
+        $PrincipalId = $group->PrincipalId;
+    }
+
+
+    my $ACLObj = new RT::ACL($session{'CurrentUser'});
+    my $ACE = new RT::ACE($session{'CurrentUser'});
+
+
+    $ACLObj->LimitToObject( $Object);
+    $ACLObj->LimitToPrincipal( Id => $PrincipalId);
+
+    if (ref($Object) && UNIVERSAL::can($Object, 'AvailableRights')) { 
+        %Rights = %{$Object->AvailableRights};
+    } 
+
+        else {
+                %Rights = { loc('System Error') => loc("No rights found")};
+        }
+        
+    $ACLDesc = "$PrincipalId-".ref($Object)."-".$Object->Id;
+</%INIT>
+    
+<%ARGS>
+$PrincipalType => undef
+$PrincipalId => undef
+$Object =>undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectScrip b/rt/html/Admin/Elements/SelectScrip
new file mode 100644 (file)
index 0000000..18e4098
--- /dev/null
@@ -0,0 +1,48 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME=<%$Name%>>
+<OPTION VALUE="" 
+<% $Default eq undef && 'SELECTED' %>
+>-</OPTION>
+%while  (my $Scrip = $Scrips->Next) {
+<OPTION VALUE=<% $Scrip->Id %>
+<% $Scrip->Id == $Default && 'SELECTED' %>
+><% loc($Scrip->Name) %>
+</OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my $Scrips = RT::Scrips->new($session{'CurrentUser'});
+$Scrips->UnLimit;
+
+
+
+</%INIT>
+<%ARGS>
+
+$Default => undef
+$Name => 'Scrip'
+
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectScripAction b/rt/html/Admin/Elements/SelectScripAction
new file mode 100644 (file)
index 0000000..0d7f8cc
--- /dev/null
@@ -0,0 +1,48 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME=<%$Name%>>
+<OPTION VALUE="" 
+<% $Default eq undef && 'SELECTED' %>
+>-</OPTION>
+%while  (my $ScripAction = $ScripActions->Next) {
+<OPTION VALUE=<%$ScripAction->Id%>
+<% $ScripAction->Id == $Default && 'SELECTED' %>
+><% loc($ScripAction->Name) %>
+</OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my $ScripActions = RT::ScripActions->new($session{'CurrentUser'});
+$ScripActions->UnLimit;
+
+
+
+</%INIT>
+<%ARGS>
+
+$Default => undef
+$Name => 'ScripAction'
+
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectScripCondition b/rt/html/Admin/Elements/SelectScripCondition
new file mode 100644 (file)
index 0000000..aeb366a
--- /dev/null
@@ -0,0 +1,48 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME=<%$Name%>>
+<OPTION VALUE="" 
+<% $Default eq undef && 'SELECTED' %>
+>-</OPTION>
+%while  (my $ScripCondition = $ScripConditions->Next) {
+<OPTION VALUE=<%$ScripCondition->Id%>
+<% $ScripCondition->Id == $Default && 'SELECTED' %>
+><% loc($ScripCondition->Name) %>
+</OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my $ScripConditions = RT::ScripConditions->new($session{'CurrentUser'});
+$ScripConditions->UnLimit;
+
+
+
+</%INIT>
+<%ARGS>
+
+$Default => undef
+$Name => 'ScripCondition'
+
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectSingleOrMultiple b/rt/html/Admin/Elements/SelectSingleOrMultiple
new file mode 100644 (file)
index 0000000..98e9ee7
--- /dev/null
@@ -0,0 +1,43 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+  <select name="<%$Name%>">
+    <option value="1" <%$SingleDefault%>><&|/l&>Single</&></option>
+    <option value="0" <%$MultipleDefault%>><&|/l&>Multiple</&></option>
+  </select>    
+
+
+<%INIT>
+my ($SingleDefault, $MultipleDefault);
+if ($Default == 1) {
+    $SingleDefault = "SELECTED";
+}
+elsif ($Default == 0 ) {
+    $MultipleDefault = "SELECTED";
+}
+
+</%INIT>
+<%ARGS>
+$Name => 'Single'
+$Default => 1
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectTemplate b/rt/html/Admin/Elements/SelectTemplate
new file mode 100644 (file)
index 0000000..70ff4d1
--- /dev/null
@@ -0,0 +1,61 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME=<%$Name%>>
+<OPTION VALUE="" 
+<% $Default eq 'none' && 'SELECTED' %>
+>-</OPTION>
+%while  (my $Template = $PrimaryTemplates->Next) {
+<OPTION VALUE=<%$Template->Id%>
+<% ($Template->Id == $Default) && 'SELECTED' %>
+><% loc($Template->Name) %>
+</OPTION>
+%}
+%while  (my $Template = $OtherTemplates->Next) {
+<OPTION VALUE=<%$Template->Id%>
+<% ($Template->Id == $Default)  && 'SELECTED'%>
+><&|/l, loc($Template->Name) &>Global template: [_1]</&>
+</OPTION>
+%}
+</SELECT>
+
+<%INIT>
+
+
+my $PrimaryTemplates = RT::Templates->new($session{'CurrentUser'});
+if ($Queue != 0) {
+$PrimaryTemplates->LimitToQueue($Queue);
+}
+
+my $OtherTemplates = RT::Templates->new($session{'CurrentUser'});
+$OtherTemplates->LimitToGlobal($DefaultQueue);
+
+</%INIT>
+<%ARGS>
+
+$Queue => undef
+$Default => 'none'
+$DefaultQueue => undef
+$Name => 'Template'
+
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SelectUsers b/rt/html/Admin/Elements/SelectUsers
new file mode 100644 (file)
index 0000000..d4c8a85
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT MULTIPLE NAME="<%$Name%>"  SIZE=10>
+%while (my $user = $users->Next) {
+<OPTION VALUE="<%$user->id%>"><%$user->Name%>
+%}
+</SELECT>
+
+<%INIT>
+my $users = new RT::Users($session{'CurrentUser'});
+
+$users->Limit(FIELD => 'id', VALUE => $RT::SystemUser->id, OPERATOR => '!=' );
+$users->Limit(FIELD => 'id', VALUE => $RT::Nobody->id, OPERATOR => '!=' );
+$users->LimitToPrivileged();
+
+</%INIT>
+<%ARGS>
+$Name => 'Users'
+</%ARGS>
diff --git a/rt/html/Admin/Elements/SystemTabs b/rt/html/Admin/Elements/SystemTabs
new file mode 100644 (file)
index 0000000..f38febd
--- /dev/null
@@ -0,0 +1,70 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Tabs, subtabs => $tabs, 
+    current_tab => 'Admin/Global/', 
+    current_subtab => $current_tab, 
+    Title => $Title &>
+
+<%INIT>
+  my $tabs = {
+                
+               A => { title => loc('Scrips'),
+                           path => 'Admin/Global/Scrips.html',
+                         },
+               B => { title => loc('Templates'),
+                        path => 'Admin/Global/Templates.html',
+                      },
+              
+                F => { title => loc('Custom Fields'),
+                        path => 'Admin/Global/CustomFields.html',
+                        },
+
+                G => { title => loc('Group Rights'),
+                                path => 'Admin/Global/GroupRights.html',
+                      },
+                H => { title => loc('User Rights'),
+                                path => 'Admin/Global/UserRights.html',
+                      }
+
+};
+
+  # Now let callbacks add their extra tabs
+  $m->comp('/Elements/Callback', tabs => $tabs, %ARGS);
+
+  foreach my $tab (sort keys %{$tabs}) {
+    if ($tabs->{$tab}->{'path'} eq $current_tab) {
+      $tabs->{$tab}->{"subtabs"} = $subtabs;
+      $tabs->{$tab}->{"current_subtab"} = $current_subtab;
+    }
+  }
+</%INIT>
+
+  
+<%ARGS>
+$id => undef
+$current_tab => undef
+$subtabs => undef
+$current_subtab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/Tabs b/rt/html/Admin/Elements/Tabs
new file mode 100644 (file)
index 0000000..8fa2708
--- /dev/null
@@ -0,0 +1,63 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Tabs, 
+    tabs => $tabs, 
+    current_toptab => 'Admin/', 
+    current_tab => $current_tab, 
+    Title => $Title &>
+
+<%INIT>
+  my $tabs = { A => { title => loc('Users'),
+                         path => 'Admin/Users/',
+                       },
+              B => { title => loc('Groups'),
+                          path => 'Admin/Groups/',
+                        },
+              C => { title => loc('Queues'),
+                          path => 'Admin/Queues/',
+                        },
+              D => { 'title' => loc('Global'),
+                          path => 'Admin/Global/',
+                        },
+            };
+
+  # Now let callbacks add their extra tabs
+  $m->comp('/Elements/Callback', tabs => $tabs, %ARGS);
+
+  foreach my $tab (sort keys %{$tabs}) {
+    if ($tabs->{$tab}->{'path'} eq $current_tab) {
+      $tabs->{$tab}->{"subtabs"} = $subtabs;
+      $tabs->{$tab}->{"current_subtab"} = $current_subtab;
+    }
+  }
+
+</%INIT>
+
+
+<%ARGS>
+$subtabs => undef
+$current_tab => undef
+$current_subtab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Admin/Elements/UserTabs b/rt/html/Admin/Elements/UserTabs
new file mode 100644 (file)
index 0000000..764fdfc
--- /dev/null
@@ -0,0 +1,74 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Tabs, 
+    subtabs => $tabs,
+    current_tab => 'Admin/Users/', 
+    current_subtab => $current_subtab, 
+    Title => $Title &>
+<%INIT>
+my $tabs;
+my $subtabs;
+if ($id) {
+$tabs->{'this'} = { title => eval { $UserObj->Name },
+
+                          path => "Admin/Users/Modify.html?id=".$id,
+subtabs => {
+              Queues => { title => loc('Basics'),
+                          path => "Admin/Users/Modify.html?id=".$id
+                        },
+#             Scrips => { title => loc('Rights'),
+#                         path => "Admin/Users/Rights.html?id=".$id
+#                       }
+              
+             }
+}
+}
+if ($session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers')) {
+  $tabs->{"A"} = { title => loc('Select user'),
+                       path => "Admin/Users/",
+                          };
+  $tabs->{"B"} = { title => loc('New user'),
+                       path => "Admin/Users/Modify.html?Create=1",
+                       separator => 1,
+                          };
+}
+
+  # Now let callbacks add their extra tabs
+  $m->comp('/Elements/Callback', tabs => $tabs, %ARGS);
+                                                                                
+foreach my $tab ( sort keys %{$tabs} ) {                                        
+    if ( $tabs->{$tab}->{'path'} eq $current_subtab ) {                         
+        $tabs->{$tab}->{"current_subtab"} = $current_subtab;                    
+    }                                                                           
+}                                                                               
+</%INIT>
+  
+  
+<%ARGS>
+$UserObj => undef
+$id => undef
+$current_tab => undef
+$current_subtab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Admin/Global/CustomField.html b/rt/html/Admin/Global/CustomField.html
new file mode 100644 (file)
index 0000000..0974af5
--- /dev/null
@@ -0,0 +1,61 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/CustomFields.html',
+    current_subtab => $current_subtab, 
+    subtabs => $subtabs, 
+    Title => $title &>
+
+<& /Admin/Elements/EditCustomField, title => $title,  %ARGS &>
+
+<%INIT>
+my ($title, $current_subtab);
+
+my $subtabs = {
+                A => { title => loc('Select custom field'),
+                       path => "Admin/Global/CustomFields.html"
+                          },
+                B => { title => loc('New custom field'),
+                       path => "Admin/Global/CustomField.html?create=1&Queue=0",
+                       separator => 1,
+                          }
+             };
+if ( $ARGS{'create'} ) {
+    $current_subtab = "Admin/Global/CustomField.html?create=1&Queue=0";
+    $title          = loc('Create a CustomField which applies to all queues');
+}
+else {
+    $current_subtab =
+      "Admin/Global/CustomField.html?CustomField=" . $CustomField . "&Queue=0";
+    $title = loc('Modify a CustomField which applies to all queues');
+    $subtabs->{"C"} = {
+        title => loc( 'Custom Field #[_1]', $CustomField ),
+        path => "Admin/Global/CustomField.html?CustomField=" . $CustomField . "&Queue=0"
+    };
+}
+</%INIT>
+<%ARGS>
+$CustomField => undef
+</%ARGS>
diff --git a/rt/html/Admin/Global/CustomFields.html b/rt/html/Admin/Global/CustomFields.html
new file mode 100644 (file)
index 0000000..f6bbddf
--- /dev/null
@@ -0,0 +1,47 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/CustomFields.html',
+    current_subtab => 'Admin/Global/CustomFields.html', 
+    subtabs => $subtabs, 
+    Title => $title &>
+
+<& /Admin/Elements/EditCustomFields, title => $title, %ARGS &>
+
+<%INIT>
+my $subtabs = {
+                A => { title => loc('Select custom field'),
+                       path => "Admin/Global/CustomFields.html"
+                          },
+                B => { title => loc('New custom field'),
+                       path => "Admin/Global/CustomField.html?create=1&Queue=0",
+                       separator => 1,
+                          }
+             };
+my $title = loc("Modify Custom Fields which apply to all queues");
+</%INIT>
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Global/GroupRights.html b/rt/html/Admin/Global/GroupRights.html
new file mode 100644 (file)
index 0000000..150e83f
--- /dev/null
@@ -0,0 +1,99 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Modify global group rights') &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/GroupRights.html', 
+    Title => loc('Modify global group rights') &>  
+<& /Elements/ListActions, actions => \@results &>
+
+  <FORM METHOD=POST ACTION="GroupRights.html">
+      
+<& /Elements/TitleBoxStart, title => loc('Modify global group rights.')&>
+      
+<h1><&|/l&>System groups</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToSystemInternalGroups();
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% loc($Group->Type) %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        Object  =>$RT::System &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+<h1><&|/l&>Roles</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToRolesForSystem();
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% loc($Group->Type) %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        Object  => $RT::System &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+<h1><&|/l&>User defined groups</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToUserDefinedGroups();    
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% $Group->Name %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        Object  => $RT::System &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+            
+      <& /Elements/TitleBoxEnd &>
+      <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+      
+  </FORM>
+  
+<%INIT>
+  #Update the acls.
+  my @results =  ProcessACLChanges(\%ARGS);
+
+
+my $Groups;
+    
+</%INIT>
+
+<%ARGS>
+</%ARGS>
diff --git a/rt/html/Admin/Global/Scrip.html b/rt/html/Admin/Global/Scrip.html
new file mode 100644 (file)
index 0000000..8b9cf6d
--- /dev/null
@@ -0,0 +1,56 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title  &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/Scrips.html', 
+    current_subtab => $current_subtab, 
+    subtabs => $subtabs, 
+    Title => $title &>
+
+<& /Admin/Elements/EditScrip, title => $title,  %ARGS &>
+
+<%init>
+my ($title, $current_subtab);
+my $subtabs = {
+                A => { title => loc('Select scrip'),
+                       path => "Admin/Global/Scrips.html",
+                          },
+                B => { title => loc('New scrip'),
+                       path => "Admin/Global/Scrip.html?create=1&Queue=0",
+                       separator => 1,
+                          }
+             };
+
+if ($ARGS{'id'}) {
+    $current_subtab = "Admin/Global/Scrip.html?id=".$ARGS{'id'}."&Queue=0";
+    $title = loc("Modify a scrip which applies to all queues");
+    $subtabs->{"C"} = { title => loc('Scrip #[_1]', $ARGS{'id'}),
+                       path => "Admin/Global/Scrip.html?id=".$ARGS{'id'}."&Queue=0"
+                          }
+}
+else {
+    $current_subtab = "Admin/Global/Scrip.html?create=1&Queue=0";
+    $title = loc("Add a scrip which will apply to all queues");
+}
+</%init>
diff --git a/rt/html/Admin/Global/Scrips.html b/rt/html/Admin/Global/Scrips.html
new file mode 100644 (file)
index 0000000..7631980
--- /dev/null
@@ -0,0 +1,53 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title  &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/Scrips.html', 
+    current_subtab => 'Admin/Global/Scrips.html', 
+    subtabs => $subtabs, 
+    Title => $title &>
+<& /Admin/Elements/EditScrips, title => $title, id => $id, %ARGS &>
+</form>
+<%init>
+
+my $subtabs = {
+                A => { title => loc('Select scrip'),
+                       path => "Admin/Global/Scrips.html",
+                          },
+                B => { title => loc('New scrip'),
+                       path => "Admin/Global/Scrip.html?create=1&Queue=0",
+                       separator => 1,
+                          }
+             };
+my $title = loc("Modify scrips which apply to all queues");
+
+my (@actions);
+
+</%init>
+
+
+
+<%ARGS>
+$id => 0
+</%ARGS>
diff --git a/rt/html/Admin/Global/Template.html b/rt/html/Admin/Global/Template.html
new file mode 100644 (file)
index 0000000..71f77e9
--- /dev/null
@@ -0,0 +1,101 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc("Modify template [_1]", $TemplateObj->id)  &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/Templates.html', 
+    current_subtab => $current_subtab, 
+    subtabs => $subtabs, 
+    Title => loc("Modify template [_1]", $TemplateObj->id) &>
+<& /Elements/ListActions, actions => \@results &>
+
+
+<FORM METHOD=POST ACTION="Template.html">
+%if ($Create ) {
+<INPUT TYPE=HIDDEN NAME="Template" VALUE="new">
+% } else {
+<INPUT TYPE=HIDDEN NAME="Template" VALUE="<%$TemplateObj->Id%>">
+% }
+
+%# hang onto the queue id
+<INPUT TYPE=HIDDEN name="Queue" value="<%$Queue%>">
+
+<& /Admin/Elements/ModifyTemplate, Name => $TemplateObj->Name, Description => $TemplateObj->Description, Content => $TemplateObj->Content &>
+
+<& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+</FORM>
+
+
+
+<%INIT>
+
+my $TemplateObj = new RT::Template($session{'CurrentUser'});
+my  ($title, @results, $current_subtab);
+
+my $subtabs = {
+                A => { title => loc('Select template'),
+                       path => "Admin/Global/Templates.html"
+                          },
+                B => { title => loc('New template'),
+                       path => "Admin/Global/Template.html?Create=1&Queue=0",
+                       separator => 1,
+                          }
+             };
+
+
+if ($Create) {
+  $current_subtab = "Admin/Global/Template.html?Create=1&Queue=0";
+  $title = loc("Create a template");
+}
+
+else {
+  if ($Template eq 'new') {
+      my ($val, $msg) =  $TemplateObj->Create(Queue => $Queue, Name => $Name);
+      Abort(loc("Could not create template: [_1]", $msg)) unless ($val);
+     push @results, $msg;
+    }
+    else {
+       $TemplateObj->Load($Template) || Abort(loc('No Template'));
+    }
+      $title = loc('Modify template [_1]', loc($TemplateObj->Name())); 
+  
+    
+}
+if ($TemplateObj->Id()) {
+  my @attribs = qw( Description Content Queue Name);
+  my @aresults = UpdateRecordObject( AttributesRef => \@attribs, 
+                                    Object => $TemplateObj, 
+                                    ARGSRef => \%ARGS);
+  $current_subtab = "Admin/Global/Template.html?Queue=0&Template=".$TemplateObj->Id();
+  $subtabs->{"C"} = { title => loc('Template #[_1]', $TemplateObj->Id()),
+                       path => "Admin/Global/Template.html?Queue=0&Template=".$TemplateObj->Id(),
+                       };
+  push @results, @aresults;
+}
+</%INIT>
+<%ARGS>
+$Queue => undef
+$Template => undef
+$Create => undef
+$Name => undef
+</%ARGS>
diff --git a/rt/html/Admin/Global/Templates.html b/rt/html/Admin/Global/Templates.html
new file mode 100644 (file)
index 0000000..77aab07
--- /dev/null
@@ -0,0 +1,53 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/Templates.html', 
+    current_subtab => 'Admin/Global/Templates.html', 
+    subtabs => $subtabs, 
+    Title => $title &>
+<& /Admin/Elements/EditTemplates, title => $title, %ARGS &>
+</form>
+<%init>
+
+my $subtabs = {
+                A => { title => loc('Select template'),
+                       path => "Admin/Global/Templates.html"
+                          },
+                B => { title => loc('New template'),
+                       path => "Admin/Global/Template.html?Create=1&Queue=0",
+                       separator => 1,
+                          }
+             };
+my $title = loc("Modify templates which apply to all queues");
+
+my (@actions);
+
+</%init>
+
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Global/UserRights.html b/rt/html/Admin/Global/UserRights.html
new file mode 100644 (file)
index 0000000..aee82d1
--- /dev/null
@@ -0,0 +1,77 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Modify global user rights') &>
+<& /Admin/Elements/SystemTabs, 
+    current_tab => 'Admin/Global/UserRights.html',
+    Title => loc('Modify global user rights') &>  
+<& /Elements/ListActions, actions => \@results &>
+
+  <FORM METHOD=POST ACTION="UserRights.html">
+      
+<& /Elements/TitleBoxStart, title => loc('Modify global user rights.') &>
+      
+<TABLE>
+        
+%      while (my $Member = $Users->Next()) {
+% my $UserObj = $Member->MemberObj->Object();
+% my $group = RT::Group->new($session{'CurrentUser'});
+% $group->LoadACLEquivalenceGroup($Member->MemberObj);
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% $UserObj->Name %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $group->PrincipalId,
+        Object => $RT::System  &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+            
+      <& /Elements/TitleBoxEnd &>
+      <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+      
+  </FORM>
+  
+<%INIT>
+  #Update the acls.
+  my @results =  ProcessACLChanges(\%ARGS);
+
+# {{{ Deal with setting up the display of current rights.
+
+
+# Find out which users we want to display ACL selects for
+my $Privileged = RT::Group->new($session{'CurrentUser'});
+$Privileged->LoadSystemInternalGroup('Privileged');
+my $Users = $Privileged->MembersObj();
+
+    
+  
+# }}}
+    
+</%INIT>
+
+<%ARGS>
+</%ARGS>
diff --git a/rt/html/Admin/Global/index.html b/rt/html/Admin/Global/index.html
new file mode 100644 (file)
index 0000000..1749f4f
--- /dev/null
@@ -0,0 +1,64 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Callback, tabs => $tabs, %ARGS &>
+<& /Admin/Elements/Header, Title => loc('Admin/Global configuration') &>
+<& /Admin/Elements/SystemTabs, 
+    Title => loc('Admin/Global configuration') &>
+
+<ul>
+% foreach my $key (sort keys %$tabs) {
+<li><font size="+2"><a href="<% $tabs->{$key}{path} %>"><% $tabs->{$key}{title} %></a></font><br>
+<% $tabs->{$key}{text} %>
+</li>
+% }
+</ul>
+
+<%INIT>
+  my $tabs = {
+                
+               A => { title => loc('Scrips'),
+                           text => loc('Modify scrips which apply to all queues'),
+                           path => 'Scrips.html',
+                         },
+               B => { title => loc('Templates'),
+                        text => loc('Edit system templates'),
+                        path => 'Templates.html',
+                      },
+              
+                F => { title => loc('Custom Fields'),
+                        text => loc('Modify Custom Fields which apply to all queues'),
+                        path => 'CustomFields.html',
+                        },
+
+                G => { title => loc('Group Rights'),
+                                text => loc('Modify global group rights'),
+                                path => 'GroupRights.html',
+                      },
+                H => { title => loc('User Rights'),
+                                text => loc('Modify global user rights'),
+                                path => 'UserRights.html',
+                      }
+
+};
+</%INIT>
diff --git a/rt/html/Admin/Groups/GroupRights.html b/rt/html/Admin/Groups/GroupRights.html
new file mode 100644 (file)
index 0000000..6220259
--- /dev/null
@@ -0,0 +1,95 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Modify group rights for group [_1]', $GroupObj->Name) &>
+<& /Admin/Elements/GroupTabs, 
+    GroupObj => $GroupObj, 
+    current_tab => 'Admin/Groups/GroupRights.html?id='.$id, 
+    Title => loc('Modify group rights for group [_1]', $GroupObj->Name) &>
+<& /Elements/ListActions, actions => \@results &>
+
+  <FORM METHOD=POST ACTION="GroupRights.html">
+    <INPUT TYPE=HIDDEN NAME=id VALUE="<% $GroupObj->id %>">
+      
+<& /Elements/TitleBoxStart, title => loc('Modify group rights for group [_1]', $GroupObj->Name) &>
+      
+<h1><&|/l&>System groups</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToSystemInternalGroups();
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% loc($Group->Type) %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        PrincipalType => 'Group',
+        Object => $GroupObj  &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+<h1><&|/l&>User defined groups</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToUserDefinedGroups();    
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% $Group->Name %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        PrincipalType => 'Group',
+        Object => $GroupObj  &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+            
+      <& /Elements/TitleBoxEnd &>
+      <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+      
+  </FORM>
+  
+<%INIT>
+  #Update the acls.
+  my @results =  ProcessACLChanges(\%ARGS);
+
+
+if (!defined $id) {
+    Abort(loc("No Group defined"));
+}
+
+my $GroupObj = RT::Group->new($session{'CurrentUser'});
+$GroupObj->Load($id) || Abort(loc("Couldn't load group [_1]",$id));
+
+my $Groups;
+    
+</%INIT>
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Groups/Members.html b/rt/html/Admin/Groups/Members.html
new file mode 100644 (file)
index 0000000..6e66966
--- /dev/null
@@ -0,0 +1,134 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => "RT/Admin/Edit the group ". $Group->Name &>
+<& /Admin/Elements/GroupTabs, GroupObj => $Group, 
+    current_tab => 'Admin/Groups/Members.html?id='.$id, 
+    Title => "RT/Admin/Edit the group ". $Group->Name &>
+<& /Elements/ListActions, actions => \@results &>
+
+
+<& /Elements/TitleBoxStart, title => loc('Editing membership for group [_1]', $Group->Name) &>
+
+<FORM ACTION="<%$RT::WebPath%>/Admin/Groups/Members.html" METHOD=POST>
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Group->Id%>">
+<TABLE WIDTH="100%">
+<TR>
+<TD>
+<h3><&|/l&>Current members</&></h3>
+</TD>
+<TD>
+<h3><&|/l&>Add members</&></h3>
+</TD>
+</TR>
+
+<TR>
+<TD VALIGN=TOP>
+
+% if ($Group->MembersObj->Count == 0 ) {
+<i><&|/l&>(No members)</&></i>
+% } else {
+<i><&|/l&>(Check box to delete)</&></i>
+<br>
+<br>
+<&|/l&>Users</&>
+% my $UserMembers = $Group->MembersObj;
+% $UserMembers->LimitToUsers();
+<UL>
+% while (my $member = $UserMembers->Next()) {
+<LI><INPUT TYPE=CHECKBOX Name="DeleteMember-<%$member->MemberId%>">
+<%$member->MemberObj->Object->Name%> (<%$member->MemberObj->Object->RealName%>)
+% }
+</ul>
+<&|/l&>Groups</&>
+<ul>
+% my $GroupMembers = $Group->MembersObj;
+% $GroupMembers->LimitToGroups();
+% while (my $member = $GroupMembers->Next()) {
+<LI><INPUT TYPE=CHECKBOX Name="DeleteMember-<%$member->MemberId%>">
+<%$member->MemberObj->Object->Name%>
+% }
+% }
+</UL>
+</TD>
+<TD VALIGN=TOP>
+<& /Admin/Elements/SelectNewGroupMembers, Name => "AddMembers", Group => $Group &>
+</TD>
+</TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+</form>
+
+
+<%INIT>
+
+my $Group = new RT::Group($session{'CurrentUser'});
+$Group->Load($id) || Abort(loc('Could not load group'));
+
+my (@results);
+
+my $key;
+foreach $key (keys %ARGS) {
+
+if ($key =~ /^DeleteMember-(\d+)$/) {
+    my $id = $1; 
+    my ($val,$msg) = $Group->DeleteMember($id);
+    push (@results, $msg);
+}
+}
+
+# Make sure AddMembers is always an array
+my @AddMembers = (
+    ((ref $AddMembersUsers eq 'ARRAY') ? @{$AddMembersUsers} : ($AddMembersUsers)),
+    ((ref $AddMembersGroups eq 'ARRAY') ? @{$AddMembersGroups} : ($AddMembersGroups)),
+);
+
+foreach my $member (@AddMembers) {
+    next unless ($member);
+
+    my $principal;
+
+    if ($member =~ /^Group-(\d+)$/) {
+        $principal = RT::Group->new($session{'CurrentUser'});
+        $principal->Load($1);
+    } elsif ($member =~ /^User-(\d+)$/) {
+        $principal = RT::User->new($session{'CurrentUser'});
+        $principal->Load($1);
+    } else {
+        next;
+    }
+
+
+    my ($val, $msg) = $Group->AddMember($principal->PrincipalId);
+    push (@results, $msg);
+}
+
+
+</%INIT>
+
+<%ARGS>
+$AddMembersUsers  => undef
+$AddMembersGroups => undef
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Groups/Modify.html b/rt/html/Admin/Groups/Modify.html
new file mode 100644 (file)
index 0000000..c5e9158
--- /dev/null
@@ -0,0 +1,134 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title  &>
+
+<& /Admin/Elements/GroupTabs, 
+    GroupObj => $Group, 
+    current_tab => $current_tab, 
+    Title => $title &>
+<& /Elements/ListActions, actions => \@results &>
+
+
+
+<FORM ACTION="<%$RT::WebPath%>/Admin/Groups/Modify.html" METHOD=POST>
+
+%unless ($Group->Id) {
+<INPUT TYPE=HIDDEN NAME=id VALUE="new">
+% } else {
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Group->Id%>">
+% }
+<TABLE>
+<TR><TD ALIGN=RIGHT>
+<&|/l&>Name</&>:
+</TD>
+<TD><INPUT name="Name" value="<%$Group->Name%>"></TD>
+</TR><TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Description</&>:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$Group->Description%>" size=60></TD>
+</TR><TR>
+<TD COLSPAN=2>
+<INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1">
+<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>> <&|/l&>Enabled (Unchecking this box disables this group)</&><BR>
+</TR>
+</TABLE>
+<& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+</form>
+<%INIT>
+
+my $current_tab;
+my  ($title, @results, $Disabled, $EnabledChecked);
+
+my $Group = RT::Group->new($session{'CurrentUser'});
+
+if ($Create) {
+    $current_tab = 'Admin/Groups/Modify.html?Create=1';
+    $title = loc("Create a new group");
+} 
+
+else {
+    $current_tab = 'Admin/Groups/Modify.html?id='.$id;
+    if ($id eq 'new' ) {
+       
+       my ($create_id, $create_msg) = $Group->CreateUserDefinedGroup(Name =>
+    "$Name");
+        unless ($create_id) {
+            Abort (loc("Group could not be created: [_1]", $create_msg));
+     }
+       $id = $Group->Id;
+    }
+    else {
+       $Group->Load($id) || Abort('Could not load group');
+    }
+
+
+    if ($id) {
+       $title = loc("Modify the group [_1]", $Group->Name);
+
+    }  
+
+    # If the create failed
+    else {
+       $title = loc("Create a new group");
+       $Create = 1;
+    }    
+    
+}
+
+if ($id) {
+    
+    my @fields = qw(Description Name );
+    my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields,
+                                           Object => $Group,
+                                           ARGSRef => \%ARGS );
+    push (@results,@fieldresults);
+}
+
+#we're asking about enabled on the web page but really care about disabled.
+if ($Enabled == 1) {
+    $Disabled = 0;
+}      
+else {
+    $Disabled = 1;
+}
+if  ( ($SetEnabled) and ( $Disabled != $Group->Disabled) ) { 
+    my  ($code, $msg) = $Group->SetDisabled($Disabled);
+    push @results, loc('Enabled status [_1]', loc_fuzzy($msg));
+}
+
+unless ($Group->Disabled()) {
+    $EnabledChecked ="CHECKED";
+}
+
+
+</%INIT>
+
+
+<%ARGS>
+$Create => undef
+$Name => undef
+$Description => undef
+$SetEnabled => undef
+$Enabled => undef
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Groups/UserRights.html b/rt/html/Admin/Groups/UserRights.html
new file mode 100644 (file)
index 0000000..0a87ef8
--- /dev/null
@@ -0,0 +1,92 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Modify user rights for group [_1]', $GroupObj->Name) &>
+<& /Admin/Elements/GroupTabs, 
+    GroupObj => $GroupObj, 
+    current_tab => 'Admin/Groups/UserRights.html?id='.$id, 
+    Title => loc('Modify user rights for group [_1]', $GroupObj->Name) &>  
+<& /Elements/ListActions, actions => \@results &>
+
+  <FORM METHOD=POST ACTION="UserRights.html">
+    <INPUT TYPE=HIDDEN NAME=id VALUE="<% $GroupObj->id %>">
+      
+<& /Elements/TitleBoxStart, title => loc('Modify user rights for group [_1]', $GroupObj->Name) &>
+      
+<TABLE>
+        
+%      while (my $Member = $Users->Next()) {
+% my $UserObj = $Member->MemberObj->Object();
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% $UserObj->Name %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Member->MemberObj->Id,
+        PrincipalType => 'User', 
+        Object => $GroupObj  &>
+         </TD>
+       </TR>
+% }
+      </TABLE>
+            
+      <& /Elements/TitleBoxEnd &>
+      <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+      
+  </FORM>
+  
+<%INIT>
+  #Update the acls.
+  my @results =  ProcessACLChanges(\%ARGS);
+
+# {{{ Deal with setting up the display of current rights.
+
+
+#Define vars used in html above
+
+
+if (!defined $id) {
+    Abort(loc("No Group defined"));
+}
+
+my $GroupObj = RT::Group->new($session{'CurrentUser'});
+$GroupObj->Load($id) || Abort(loc("Couldn't load group [_1]",$id));
+
+# Find out which users we want to display ACL selects for
+my $Privileged = RT::Group->new($session{'CurrentUser'});
+$Privileged->LoadSystemInternalGroup('Privileged');
+my $Users = $Privileged->MembersObj();
+
+    
+  
+# }}}
+    
+</%INIT>
+
+<%ARGS>
+$id => undef
+$UserString => undef
+$UserOp => undef
+$UserField => undef
+</%ARGS>
diff --git a/rt/html/Admin/Groups/index.html b/rt/html/Admin/Groups/index.html
new file mode 100644 (file)
index 0000000..57c86c9
--- /dev/null
@@ -0,0 +1,43 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/GroupTabs, current_tab => 'Admin/Groups/',
+    current_subtab => 'Admin/Groups/', 
+    Title => $title &>
+
+
+<UL>
+%while ( my $Group = $Groups->Next) {
+<LI><A HREF="Modify.html?id=<%$Group->id%>"><%$Group->Name || loc('(empty)')%></a><BR>
+%}
+</UL>
+
+<%INIT>
+my $Groups = RT::Groups->new($session{'CurrentUser'});
+$Groups->LimitToUserDefinedGroups();
+my $title = loc('Select a group');
+
+</%INIT>
+<%ARGS>
+</%ARGS>
diff --git a/rt/html/Admin/Queues/CustomField.html b/rt/html/Admin/Queues/CustomField.html
new file mode 100644 (file)
index 0000000..2515c3e
--- /dev/null
@@ -0,0 +1,60 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/QueueTabs, id => $QueueObj->Id, 
+    QueueObj => $QueueObj,                                                      
+    current_tab => 'Admin/Queues/CustomFields.html?id='.$QueueObj->id, 
+    current_subtab => $current_subtab, 
+    subtabs => $subtabs, 
+    Title => $title &>
+
+<& /Admin/Elements/EditCustomField, title => $title,  %ARGS &>
+
+<%INIT>
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($Queue);
+
+my ($title, $current_subtab);
+
+unless($QueueObj->id) {
+    Abort(loc("Queue [_1] not found", $Queue));
+}
+if ($CustomField) {
+    $title = loc('Modify a CustomField for queue [_1]', $QueueObj->Name()); 
+}else {
+    $current_subtab = "Admin/Queues/CustomField.html?create=1&Queue=".$QueueObj->id;
+    $title = loc('Create a CustomField for queue [_1]', $QueueObj->Name()); 
+}
+
+my $subtabs = {
+                A => { title => loc('New custom field'),
+                       path => "Admin/Queues/CustomField.html?create=1&Queue=".$QueueObj->id
+                          }
+             };
+
+</%INIT>
+<%ARGS>
+$CustomField => undef
+$Queue => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/CustomFields.html b/rt/html/Admin/Queues/CustomFields.html
new file mode 100644 (file)
index 0000000..78c6c27
--- /dev/null
@@ -0,0 +1,48 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/QueueTabs, id => $Queue->id, 
+    current_tab => 'Admin/Queues/CustomFields.html?id='.$id, 
+    QueueObj => $Queue,                                                      
+    subtabs => $subtabs,
+    Title => $title
+    &>
+
+<& /Admin/Elements/EditCustomFields, title => $title, %ARGS &>
+<%INIT>
+my $Queue = new RT::Queue($session{'CurrentUser'});
+$Queue->Load($id);
+my $CustomFields = RT::CustomFields->new($RT::SystemUser);
+$CustomFields->LimitToQueue($Queue->Id);
+my $subtabs = {
+        A => { title => loc('New custom field'),
+               path => "Admin/Queues/CustomField.html?create=1&Queue=".$id,
+                          }
+             };
+
+my $title=  loc('Edit Custom Fields for [_1]', $Queue->Name);
+</%INIT>
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/GroupRights.html b/rt/html/Admin/Queues/GroupRights.html
new file mode 100644 (file)
index 0000000..a1ac709
--- /dev/null
@@ -0,0 +1,110 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Modify group rights for queue [_1]', $QueueObj->Name) &>
+<& /Admin/Elements/QueueTabs, id => $id, 
+    QueueObj => $QueueObj,                                                      
+    current_tab => $current_tab, 
+    Title => loc('Modify group rights for queue [_1]', $QueueObj->Name) &>
+<& /Elements/ListActions, actions => \@results &>
+
+  <FORM METHOD=POST ACTION="GroupRights.html">
+    <INPUT TYPE=HIDDEN NAME=id VALUE="<% $QueueObj->id %>">
+      
+      
+<h1><&|/l&>System groups</&></h1>
+<TABLE>
+<& /Elements/Callback, QueueObj => $QueueObj, results => \@results, %ARGS &>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToSystemInternalGroups();
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% loc($Group->Type) %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        Object => $QueueObj  &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+<h1><&|/l&>Roles</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToRolesForQueue($QueueObj->Id);
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% loc($Group->Type) %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        Object => $QueueObj  &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+<h1><&|/l&>User defined groups</&></h1>
+<TABLE>
+% $Groups = RT::Groups->new($session{'CurrentUser'});
+% $Groups->LimitToUserDefinedGroups();    
+%      while (my $Group = $Groups->Next()) {
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% $Group->Name %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId => $Group->PrincipalId,
+        Object => $QueueObj  &>
+         </TD>
+       </TR>
+% }
+</TABLE>
+            
+      <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+      
+  </FORM>
+  
+<%INIT>
+  #Update the acls.
+  my @results =  ProcessACLChanges(\%ARGS);
+
+
+if (!defined $id) {
+    Abort(loc("No Queue defined"));
+}
+
+my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+$QueueObj->Load($id) || Abort(loc("Couldn't load queue [_1]",$id));
+
+my $Groups;
+my $current_tab;
+$current_tab = 'Admin/Queues/GroupRights.html?id='.$QueueObj->id;
+    
+</%INIT>
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/Modify.html b/rt/html/Admin/Queues/Modify.html
new file mode 100644 (file)
index 0000000..46608eb
--- /dev/null
@@ -0,0 +1,163 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Admin/Queue/Basics') &>
+<& /Admin/Elements/QueueTabs, id => $QueueObj->id, 
+    QueueObj => $QueueObj,
+    current_tab => $current_tab, 
+    Title => loc('Admin/Queue/Basics') &>
+<& /Elements/ListActions, actions => \@results &>
+
+
+
+<FORM ACTION="<%$RT::WebPath%>/Admin/Queues/Modify.html" METHOD=POST>
+%if ($Create ) { 
+<INPUT TYPE=HIDDEN NAME=id VALUE="new">
+% } else {
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>">
+% }
+
+<TABLE>
+<TR><TD ALIGN=RIGHT>
+<&|/l&>Queue Name</&>: 
+</TD>
+<TD><INPUT name="Name" value="<% ($Create) ? "" : $QueueObj->Name %>"></TD>
+</TR><TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Description</&>:</TD><TD COLSPAN=3><INPUT name="Description" value="<% ($Create) ? "" : $QueueObj->Description %>" size=60></TD></TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Correspondence Address</&>:
+</TD><TD>
+<INPUT name="CorrespondAddress" value="<% ($Create) ? "" : $QueueObj->CorrespondAddress %>">
+<BR><font size="-1"><i><&|/l , $RT::CorrespondAddress&>(If left blank, will default to [_1]</&></i></font>
+</TD>
+<TD ALIGN=RIGHT>
+
+<&|/l&>Comment Address</&>: </TD><TD>
+<INPUT NAME="CommentAddress" value="<% ($Create) ? "" : $QueueObj->CommentAddress %>">
+<BR><font size="-1"><i><&|/l , $RT::CommentAddress&>(If left blank, will default to [_1]</&></i></font>
+</TD>
+</TR><TR>
+
+<TD ALIGN=RIGHT>
+<&|/l&>Priority starts at</&>: 
+</TD><TD><INPUT NAME="InitialPriority" value="<% ($Create) ? "" : $QueueObj->InitialPriority %>">
+</TD>
+<TD ALIGN=RIGHT>
+<&|/l&>Over time, priority moves toward</&>:
+</TD><TD><INPUT NAME="FinalPriority" value="<% ($Create) ? "" : $QueueObj->FinalPriority %>">
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Requests should be due in</&>:
+</TD><TD>
+<INPUT NAME="DefaultDueIn" VALUE="<% ($Create) ? "" : $QueueObj->DefaultDueIn%>"> <&|/l&>days</&>.
+</TD>
+</TR>
+<TR>
+<TD>
+</TD>
+<TD COLSPAN=4><INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1">
+<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>> <&|/l&>Enabled (Unchecking this box disables this queue)</&><BR>
+<& /Elements/Callback, QueueObj => $QueueObj, results => \@results, %ARGS &>
+</TD>
+</TR>
+
+</TABLE>
+<& /Elements/Submit &>
+</form>
+
+
+
+<%INIT>
+my $current_tab;
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($id);
+my  ($title, @results, $Disabled, $EnabledChecked);
+$EnabledChecked = "CHECKED";
+
+if ($Create) {
+    $current_tab = 'Admin/Queues/Modify.html?Create=1';
+    $title = loc("Create a queue");
+} else {
+    if ($id eq 'new') {
+       my ($val, $msg) =  $QueueObj->Create(Name => $Name);
+       delete $session{'create_in_queues'};
+       if ($val == 0 ) {
+           Abort("$msg");
+       }
+       else {
+               push @results, $msg;
+       }    
+     }
+     else {
+        $QueueObj->Load($id) || $QueueObj->Load($Name) || Abort("Couldn't load queue '$Name'");
+    }
+        $title = loc('Editing Configuration for queue [_1]', $QueueObj->Name);
+    
+    $current_tab = 'Admin/Queues/Modify.html?id='.$QueueObj->id;
+}
+if ($QueueObj->Id()) {
+    delete $session{'create_in_queues'};
+my @attribs= qw(Description CorrespondAddress CommentAddress Name 
+                InitialPriority FinalPriority DefaultDueIn);
+
+  @results = UpdateRecordObject( AttributesRef => \@attribs, 
+                                   Object => $QueueObj, 
+                                   ARGSRef => \%ARGS);
+
+  #we're asking about enabled on the web page but really care about disabled.
+  if ($Enabled == 1) {
+      $Disabled = 0;
+  }    
+  else {
+      $Disabled = 1;
+  }
+  if  ( ($SetEnabled) and ( $Disabled != $QueueObj->Disabled) ) { 
+      my  ($code, $msg) = $QueueObj->SetDisabled($Disabled);
+      push @results, loc('Enabled status [_1]', loc_fuzzy($msg));
+  }
+  
+  if ($QueueObj->Disabled()) {
+      $EnabledChecked ="";
+  }
+}
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+$result => undef
+$Name => undef
+$Create => undef
+$Description => undef
+$CorrespondAddress => undef
+$CommentAddress => undef
+$InitialPriority => undef
+$FinalPriority => undef
+$DefaultDueIn => undef
+$SetEnabled => undef
+$Enabled => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/People.html b/rt/html/Admin/Queues/People.html
new file mode 100644 (file)
index 0000000..e0a7345
--- /dev/null
@@ -0,0 +1,186 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc('Modify people related to queue [_1]', $QueueObj->Name) &>
+<& /Admin/Elements/QueueTabs, id => $id, 
+    QueueObj => $QueueObj,                                                      
+    current_tab => $current_tab, 
+    Title => loc('Modify people related to queue [_1]', $QueueObj->Name) &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="People.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>">
+
+<TABLE WIDTH=100%>
+<TR>
+<TD VALIGN=TOP >
+
+<h3><&|/l&>Current watchers</&></h3>
+
+
+<&|/l&>Cc</&>:
+
+<& /Admin/Elements/EditQueueWatchers, QueueObj => $QueueObj, Watchers => $QueueObj->Cc &>
+
+<&|/l&>Administrative Cc</&>:
+
+<& /Admin/Elements/EditQueueWatchers, QueueObj => $QueueObj, Watchers => $QueueObj->AdminCc &>
+
+
+</TD>
+<TD VALIGN=TOP>
+<h3><&|/l&>New watchers</&></h3>
+
+<&|/l&>Find people whose</&><BR>
+<& /Elements/SelectUsers &>
+<input type=submit name="OnlySearchForPeople" value="<&|/l&>Go!</&>">
+<BR>
+<&|/l&>Find group whose</&><BR>
+<& /Elements/SelectGroups &>
+<input type=submit name="OnlySearchForGroup" value="<&|/l&>Go!</&>">
+
+<p>
+<&|/l&>Add new watchers</&>:<br>
+<p>
+<b><&|/l&>Users</&></b>
+% if ($user_msg) {
+<br>
+<i><%$user_msg%></i>
+% } elsif ($Users) {
+<ul>
+% while (my $u = $Users->Next ) {
+<li><&/Elements/SelectWatcherType, Scope=>'queue', Name =>
+"Queue-AddWatcher-Principal-".$u->PrincipalId &> <%$u->Name%>
+(<%$u->RealName%>)
+% }
+</ul>
+% }
+
+<p>
+<b><&|/l&>Groups</&></b>
+
+% if ($group_msg) {
+<br>
+<i><%$group_msg%></i>
+% } elsif ($Groups) {
+<ul>
+% while (my $g = $Groups->Next ) {
+<li><&/Elements/SelectWatcherType, Scope=>'queue', Name =>
+"Queue-AddWatcher-Principal-".$g->PrincipalId &> <%$g->Name%>
+(<%$g->Description%>)
+% }
+</ul>
+% }
+
+</TD>
+</TR>
+</TABLE>
+
+
+
+
+<& /Elements/Submit, Label => loc('Save Changes'), Caption => loc("If you've updated anything above, be sure to"), Reset => 1 &>
+</form>
+
+<%INIT>
+
+my $current_tab;
+my ($field, @results, $User, $Users, $Groups, $watcher, $user_msg, $group_msg);
+
+# {{{ Load the queue
+#If we get handed two ids, mason will make them an array. bleck.
+# We want teh first one. Just because there's no other sensible way
+# to deal
+
+
+
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($id) || Abort(loc("Couldn't load queue", $id));
+# }}}
+
+# {{{ Delete deletable watchers
+
+foreach my $key (keys %ARGS) {
+        my $id = $QueueObj->Id;
+
+    if (($key =~ /^Queue-$id-DelWatcher-Type-(.*?)-Principal-(\d*)$/)) {;
+           my ($code, $msg) = $QueueObj->DeleteWatcher(Type => $1,
+                                                    PrincipalId => $2);
+           push @results, $msg;
+    }
+}
+# }}}
+
+# {{{ Add new watchers
+foreach my  $key (keys %ARGS) {
+    #They're in this order because otherwise $1 gets clobbered :/
+    if ( ($ARGS{$key} =~ /^(AdminCc|Cc)$/) and
+        ($key =~ /^Queue-AddWatcher-Principal-(\d*)$/) ) {
+       $RT::Logger->debug("Adding a watcher $1 to ".$ARGS{$key}."\n");
+       my ($code, $msg) = $QueueObj->AddWatcher(Type => $ARGS{$key},
+                                                            PrincipalId => $1);
+       push @results, $msg;
+    }
+}
+
+# }}}
+
+
+if (!length $ARGS{'UserString'}) {
+$user_msg = loc("No principals selected.");
+ }
+else {
+    $Users = new RT::Users($session{'CurrentUser'});
+    $Users->Limit(FIELD => $ARGS{'UserField'},
+                 VALUE => $ARGS{'UserString'},
+                 OPERATOR => $ARGS{'UserOp'});
+     }
+
+if (!length $ARGS{'GroupString'}) {
+$group_msg = loc("No principals selected.");
+ }
+else {
+$Groups = new RT::Groups($session{'CurrentUser'});
+$Groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'UserDefined');
+$Groups->Limit(FIELD => $ARGS{'GroupField'},
+               VALUE => $ARGS{'GroupString'},
+               OPERATOR => $ARGS{'GroupOp'});
+     }
+
+$current_tab = 'Admin/Queues/People.html?id='.$QueueObj->id;
+</%INIT>
+
+<%ARGS>
+$UserField => 'Name'
+$UserOp => '='
+$UserString => undef
+$GroupField => 'Name'
+$GroupOp => '='
+$GroupString => undef
+$Type => undef
+$id => undef
+</%ARGS>
+
diff --git a/rt/html/Admin/Queues/Scrip.html b/rt/html/Admin/Queues/Scrip.html
new file mode 100644 (file)
index 0000000..edbfcd6
--- /dev/null
@@ -0,0 +1,67 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/QueueTabs, id => $QueueObj->Id, 
+    QueueObj => $QueueObj,                                                      
+    current_tab => 'Admin/Queues/Scrips.html?id='.$QueueObj->id, 
+    current_subtab => $current_subtab, 
+    subtabs => $subtabs, 
+    Title => $title &>
+
+<& /Admin/Elements/EditScrip, title => $title,  %ARGS &>
+<%init>
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($Queue);
+
+my ($title, $current_subtab);
+my $subtabs = {                                                                               
+     A => { title => loc('Select scrip'),                                                     
+            path => "Admin/Queues/Scrips.html?id=".$QueueObj->id,
+               },                                                                             
+     B => { title => loc('New scrip'),                                                        
+            path => "Admin/Queues/Scrip.html?create=1&Queue=".$QueueObj->id,
+            separator => 1,                                                                   
+               }, 
+          };   
+
+unless($QueueObj->id) {
+    Abort(loc("Queue [_1] not found",$id));
+}
+if ($id) {
+    $current_subtab = "Admin/Queues/Scrip.html?id=".$id."&Queue=".$QueueObj->id;
+    $title = loc("Modify a scrip for queue [_1]", $QueueObj->Name);
+    $subtabs->{"C"} = { title => loc("Scrip #[_1]",$QueueObj->id),
+                       path => "Admin/Queues/Scrip.html?id=$id&Queue=".$QueueObj->id };
+} else {
+    $current_subtab = "Admin/Queues/Scrip.html?create=1&Queue=".$QueueObj->id;
+    $title = loc("Create a scrip for queue [_1]", $QueueObj->Name);
+}
+                                                                                             
+
+</%init>
+
+<%ARGS>
+$id => undef  
+$Queue => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/Scrips.html b/rt/html/Admin/Queues/Scrips.html
new file mode 100644 (file)
index 0000000..60b2831
--- /dev/null
@@ -0,0 +1,63 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/QueueTabs, id => $QueueObj->id, 
+    QueueObj => $QueueObj,                                                      
+    current_tab => 'Admin/Queues/Scrips.html?id='.$id, 
+    current_subtab => 'Admin/Queues/Scrips.html?id='.$id, 
+    subtabs => $subtabs, 
+    Title => $title &>
+
+% if (!$QueueObj->Disabled) { # Global scrips does not apply to disabled queues
+<h2><&|/l&>Scrips which apply to all queues</&></h2>
+<& /Admin/Elements/ListGlobalScrips &>
+<BR> 
+% }
+<& /Admin/Elements/EditScrips, title => $title, %ARGS &>
+<%init>
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($id);
+
+my $title;
+
+if ($QueueObj->id) {
+    $title = loc("Modify scrips for queue [_1]", $QueueObj->Name);
+} else {
+    Abort(loc("Queue [_1] not found",$id));
+}
+
+my $subtabs = {
+        A => { title => loc('Select scrip'),
+               path => "Admin/Queues/Scrips.html?id=".$id,
+                          },
+        B => { title => loc('New scrip'),
+               path => "Admin/Queues/Scrip.html?create=1&Queue=".$id,
+            separator => 1,
+                          }
+             };
+</%init>
+
+<%ARGS>
+$id => undef         #some identifier that a Queue could 
+</%ARGS>
diff --git a/rt/html/Admin/Queues/Template.html b/rt/html/Admin/Queues/Template.html
new file mode 100644 (file)
index 0000000..994de61
--- /dev/null
@@ -0,0 +1,101 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/QueueTabs, id => $Queue, 
+    QueueObj => $TemplateObj->QueueObj,
+     current_tab => 'Admin/Queues/Templates.html?id='.$Queue,
+     current_subtab => $current_subtab, 
+     subtabs => $subtabs, 
+     Title => $title &>
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="Template.html">
+%if ($Create ) {
+<INPUT TYPE=HIDDEN NAME="Template" VALUE="new">
+% } else {
+<INPUT TYPE=HIDDEN NAME="Template" VALUE="<%$TemplateObj->Id%>">
+% }
+
+%# hang onto the queue id
+<INPUT TYPE=HIDDEN name="Queue" value="<%$Queue%>">
+<& /Admin/Elements/ModifyTemplate, Name => $TemplateObj->Name, Description =>
+$TemplateObj->Description, Content => $TemplateObj->Content &> 
+<& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+</FORM>
+
+
+<%INIT>
+
+my $TemplateObj = new RT::Template($session{'CurrentUser'});
+my  ($title, @results, $current_subtab);
+
+my $subtabs = {
+                A => { title => loc('Select template'),
+                       path => "Admin/Queues/Templates.html?id=$Queue"
+                          },
+                B => { title => loc('New template'),
+                       path => "Admin/Queues/Template.html?Create=1&Queue=$Queue",
+                       separator => 1,
+                          }
+             };
+
+if ($Create) {
+  $title = loc("Create a template");
+  $current_subtab = "Admin/Queues/Template.html?create=1&Queue=".$Queue;
+}
+
+else {
+  if ($Template eq 'new') {
+      my ($val, $msg) =  $TemplateObj->Create(Queue => $Queue, Name => $Name);
+      Abort(loc("Could not create template: [_1]", $msg)) unless ($val);
+     push @results, $msg;
+    }
+    else {
+       $TemplateObj->Load($Template) || Abort(loc('No Template'));
+    }
+     $title = loc('Modify template [_1]', loc($TemplateObj->Name())); 
+  
+    
+}
+if ($TemplateObj->Id()) {
+  $Queue = $TemplateObj->Queue;
+
+  my @attribs = qw( Description Content Queue Name);
+  my @aresults = UpdateRecordObject( AttributesRef => \@attribs, 
+                                    Object => $TemplateObj, 
+                                    ARGSRef => \%ARGS);
+  $current_subtab = "Admin/Queues/Template.html?Queue=$Queue&Template=".$TemplateObj->Id();
+  $subtabs->{"C"} = { title => loc('Template #[_1]', $TemplateObj->Id()),
+                       path => "Admin/Queues/Template.html?Queue=$Queue&Template=".$TemplateObj->Id(),
+                       };
+  push @results, @aresults;
+}
+
+</%INIT>
+<%ARGS>
+$Queue => undef
+$Template => undef
+$Create => undef
+$Name => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/Templates.html b/rt/html/Admin/Queues/Templates.html
new file mode 100644 (file)
index 0000000..98bdf24
--- /dev/null
@@ -0,0 +1,57 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title &>
+<& /Admin/Elements/QueueTabs, id => $QueueObj->id, 
+    current_tab => 'Admin/Queues/Templates.html?id='.$id, 
+    current_subtab => 'Admin/Queues/Templates.html?id='.$id, 
+        QueueObj => $QueueObj,
+    subtabs => $subtabs, 
+    Title => $title &>
+
+<& /Admin/Elements/EditTemplates, title => $title, %ARGS &>
+
+<%INIT>
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($id);
+
+my ($title, $current_subtab);
+
+if ($QueueObj->id) {
+    $title = loc("Edit Templates for queue [_1]", $QueueObj->Name);
+} else {
+    Abort(loc("Queue [_1] not found",$id));
+}
+my $subtabs = {
+        A => { title => loc('Select template'),
+               path => "Admin/Queues/Templates.html?id=".$id,
+                  },
+        B => { title => loc('New template'),
+               path => "Admin/Queues/Template.html?Create=1&Queue=".$id,
+                  }
+             };
+
+</%INIT>
+<%ARGS>
+$id => undef         #some identifier that a Queue could 
+</%ARGS>
diff --git a/rt/html/Admin/Queues/UserRights.html b/rt/html/Admin/Queues/UserRights.html
new file mode 100644 (file)
index 0000000..aeb55c7
--- /dev/null
@@ -0,0 +1,90 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Modify user rights for queue [_1]', $QueueObj->Name) &>
+<& /Admin/Elements/QueueTabs, id => $id,
+    QueueObj => $QueueObj,                                                      
+    current_tab => $current_tab, 
+    Title => loc('Modify user rights for queue [_1]', $QueueObj->Name) &>
+<& /Elements/ListActions, actions => \@results &>
+
+  <FORM METHOD=POST ACTION="UserRights.html">
+    <INPUT TYPE=HIDDEN NAME=id VALUE="<% $QueueObj->id %>">
+      
+      
+<TABLE>
+<& /Elements/Callback, QueueObj => $QueueObj, results => \@results, %ARGS &>
+%      while (my $Member = $Users->Next()) {
+% my $UserObj = $Member->MemberObj->Object();
+% my $group = RT::Group->new($session{'CurrentUser'});
+% $group->LoadACLEquivalenceGroup($Member->MemberObj);
+  <TR ALIGN=RIGHT> 
+       <TD VALIGN=TOP>
+           <% $UserObj->Name %>
+                 </TD>
+         <TD>
+           <& /Admin/Elements/SelectRights, PrincipalId=> $group->PrincipalId,
+        Object => $QueueObj  &>
+         </TD>
+       </TR>
+% }
+      </TABLE>
+            
+      <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+      
+  </FORM>
+  
+<%INIT>
+  #Update the acls.
+  my @results =  ProcessACLChanges(\%ARGS);
+
+# {{{ Deal with setting up the display of current rights.
+
+
+
+if (!defined $id) {
+    Abort(loc("No Queue defined"));
+}
+
+my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+$QueueObj->Load($id) || Abort(loc("Couldn't load queue [_1]",$id));
+
+# Find out which users we want to display ACL selects for
+my $Privileged = RT::Group->new($session{'CurrentUser'});
+$Privileged->LoadSystemInternalGroup('Privileged');
+my $Users = $Privileged->MembersObj();
+
+    
+  
+# }}}
+my $current_tab;
+$current_tab = 'Admin/Queues/UserRights.html?id='.$QueueObj->id;
+</%INIT>
+
+<%ARGS>
+$id => undef
+$UserString => undef
+$UserOp => undef
+$UserField => undef
+</%ARGS>
diff --git a/rt/html/Admin/Queues/index.html b/rt/html/Admin/Queues/index.html
new file mode 100644 (file)
index 0000000..f733c25
--- /dev/null
@@ -0,0 +1,61 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc("Admin queues") &>
+<& /Admin/Elements/QueueTabs, current_tab => 'Admin/Queues/', 
+    current_subtab => 'Admin/Queues/', 
+    Title => loc("Admin queues") &>
+
+
+
+<%$caption%>:<BR>
+<UL>
+%if ($queues->Count == 0) {
+<LI> <i><&|/l&>No queues matching search criteria found.</&></i>
+% }
+%while ( $queue = $queues->Next) {
+<LI><A HREF="Modify.html?id=<%$queue->id%>"><%$queue->Name%></a></LI>
+%}
+</UL>
+<BR>
+<FORM METHOD=POST ACTION="<% $RT::WebPath %>/Admin/Queues/">
+<input type="checkbox" name="FindDisabledQueues"> <&|/l&>Include disabled queues in listing.</&>
+<div align=right><input type=submit value="<&|/l&>Go!</&>"></div> 
+</FORM>
+
+<%INIT>
+my ($queue, $caption);
+my $queues = new RT::Queues($session{'CurrentUser'});
+$queues->UnLimit();
+
+if ($FindDisabledQueues) {
+        $caption = loc("All Queues");
+        $queues->{'find_disabled_rows'} = 1;
+} else {
+    $caption = loc("Enabled Queues");
+}
+
+</%INIT>
+<%ARGS>
+$FindDisabledQueues => 0
+</%ARGS>
diff --git a/rt/html/Admin/Users/Modify.html b/rt/html/Admin/Users/Modify.html
new file mode 100644 (file)
index 0000000..370c2e8
--- /dev/null
@@ -0,0 +1,347 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => $title  &>
+<& /Admin/Elements/UserTabs, 
+    id => $id, 
+    UserObj => $UserObj,
+    current_subtab => $current_tab, 
+    Title => $title &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM ACTION="<%$RT::WebPath%>/Admin/Users/Modify.html" METHOD=POST>
+%if ($Create) {
+<INPUT TYPE=HIDDEN NAME=id VALUE="new">
+% } else {
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>">
+% }
+<TABLE WIDTH=100% BORDER=0>
+<TR>
+
+<TD VALIGN=TOP ROWSPAN=2>
+<& /Elements/TitleBoxStart, title => loc('Identity') &>
+
+<TABLE>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Username</&>:
+</TD><TD>
+<input name="Name" value="<%$UserObj->Name%>"> <b><&|/l&>(required)</&></b>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Email</&>:
+</TD><TD>
+<input name="EmailAddress" value="<%$UserObj->EmailAddress%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Real Name</&>: 
+</TD><TD>
+<input name="RealName" value="<%$UserObj->RealName%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Nickname</&>: 
+</TD><TD>
+<input name="NickName" value="<%$UserObj->NickName%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Unix login</&>: 
+</TD><TD>
+<input name="Gecos" value="<%$UserObj->Gecos%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Extra info</&>: 
+</TD><TD>
+<textarea name="FreeformContactInfo" cols=20 rows=5><%$UserObj->FreeformContactInfo%></TEXTAREA>
+</TD></TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<br>
+<& /Elements/TitleBoxStart, title => loc('Access control') &>
+<INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1">
+<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>>
+<&|/l&>Let this user access RT</&><BR>
+
+
+<INPUT TYPE=HIDDEN NAME="SetPrivileged" VALUE="1">
+<INPUT TYPE=CHECKBOX NAME="Privileged" VALUE="1" <%$PrivilegedChecked%>> <&|/l&>Let this user be granted rights</&><BR>
+                   
+% unless ($RT::WebExternalAuth and !$RT::WebFallbackToInternalAuth) {
+<TABLE>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>New Password</&>:
+</TD>
+<TD ALIGN=LEFT>
+<input type=password name="Pass1">
+</TD>
+</TR>
+<TR><TD ALIGN=RIGHT>
+<&|/l&>Retype Password</&>:
+</TD>
+<TD>
+<input type=password name="Pass2">
+</TD>
+</TR>
+</TABLE>
+% }
+<& /Elements/TitleBoxEnd &>
+</TD>
+</TR>
+<TR>
+
+<TD VALIGN=TOP>
+<& /Elements/TitleBoxStart, title => loc('Location') &>
+<TABLE>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Organization</&>: 
+</TD><TD>
+<input name="Organization" value="<%$UserObj->Organization%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Address1</&>: 
+</TD><TD>
+<input name="Address1" value="<%$UserObj->Address1%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Address2</&>: 
+</TD><TD>
+<input name="Address2" value="<%$UserObj->Address2%>">
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>City</&>: 
+</TD><TD>
+<input name="City" value="<%$UserObj->City%>" size=14>
+
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>State</&>: 
+</TD><TD>
+<input name="State" value="<%$UserObj->State%>" size=3>
+
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Zip</&>: 
+</TD><TD>
+<input name="Zip" value="<%$UserObj->Zip%>" size=9>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Country</&>: 
+</TD><TD>
+<input name="Country" value="<%$UserObj->Country%>">
+</TD></TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<br>
+<& /Elements/TitleBoxStart, title => loc('Phone numbers') &>
+<TABLE>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Residence</&>: 
+</TD><TD>
+<input name="HomePhone" value="<%$UserObj->HomePhone%>" size=13><br>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Work</&>: 
+</TD><TD>
+<input name="WorkPhone" value="<%$UserObj->WorkPhone%>" size=13><br>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Mobile</&>: 
+</TD><TD>
+<input name="MobilePhone" value="<%$UserObj->MobilePhone%>" size=13><br>
+</TD></TR>
+<TR><TD ALIGN="RIGHT">
+<&|/l&>Pager</&>: 
+</TD><TD>
+<input name="PagerPhone" value="<%$UserObj->PagerPhone%>" size=13><br>
+<& /Elements/TitleBoxEnd &>
+</TD>
+
+<TR>
+</TR>
+</TABLE>
+<TR>
+<TD colspan="2">
+<& /Elements/TitleBoxStart, title => loc('Comments about this user') &>
+<TEXTAREA name="Comments" COLS=80 ROWS=5 WRAP=VIRTUAL><%$UserObj->Comments%>
+</TEXTAREA>
+<& /Elements/TitleBoxEnd &>
+%if ($UserObj->Privileged) {
+<BR>
+<& /Elements/TitleBoxStart, title => loc('Signature') &>
+<TEXTAREA COLS=80 ROWS=5 name="Signature" WRAP=HARD>
+<%$UserObj->Signature%></TEXTAREA>
+<& /Elements/TitleBoxEnd &>
+% }
+
+</TD>
+</TR>
+</TABLE>
+
+<& /Elements/Submit &>
+</form>
+
+<%INIT>
+
+my $current_tab;
+my $UserObj = new RT::User($session{'CurrentUser'});
+my ($title, $PrivilegedChecked, $EnabledChecked, $Disabled, $result, @results);
+
+my ($val, $msg);
+
+if ($Create) {
+    $current_tab = 'Admin/Users/Modify.html?Create=1';
+    $title = loc("Create a new user");
+} 
+else {
+
+    $current_tab = 'Admin/Users/Modify.html?id='.$id;
+    if ($id eq 'new') {
+       ($val, $msg) = $UserObj->Create( Name => $Name,
+                                        EmailAddress => $ARGS{'EmailAddress'}
+                                      );
+       if ($val) {
+               push @results, $msg;
+       } else {
+               push @results, loc('User could not be created: [_1]', $msg);
+       }       
+       
+    }
+    else {
+       $UserObj->Load($id) || $UserObj->Load($Name) || Abort("Couldn't load user '$Name'");
+       $val = $UserObj->Id();
+    }
+
+    if ($val) {
+       $title = loc("Modify the user [_1]", $UserObj->Name);
+    }  
+
+    # If the create failed
+    else {
+       $title = loc("Create a new user");
+       $Create = 1;
+    }    
+
+    
+
+}
+
+
+
+
+# If we have a user to modify, lets try. 
+if ($UserObj->Id) {
+    
+    my @fields = qw(Name Comments Signature EmailAddress FreeformContactInfo 
+                   Organization RealName NickName Lang EmailEncoding WebEncoding 
+                   ExternalContactInfoId ContactInfoSystem Gecos ExternalAuthId 
+                   AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1
+               Address2 City State Zip Country 
+                  );
+    
+    my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields,
+                                           Object => $UserObj,
+                                           ARGSRef => \%ARGS );
+    push (@results,@fieldresults);
+
+
+# {{{ Deal with special fields: Privileged, Enabled and Password
+if  ( ($SetPrivileged) and ( $Privileged != $UserObj->Privileged) ) {
+my  ($code, $msg) = $UserObj->SetPrivileged($Privileged);
+     push @results, loc('Privileged status: [_1]', loc_fuzzy($msg));
+}
+
+#we're asking about enabled on the web page but really care about disabled.
+if ($Enabled == 1) {
+    $Disabled = 0;
+}      
+else {
+    $Disabled = 1;
+}
+if  ( ($SetEnabled) and ( $Disabled != $UserObj->Disabled) ) { 
+    my  ($code, $msg) = $UserObj->SetDisabled($Disabled);
+    push @results, loc('Enabled status [_1]', loc_fuzzy($msg));
+}
+
+
+#TODO: make this report errors properly
+if ((defined $Pass1) and ($Pass1 ne '') and ($Pass1 eq $Pass2) and (!$UserObj->IsPassword($Pass1))) {
+    my ($code, $msg);
+    ($code, $msg) = $UserObj->SetPassword($Pass1);
+    push @results, loc('Password: [_1]', loc_fuzzy($msg));
+} elsif ( $Pass1 && ($Pass1 ne $Pass2)) {
+    push @results, loc("Passwords do not match.");
+}
+
+# }}}
+}
+
+
+# {{{ Do some setup for the ui
+unless ($UserObj->Disabled()) {
+    $EnabledChecked ="CHECKED";
+}
+
+if ($UserObj->Privileged()) {  
+    $PrivilegedChecked = "CHECKED";
+}
+
+# }}}
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+$Name  => undef
+$Comments  => undef
+$Signature  => undef
+$EmailAddress  => undef
+$FreeformContactInfo => undef
+$Organization  => undef
+$RealName  => undef
+$NickName  => undef
+$Privileged => undef
+$SetPrivileged => undef
+$Enabled => undef
+$SetEnabled => undef
+$Lang  => undef
+$EmailEncoding  => undef
+$WebEncoding => undef
+$ExternalContactInfoId  => undef
+$ContactInfoSystem  => undef
+$Gecos => undef
+$ExternalAuthId  => undef
+$AuthSystem  => undef
+$HomePhone => undef
+$WorkPhone  => undef
+$MobilePhone  => undef
+$PagerPhone  => undef
+$Address1 => undef
+$Address2  => undef
+$City  => undef
+$State  => undef
+$Zip  => undef
+$Country => undef
+$Pass1 => undef
+$Pass2=> undef
+$Create=> undef
+</%ARGS>
diff --git a/rt/html/Admin/Users/Prefs.html b/rt/html/Admin/Users/Prefs.html
new file mode 100644 (file)
index 0000000..0bba9fa
--- /dev/null
@@ -0,0 +1,122 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("User view") &>
+
+<& /Elements/ViewUser, User=>$u &>
+
+<h2 class="title"><%loc("User view")%></h2>
+
+%if ($session{CurrentUser} && ($session{CurrentUser}->Id == $id)) {
+       <& /Elements/TitleBoxStart, title => loc('Signature')  &>
+<form method=post>
+<input type="hidden" name="id" value=<%$id%>>
+<TEXTAREA COLS=72 ROWS=4 WRAP=HARD NAME="Signature"><% $u->Signature %></TEXTAREA><br><br>
+<input type="submit" value="<&|/l&>Update signature</&>">
+</form>
+         <& /Elements/TitleBoxEnd &>
+         <form method=post>
+         <&|/l&>Open tickets (from listing) in another window</&>: <input type="checkbox" name="NewWindowOption" <%exists $session{NewWindowOption} && "CHECKED"%>><br>
+         <&|/l&>Open tickets (from listing) in a new window</&>: <input type="checkbox" name="AlwaysNewWindowOption" <%exists $session{AlwaysNewWindowOption} && "CHECKED"%>><br>
+         <input type="submit" name="NewWindowSetting" value="<&|/l&>New window setting</&>">
+         </form>
+%}
+
+       <& /Elements/TitleBoxStart, title => loc('Email')  &>
+<form method=post>
+<input type="hidden" name="id" value="<%$id%>">
+<input name="Email" value="<% $u->EmailAddress %>"><input type="submit" value="<&|/l&>Update email</&>">
+</form>
+         <& /Elements/TitleBoxEnd &>
+       <& /Elements/TitleBoxStart, title => loc('Real Name')  &>
+<form method=post>
+<input type="hidden" name="id" value="<%$id%>">
+<input name="RealName" value="<% $u->RealName %>"><input type="submit" value="<&|/l&>Update name</&>">
+</form>
+         <& /Elements/TitleBoxEnd &>
+
+       <& /Elements/TitleBoxStart, title => loc('User ID')  &>
+<form method=post>
+<input type="hidden" name="id" value="<%$id%>">
+<input name="Name" value="<% $u->Name %>"><input type="submit" value="<&|/l&>Update ID</&>">
+</form>
+         <& /Elements/TitleBoxEnd &>
+
+%# TODO: alternative email addresses + merging users
+
+<%ARGS>
+$id => $session{CurrentUser} ? $session{CurrentUser}->Id : 0
+$Signature => undef
+$Email => undef
+$RealName => undef
+$Name => undef
+</%ARGS>
+
+<%INIT>
+require RT::User;
+my $u=RT::User->new($session{CurrentUser});
+$u->Load($id) || die loc("Couldn't load that user ([_1])", $id);
+if ($Signature) {
+my ($val, $msg)=$u->SetSignature($Signature);
+$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg);
+}
+
+if ($Email) {
+my ($val, $msg)=$u->SetEmailAddress($Email);
+$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg);
+}
+
+if ($RealName) {
+my ($val, $msg)=$u->SetRealName($RealName);
+$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg);
+}
+
+if ($Name) {
+my ($val, $msg)=$u->SetName($Name);
+$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg);
+}
+
+if ($ARGS{NewWindowSetting}) {
+if ($ARGS{NewWindowOption}) {
+$session{NewWindowOption}=1;
+} else {
+delete $session{NewWindowOption};
+}
+if ($ARGS{AlwaysNewWindowOption}) {
+$session{NewWindowOption}=1;
+$session{AlwaysNewWindowOption}=1;
+} else {
+delete $session{AlwaysNewWindowOption};
+}
+}
+
+</%INIT>
+
+
+
+
+
+
+
+
+
diff --git a/rt/html/Admin/Users/index.html b/rt/html/Admin/Users/index.html
new file mode 100644 (file)
index 0000000..a95d411
--- /dev/null
@@ -0,0 +1,81 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('Select a user') &>
+<& /Admin/Elements/UserTabs, current_tab => 'Admin/Users/', 
+    current_subtab => 'Admin/Users/',
+    Title => loc('Select a user') &>
+
+
+
+
+<%$caption%>:<BR>
+<UL>
+%if ($users->Count == 0) {
+<LI> <i><&|/l&>No users matching search criteria found.</&></i>
+% }
+%while ( $user = $users->Next) {
+<LI><A HREF="Modify.html?id=<%$user->id%>"><%$user->Name || loc('(no name listed)')%></a></LI>
+%}
+
+</UL>
+<br><br>
+<FORM METHOD=POST ACTION="<% $RT::WebPath %>/Admin/Users/">
+
+<&|/l&>Find people whose</&> <& /Elements/SelectUsers &><BR>
+<input type="checkbox" name="FindDisabledUsers"> <&|/l&>Include disabled users in search.</&>
+<BR>
+<div align=right><input type=submit value="<&|/l&>Go!</&>"></div> 
+</FORM>
+
+<%INIT>
+my ($user, $caption);
+my $users = new RT::Users($session{'CurrentUser'});
+
+if ($FindDisabledUsers) {
+       $users->{'find_disabled_rows'} = 1;
+}
+
+unless (defined $UserString) {
+    $users->LimitToPrivileged();
+    $caption = loc("Privileged users");
+}
+else {
+    $caption = loc("Users matching search criteria");
+
+  if ($UserString) {
+       $users->Limit( FIELD => $UserField,
+                       OPERATOR => $UserOp,
+                      VALUE => $UserString); 
+
+}
+}
+</%INIT>
+<%ARGS>
+$UserString => undef
+$UserOp => '='
+$UserField => 'Name'
+$IdLike => undef
+$EmailLike => undef
+$FindDisabledUsers => 0
+</%ARGS>
diff --git a/rt/html/Admin/index.html b/rt/html/Admin/index.html
new file mode 100644 (file)
index 0000000..522ade8
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Admin/Elements/Header, Title => loc('RT Administration') &>
+<& /Admin/Elements/Tabs, Title => loc('RT Administration') &>
+
+<ul>
+<li><font size="+2"><a href="Users/"><&|/l&>Users</&></a></font><br>
+<&|/l&>Manage users and passwords</&>
+</li>
+<li><font size="+2"><a href="Groups/"><&|/l&>Groups</&></a></font><br>
+<&|/l&>Manage groups and group membership</&>
+</li>
+<li><font size="+2"><a href="Queues/"><&|/l&>Queues</&></a></font><br>
+<&|/l&>Manage queues and queue-specific properties</&>
+</li>
+<li><font size="+2"><a href="Global/"><&|/l&>Global</&></a></font><br>
+<&|/l&>Manage properties and configuration which apply to all queues</&>
+</li>
+</ul>
diff --git a/rt/html/Approvals/Display.html b/rt/html/Approvals/Display.html
new file mode 100644 (file)
index 0000000..921c1e3
--- /dev/null
@@ -0,0 +1,50 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title =>  $title &>
+
+<& Elements/Tabs, 
+    current_tab => "Approvals/Display.html", 
+    Title =>  $title &>
+<form method=post action="<%$RT::WebPath%>/Approvals/">
+
+<& /Elements/TitleBoxStart, title => $title &>
+<& /Ticket/Elements/ShowHistory , Ticket => $Ticket, Collapsed => 0, ShowTitle => 0, ShowHeaders => 0, ShowDisplayModes => 0, ShowTitleBarCommands => 0 &>
+<hr>
+<table width=100%>
+<& Elements/Approve, ticket => $Ticket, ShowApproving => 0 &>
+</table>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit&>
+</form>
+<& Elements/ShowDependency, Ticket => $Ticket &>
+
+<%init>
+my $Ticket = LoadTicket($id);
+
+my $title = loc("Approval #[_1]: [_2]", $Ticket->Id, $Ticket->Subject);
+
+</%init>
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Approvals/Elements/Approve b/rt/html/Approvals/Elements/Approve
new file mode 100644 (file)
index 0000000..6a7cfa3
--- /dev/null
@@ -0,0 +1,56 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<tr bgcolor="#b9b9ff">
+<td colspan=2><font size="3">
+<a href="<%$RT::WebPath%>/Approvals/Display.html?id=<%$ticket->Id%>"><% loc("#[_1]: [_2]", $ticket->Id, $ticket->Subject) %></a> (<%loc($ticket->Status)%>)</font></td>
+</tr>
+% if ($ShowApproving) {
+%     foreach my $approving ( $ticket->AllDependedOnBy( Type => 'ticket' ) ) {
+<tr bgcolor="#e9e9e9">
+<td colspan=2>
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<% $approving->Id %>"><&|/l, $approving->Id, $approving->Subject &>Originating ticket: #[_1]</&></a>
+</td>
+</tr>
+<tr><td colspan=2>
+<& /Ticket/Elements/ShowCustomFields, Ticket => $approving &>
+<& /Ticket/Elements/ShowHistory, Ticket => $approving, Collapsed => 0, ShowTitle => 0, ShowHeaders => 0, ShowDisplayModes => 0, ShowTitleBarCommands => 0 &>
+</td></tr>
+%     }
+% }
+<tr <%$class && "class=\"$class\""%>>
+<td valign=top>
+<input type="radio" name="Approval-<%$ticket->Id%>-Action" value="approve"><&|/l&>Approve</&><br>
+<input type="radio" name="Approval-<%$ticket->Id%>-Action" value="deny"><&|/l&>Deny</&><br>
+<input type="radio" name="Approval-<%$ticket->Id%>-Action" value="none" checked><&|/l&>No action</&>
+</td>
+<td>
+<&|/l&>Notes</&><br>
+<textarea name="Approval-<%$ticket->Id%>-Notes" rows=2 cols=70></textarea>
+</td>
+</tr>
+<%ARGS>
+$ShowApproving => 1
+$ticket => undef
+$class => undef
+</%ARGS>
diff --git a/rt/html/Approvals/Elements/PendingMyApproval b/rt/html/Approvals/Elements/PendingMyApproval
new file mode 100644 (file)
index 0000000..b5cf007
--- /dev/null
@@ -0,0 +1,87 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table width="100%">
+% my ($i, $class);
+% my %done;
+% foreach ($tickets, $group_tickets) {
+%   while (my $ticket = $_->Next() ) {
+%     next if !$ARGS{'ShowDependent'} and $ticket->HasUnresolvedDependencies( Type => 'approval' );
+%     next if $done{$ticket->Id}++; # don't show duplicate tickets
+%     $i++; 
+%     $class = ($i%2) ?  "oddline" : "evenline";
+<& Approve, ticket => $ticket, class => $class &>
+%   }
+% }
+</table>
+
+<& /Elements/TitleBoxStart, title => loc("Search for approvals") &>
+<input type=checkbox value="1" name="ShowPending"
+        <%((!$ARGS{'ShowRejected'} && !$ARGS{'ShowResolved'}) ||
+         $ARGS{'ShowPending'})
+        && "checked"%>> <&|/l&>Show pending requests</&><br>
+<input type=checkbox value="1" name="ShowResolved" <%$ARGS{'ShowResolved'} && "checked"%>> <&|/l&>Show approved requests</&><br>
+<input type=checkbox value="1" name="ShowRejected" <%$ARGS{'ShowRejected'} && "checked"%>> <&|/l&>Show denied requests</&><br>
+<input type=checkbox value="1" name="ShowDependent" <%$ARGS{'ShowDependent'} && "checked"%>> <&|/l&>Show requests awaiting other approvals</&><br>
+
+<&|/l,"<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>"&>Only show approvals for requests created before [_1]</&><br>
+
+<&|/l, "<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>"&>Only show approvals for requests created after [_1]</&>
+<& /Elements/TitleBoxEnd &>
+
+<%init>
+my $tickets = RT::Tickets->new( $session{'CurrentUser'} );
+$tickets->LimitOwner( VALUE => $session{'CurrentUser'}->Id );
+
+# also consider AdminCcs as potential approvers.
+my $group_tickets = RT::Tickets->new( $session{'CurrentUser'} );
+
+my $created_before = RT::Date->new( $session{'CurrentUser'} );
+my $created_after = RT::Date->new( $session{'CurrentUser'} );
+
+foreach ($tickets, $group_tickets) {
+    $_->Limit( FIELD      => 'Type', VALUE => 'approval' );
+
+    if ( $ARGS{'ShowResolved'} ) {
+       $_->LimitStatus( VALUE => 'resolved' );
+    }
+    if ( $ARGS{'ShowRejected'} ) {
+       $_->LimitStatus( VALUE => 'rejected' );
+    }
+    if ( $ARGS{'ShowPending'} || ( !$ARGS{'ShowRejected'} && !$ARGS{'Resolved'} ) ) {
+       $_->LimitStatus( VALUE => 'open' );
+       $_->LimitStatus( VALUE => 'new' );
+       $_->LimitStatus( VALUE => 'stalled' );
+    }
+
+    if ( $ARGS{'CreatedBefore'} ) {
+       $created_before->Set( Format => 'unknown', Value => $ARGS{'CreatedBefore'} );
+       $_->LimitCreated( OPERATOR => "<=", VALUE => $created_before->ISO );
+    }
+    if ( $ARGS{'CreatedAfter'} ) {
+       $created_after->Set( Format => 'unknown', Value => $ARGS{'CreatedAfter'} );
+       $_->LimitCreated( OPERATOR => ">=", VALUE => $created_after->ISO );
+    }
+}
+
+</%init>
diff --git a/rt/html/Approvals/Elements/ShowDependency b/rt/html/Approvals/Elements/ShowDependency
new file mode 100644 (file)
index 0000000..417cad1
--- /dev/null
@@ -0,0 +1,85 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% my $approving = $Ticket->DependedOnBy();
+% if ($approving->Count) {
+<h3><&|/l&>Tickets which depend on this approval:</&></h3>
+
+<table width=100%>
+<TR>
+<TD WIDTH="25" bgcolor="#999999">&nbsp;</TD><TD>
+<%PERL>
+my %show;
+while (my $link = $approving->Next()) {
+    next unless ($link->BaseURI->IsLocal());
+    my $text = '<a name="' . $link->BaseObj->Id . '">';
+    my $head = '';
+    my $type = $link->BaseObj->Type;
+    my $dep  = $m->scomp('ShowDependency', Ticket => $link->BaseObj, _seen => $_seen);
+
+    if ($type eq 'approval') {
+       $head .= $m->scomp('/Elements/TitleBoxStart', title => loc("Approval #[_1]: [_2]", $link->BaseObj->Id, $link->BaseObj->Subject));
+       $text .= $head;
+       $text .= $m->scomp('/Ticket/Elements/ShowCustomFields', Ticket => $link->BaseObj);
+    } elsif ($type eq 'ticket') {
+       $head .= $m->scomp('/Elements/TitleBoxStart', title => loc("Ticket #[_1]: [_2]", $link->BaseObj->Id, $link->BaseObj->Subject));
+       $text .= $head;
+       $text .= $m->scomp('/Ticket/Elements/ShowSummary', Ticket => $link->BaseObj);
+    } else {
+       $head .= $m->scomp('/Elements/TitleBoxStart', title => loc("#[_1]: [_2]", $link->BaseObj->Id, $link->BaseObj->Subject));
+       $text .= $head;
+    }
+
+    $text .= $m->scomp('/Ticket/Elements/ShowHistory' , Ticket => $link->BaseObj, Collapsed => ($type ne 'ticket'), ShowTitle => 0, ShowHeaders => 0, ShowDisplayModes => 0, ShowTitleBarCommands => 0);
+
+    $head .= $m->scomp('/Elements/TitleBoxEnd');
+    $text .= $m->scomp('/Elements/TitleBoxEnd');
+    $text .= $dep;
+    $text .= '</a>';
+    $show{$link->BaseObj->Id} = {
+       text => $text,
+       head => $head,
+    };
+}
+
+my $refer;
+foreach my $id (sort keys %show) {
+    if ($_seen->{$id}++) {
+       $refer .= "<a href='#txn-$id'>" . $show{$id}{head} . "</a>";
+       next;
+    }
+
+    $m->print($show{$id}{text});
+}
+$m->print($refer);
+
+</%PERL>
+</TD>
+</TR>
+</TABLE>
+
+% }
+<%ARGS>
+$Ticket
+$_seen => {}
+</%ARGS>
diff --git a/rt/html/Approvals/Elements/Tabs b/rt/html/Approvals/Elements/Tabs
new file mode 100644 (file)
index 0000000..648ff75
--- /dev/null
@@ -0,0 +1,34 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Tabs,
+    tabs => $tabs, 
+    current_toptab => 'Approvals/', 
+    current_tab => $current_tab, 
+    Title => $Title &>
+
+<%ARGS>
+$tabs => undef
+$current_tab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Approvals/index.html b/rt/html/Approvals/index.html
new file mode 100644 (file)
index 0000000..b4156f3
--- /dev/null
@@ -0,0 +1,66 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("My approvals") &>
+<& /Approvals/Elements/Tabs, Title => loc("My approvals") &>
+
+<& /Elements/ListActions, actions => \@actions &>
+<form method="post">
+<& Elements/PendingMyApproval, %ARGS &>
+<& /Elements/Submit &>
+</form>
+<%init>
+
+my (@actions);
+foreach my $arg ( keys %ARGS ) {
+
+    next unless ( $arg =~ /Approval-(\d+)-Action/ );
+
+    my ( $notesval, $notesmsg );
+
+    my $ticket = LoadTicket($1);
+
+    if ( $ARGS{ "Approval-" . $ticket->Id . "-Notes" } ) {
+        my $notes = MIME::Entity->build(
+           Data => [ $ARGS{ "Approval-" . $ticket->Id . "-Notes" } ]
+       );
+       RT::I18N::SetMIMEEntityToUTF8($notes); # convert text parts into utf-8
+
+        my ( $notesval, $notesmsg ) = $ticket->Correspond( MIMEObj => $notes );
+        if ($notesval) {
+                push ( @actions, loc("Approval #[_1]: Notes recorded",$ticket->Id ));
+        } else {
+                push ( @actions, loc("Approval #[_1]: Notes not recorded due to a system error",$ticket->Id ));
+        }
+    }
+
+    my ($val, $msg);
+    if ( $ARGS{$arg} eq 'deny' ) {
+         ( $val, $msg ) = $ticket->SetStatus('rejected');
+    }
+    elsif ( $ARGS{$arg} eq 'approve' ) {
+         ( $val, $msg ) = $ticket->SetStatus('resolved');
+    }
+    push ( @actions, loc("Approval #[_1]: [_2]",$ticket->id, $msg )) if ($msg);
+}
+</%init>
diff --git a/rt/html/Elements/BevelBoxRaisedEnd b/rt/html/Elements/BevelBoxRaisedEnd
new file mode 100644 (file)
index 0000000..ebf45df
--- /dev/null
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+  </TD>
+</TR>
+</table>
diff --git a/rt/html/Elements/BevelBoxRaisedStart b/rt/html/Elements/BevelBoxRaisedStart
new file mode 100644 (file)
index 0000000..c4e6c55
--- /dev/null
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table cellspacing=0 cellpadding=0 width=100% height=100%>
+      <TR>
+        <TD width=100% height=100%> 
diff --git a/rt/html/Elements/Callback b/rt/html/Elements/Callback
new file mode 100644 (file)
index 0000000..93ac4c0
--- /dev/null
@@ -0,0 +1,65 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%once>
+my (%cache, $check);
+</%once>
+<%init>
+# checks for inode change time for each callback directory
+my $new_check = join(
+    $;, map { $_->[1] => (stat("$_->[1]/Callbacks"))[10] } $m->interp->resolver->comp_root_array
+) or return;
+
+$Page = $m->callers(1)->path unless ($Page);
+
+my $callbacks;
+if ($new_check eq $check) {
+    $callbacks = $cache{$Page,$_CallbackName};
+}
+else {
+    $check = $new_check;
+}
+
+if (!$callbacks) {
+    my $path = "/Callbacks/*$Page/$_CallbackName";
+    $callbacks = [ $m->interp->resolver->glob_path($path) ];
+    @$callbacks = grep !/^\.|~$/, @$callbacks; #skip backup files
+
+    #skip files without a package
+    my $invalid_base = "/Callbacks/$Page/$_CallbackName";
+    @$callbacks = grep !/^$invalid_base$/, @$callbacks;
+
+
+
+    $cache{$Page,$_CallbackName} = $callbacks;
+}
+
+foreach my $comp (@$callbacks) {
+        $m->comp($comp, %ARGS) if $m->comp_exists($comp);
+}
+return(1);
+</%init>
+<%args>
+$_CallbackName => 'Default'
+$Page => undef
+</%args>
diff --git a/rt/html/Elements/Checkbox b/rt/html/Elements/Checkbox
new file mode 100644 (file)
index 0000000..ae3d765
--- /dev/null
@@ -0,0 +1,39 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<INPUT TYPE="Checkbox" NAME ="<%$Name%>" <%$IsChecked%>>
+
+<%ARGS>
+$Name => undef
+$Default => undef
+$True => undef
+$False => undef
+$IsChecked => undef
+</%ARGS>
+
+<%INIT>
+$IsChecked = 
+  ($Default && $Default =~ /checked/i)
+    ? " CHECKED " : "";
+1;
+</%INIT>
diff --git a/rt/html/Elements/CreateTicket b/rt/html/Elements/CreateTicket
new file mode 100644 (file)
index 0000000..7e1025d
--- /dev/null
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<FORM ACTION="<% $RT::WebPath%>/Ticket/Create.html">
+<&|/l, $m->scomp('/Elements/SelectNewTicketQueue')&><input type="submit" value="New ticket in">&nbsp;[_1]</&>
+</FORM>
diff --git a/rt/html/Elements/Error b/rt/html/Elements/Error
new file mode 100644 (file)
index 0000000..dc44f12
--- /dev/null
@@ -0,0 +1,62 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Callback, %ARGS, error => $error &>
+<& /Elements/Header, Code => $Code, Why => $Why &>
+<& /Elements/Tabs &>
+<& /Elements/TitleBoxStart, class=> "error",  title => $Title &>
+<%$Why%>
+<br>
+<font size=-1>
+<%$Details%>
+</font>
+<& /Elements/TitleBoxEnd &>
+</body>
+</HTML>
+
+
+<%args>
+$Code => undef
+$Details => undef
+$Title => loc("RT Error")
+$Why => loc("the calling component did not specify why")
+</%args>
+
+<%INIT>
+my $error = "WebRT: $Why ($Details)";
+
+# TODO: Log::Dispatch isn't UTF-8 safe. Autrijus needs to talk to dave rolsky about getting this fixed
+if ($] >= 5.007001) {
+    require Encode;
+    Encode::_utf8_off($error);
+}
+
+$RT::Logger->error($error);
+
+if ( $session{'SessionType'} eq 'REST' ) {
+    $r->content_type('text/plain');
+    $m->out( "Error: " . $Why . "\n" );
+    $m->out( $Details . "\n" );
+    $m->abort();
+}
+</%INIT>
diff --git a/rt/html/Elements/Footer b/rt/html/Elements/Footer
new file mode 100644 (file)
index 0000000..5c833f8
--- /dev/null
@@ -0,0 +1,60 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% if ($Menu) {
+</td>
+</tr>
+<tr>
+<td>
+% }
+<& /Elements/Callback, %ARGS &>
+<div class="bpscredits">
+&#187;&#124;&#171; <&|/l, $RT::VERSION &>RT [_1] from <a href="http://bestpractical.com">Best Practical Solutions, LLC</a>.</&>
+</div>
+% if ($Debug) {
+<HR>
+<b><&|/l&>Time to display</&>: <%Time::HiRes::tv_interval( $m->{'rt_base_time'} )%></b>
+% }
+% if ($Debug >= 2 ) {
+% require Data::Dumper;
+% my $d = Data::Dumper->new([\%ARGS], [qw(%ARGS)]);
+<pre>
+<%$d->Dump() %>
+</pre>
+% }
+% if ($Menu) {
+</TD>
+</TR>
+</TABLE>
+</TD>
+</TR>
+</TABLE>
+% }
+</BODY>
+</HTML>
+% $m->abort();
+
+<%ARGS>
+$Debug => 0
+$Menu => 1
+</%ARGS>
diff --git a/rt/html/Elements/GotoTicket b/rt/html/Elements/GotoTicket
new file mode 100644 (file)
index 0000000..bb0c04d
--- /dev/null
@@ -0,0 +1,24 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<FORM ACTION="<%$RT::WebPath%>/Ticket/Display.html"><input type=submit value="<&|/l&>Goto ticket</&>">&nbsp;<input size=5 name=id accesskey="0"></FORM>
diff --git a/rt/html/Elements/Header b/rt/html/Elements/Header
new file mode 100644 (file)
index 0000000..0fd91a2
--- /dev/null
@@ -0,0 +1,82 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE><%$Title%></TITLE>
+% if ($Refresh > 0) {
+<META HTTP-EQUIV="REFRESH" CONTENT="<%$Refresh%>">
+% }
+
+<link rel="shortcut icon" href="<%$RT::WebImagesURL%>/favicon.png" type="image/png">
+<link rel="stylesheet" href="<%$RT::WebPath%>/NoAuth/webrt.css" type="text/css">
+</HEAD>
+<BODY BGCOLOR="<%$BgColor%>"
+% if ($Focus) {
+ONLOAD="
+    var tmp = (document.getElementsByName('<% $Focus %>'));
+    if (tmp.length > 0) tmp[tmp.length-1].focus();
+"
+% }
+>
+<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
+  <tr> 
+    <td colspan=2><a href="http://bestpractical.com"><img src="<%$RT::WebImagesURL%>/bplogo.gif" alt="" width="230" height="50"></a></td>
+    <td>&nbsp;</td>
+    <td>&nbsp;</td>
+    <td width="50%" align="right">
+% if ($session{'CurrentUser'} && $session{'CurrentUser'}->Id && $LoggedIn) {
+<SPAN STYLE="display: none"><A HREF="#skipnav"><&|/l&>Skip Menu</&></A> |</SPAN>
+<A  HREF="<%$RT::WebPath%><% $Prefs %>" ><&|/l&>Preferences</&></A>
+<& /Elements/Callback, %ARGS &>
+% unless ($RT::WebExternalAuth and !$RT::WebFallbackToInternalAuth) {
+| <A  HREF="<%$RT::WebPath%>/NoAuth/Logout.html<%$URL && "?URL=".$URL%>"><&|/l&>Logout</&></a>
+% }
+<BR>
+<&|/l, "<b>".$session{'CurrentUser'}->Name."</b>" &>Logged in as [_1]</&>
+% } else {
+<&|/l&>Not logged in.</&>
+% }
+</font>
+    </td>
+  </tr>
+</table>
+<%INIT>
+
+$r->header_out('Pragma' => 'no-cache');
+$r->header_out('Cache-control' => 'no-cache');
+</%INIT>
+
+<%ARGS>
+$Prefs => '/User/Prefs.html'
+$Focus => 'focus'
+$Title => undef
+$Code => undef
+$Refresh => 0
+$Why => undef
+$BgColor => '#ffffff'
+$ShowBar => 1
+$LoggedIn => 1
+$URL => undef
+</%ARGS>
diff --git a/rt/html/Elements/ListActions b/rt/html/Elements/ListActions
new file mode 100644 (file)
index 0000000..ffa09e2
--- /dev/null
@@ -0,0 +1,43 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% if ($actions[0] ) {
+<& /Elements/TitleBoxStart, title => loc('Results') &>
+<UL>
+% foreach my $action (@actions) {
+% next unless ($action);
+% my $skip = 0;
+% $m->comp('/Elements/Callback', _CallbackName => 'ModifyRow', row => \$action, skip => \$skip, %ARGS);
+% next if $skip;
+<LI><%$action%></LI>
+% }
+</UL>
+<& /Elements/TitleBoxEnd &>
+<BR>
+% }
+<%init>
+@actions = grep (/./,@actions);
+</%init>
+<%ARGS>
+@actions => undef
+</%ARGS>
diff --git a/rt/html/Elements/Login b/rt/html/Elements/Login
new file mode 100644 (file)
index 0000000..42c49c4
--- /dev/null
@@ -0,0 +1,101 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%INIT>
+if ($m->request_comp->path =~ '^/REST/\d+\.\d+/') {
+    $r->content_type("text/plain");
+    $m->error_format("text");
+    $m->out("RT/$RT::VERSION 401 Credentials required\n");
+    $m->out("\n$Error\n") if $Error;
+    $m->abort;
+}
+</%INIT>
+
+<& /Elements/Callback, %ARGS, _CallbackName => 'Header' &>
+<& /Elements/Header, Title => loc('Login'), Focus => 'user' &>
+
+<DIV ALIGN=CENTER>
+% if ($Error) {
+<& /Elements/TitleBoxStart, title => loc('Error') &>
+<% $Error %>
+<& /Elements/TitleBoxEnd &>
+% }
+<BR>
+<& /Elements/TitleBoxStart, width=> "40%", titleright => loc("RT [_1]", $RT::VERSION), title => loc('Login') ,
+contentbg=>"#cccccc" &>
+
+% unless ($RT::WebExternalAuth and !$RT::WebFallbackToInternalAuth) {
+<FORM METHOD=POST ACTION="<% (UNIVERSAL::can($r, 'uri') && ($r->uri) =~ m!.*/(.*)!) %>" >
+<TABLE BORDER=0 WIDTH=100%>
+<TR ALIGN=RIGHT>
+<TD ALIGN=RIGHT><&|/l&>Username</&>:</TD><TD ALIGN=LEFT><input name=user value="<%$user%>"></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Password</&>:</TD><TD ALIGN=LEFT><input type=password name=pass></TD></TR>
+<TR><TD colspan=2 align=right>
+<input type=submit Value="<&|/l&>Login</&>">
+</TD></TR>
+</TABLE>
+
+%# Give callbacks a chance to add more control elements
+<& /Elements/Callback, %ARGS &>
+
+<&/Elements/TitleBoxEnd&>
+% # From mason 1.0.1 forward, this doesn't work. in fact, it breaks things.
+% # But on Mason 1.15 it's fixed again, so we still use it.
+% # The code below iterates through everything in the passed in arguments
+% # Preserving all the old parameters
+% # This would be easier, except mason is 'smart' and calls multiple values
+% # arrays rather than multiple hash keys
+% my $key; my $val;
+% foreach $key (keys %ARGS) {
+%  if (($key ne 'user') and ($key ne 'pass')) {
+%      if (ref($ARGS{$key}) =~ /ARRAY/) {
+%              foreach $val (@{$ARGS{$key}}) {
+<input type=hidden name="<%$key %>" value="<% $val %>">
+%              }
+%      }
+%      else {
+<input type="hidden" name="<% $key %>" value="<% $ARGS{$key} %>">
+%      }
+%  }
+% }
+</FORM>
+% }
+</DIV>
+
+<BR>
+<!-- TODO: not yet implemented
+If you've forgotten your username or password, RT can <A
+href="/NoAuth/Reminder.html">send you a reminder</a>.
+-->
+<BR>
+<BR>
+<BR>
+<HR>
+<&|/l, '2003'&>RT is &copy; Copyright 1996-[_1] Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href="http://www.gnu.org/copyleft/gpl.html">Version 2 of the GNU General Public License.</a></&>
+
+<%ARGS>
+$user => ""
+$pass => undef
+$goto => undef
+$Error => undef
+</%ARGS>
diff --git a/rt/html/Elements/Menu b/rt/html/Elements/Menu
new file mode 100644 (file)
index 0000000..963be13
--- /dev/null
@@ -0,0 +1,84 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%# font size depends on level
+% if ($level ge 3) {
+%   $size = $basesize-(6);
+% } elsif ($level gt 0) {
+%   $size = $basesize-($level * 2);
+%   $padding = 2;
+% }
+%  else {
+%   $size = $basesize;
+%   $padding = 5;
+% }
+<ul class="topnav" >
+% my $sep=0;
+% my $accesskey="1";
+% foreach $tab (sort keys %{$toptabs}) {
+% my $current = $current_toptab || "";
+% my $path = $toptabs->{$tab}->{'path'} || "";
+% $path =~ s#/index.html$##gi;
+% $current =~ s#/index.html$##gi;
+% if ( $path eq $current) {
+%     $class="currenttopnav"
+% } else {
+%     $class="topnav"
+% } 
+% my $style="";
+% if ($sep) {
+% $style="border-top: solid #999 1px; padding-top: .1em; margin-top: .5em;";
+% } elsif ($level == 0 ) {
+% $style="border-bottom: solid white 1px; padding-top: .25em; padding-bottom: .5em;" ;
+% }
+% if ($toptabs->{$tab}->{'separator'}) {
+% $sep=1;
+% } else {
+% $sep=0;
+% }
+<li style="<%$style%>"><A HREF="<%$RT::WebPath%>/<%$toptabs->{$tab}->{'path'}|n%>" style="font-size: <%$size%>;" class="<%$class%>" 
+<%($class eq 'currenttopnav') ? "name='focus'" : ""|n %> 
+<% !$level && "accesskey='".$accesskey++."'" |n%>><% $toptabs->{$tab}->{'title'}%></A>
+%# Second-level items
+%# if ($current_toptab eq $toptabs->{$tab}->{'path'}) {
+%# commented out by jesse on 4 jan 2003 so that tickets/search and ticket/# can
+%# both have menu items
+% if ($toptabs->{$tab}->{'subtabs'}) {
+        <& /Elements/Menu, level => $level+1, 
+                current_toptab => $toptabs->{$tab}->{'current_subtab'},
+                toptabs => $toptabs->{$tab}->{'subtabs'} &></li>
+% }
+%# }
+% }
+</ul>
+
+<%INIT>
+my ($tab, $subtab, $class, $size, $padding);
+my $basesize=16;
+</%INIT>
+
+<%ARGS>
+$current_toptab => ""
+$toptabs => undef
+$level => 0
+</%ARGS>
diff --git a/rt/html/Elements/MessageBox b/rt/html/Elements/MessageBox
new file mode 100644 (file)
index 0000000..64fdf38
--- /dev/null
@@ -0,0 +1,47 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TEXTAREA COLS=<%$Width%> ROWS=15 WRAP=HARD NAME="<%$Name%>"><& /Elements/Callback, %ARGS &><% $Default %><%$message%><%$signature%></TEXTAREA>
+<%INIT>
+
+my ($message);
+
+if ($QuoteTransaction) {
+    my $transaction=RT::Transaction->new($session{'CurrentUser'});
+    $transaction->Load($QuoteTransaction);
+    $message=$transaction->Content(Quote => 1);
+}
+
+my $signature = '';
+if ($session{'CurrentUser'}->UserObj->Signature) {
+       $signature = "-- \n".$session{'CurrentUser'}->UserObj->Signature;
+}
+
+</%INIT>
+<%ARGS>
+$QuoteTransaction => undef
+$Name => 'Content'
+$Default => ''
+$Width => 72
+</%ARGS>
+
diff --git a/rt/html/Elements/MyRequests b/rt/html/Elements/MyRequests
new file mode 100644 (file)
index 0000000..05ae624
--- /dev/null
@@ -0,0 +1,78 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, title => loc("[_1] highest priority tickets I requested...", $rows), bodyclass=> '' &>
+<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%>
+<TR>
+<TH align=right><&|/l&>#</&></TH>
+<TH align=left><&|/l&>Subject</&></TH>
+<TH align=left><&|/l&>Queue</&></TH>
+<TH align=left><&|/l&>Status</&></TH>
+<TH align=left><&|/l&>Owner</&></TH>
+</TR>
+% my $i;
+% while (my $Ticket = $MyTickets->Next) {
+% $i++;
+<TR class="<% $i%2 ? 'oddline' : 'evenline'%>" >
+<TD ALIGN=RIGHT>
+<%$Ticket->Id%>
+</TD>
+<TD>
+<A HREF="<% $RT::WebPath %>/Ticket/Display.html?id=<%$Ticket->Id%>">
+<%$Ticket->Subject || loc('(no subject)')%>
+</A>
+</TD>
+<TD>
+<%$Ticket->QueueObj->Name%>
+</TD>
+<TD>
+% if ($Ticket->HasUnresolvedDependencies ) {
+%     if ($Ticket->HasUnresolvedDependencies( Type => 'approval'  )) { 
+<em><&|/l&>(pending approval)</&></em>
+%     } else {
+<em><&|/l&>(pending other tickets)</&></em>
+%     }
+% } else {
+<%loc($Ticket->Status)%>
+% }
+</TD>
+<TD>
+<%$Ticket->OwnerObj->Name%>
+</TD>
+</TR>
+% }
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+
+
+<%INIT>
+my $rows = 10;
+my $MyTickets;
+$MyTickets = new RT::Tickets ($session{'CurrentUser'});
+$MyTickets->LimitWatcher(TYPE => 'Requestor', VALUE => $session{'CurrentUser'}->EmailAddress);
+$MyTickets->LimitStatus(VALUE => "open");
+$MyTickets->LimitStatus(VALUE => "new");
+$MyTickets->RowsPerPage($rows);
+$MyTickets->OrderBy(FIELD => 'Priority', ORDER => 'DESC');
+
+</%INIT>
diff --git a/rt/html/Elements/MyTickets b/rt/html/Elements/MyTickets
new file mode 100644 (file)
index 0000000..6e2ddc6
--- /dev/null
@@ -0,0 +1,81 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, title => loc("[_1] highest priority tickets I own...", $rows), bodyclass=> '' &>
+<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%>
+<TR>
+<TH ALIGN=RIGHT><&|/l&>#</&></TH>
+<TH ALIGN=LEFT><&|/l&>Subject</&></TH>
+<TH ALIGN=LEFT><&|/l&>Queue</&></TH>
+<TH ALIGN=LEFT><&|/l&>Status</&></TH>
+<TH ALIGN=LEFT>&nbsp;</TH>
+</TR>
+  <TR>    
+% my $i;
+% while (my $Ticket = $MyTickets->Next) {
+%     next if $Ticket->HasUnresolvedDependencies( Type => 'approval' );
+%     last if $i++ >= $rows;
+<TR class="<% $i%2 ? 'oddline' : 'evenline'%>" >                                
+<TD ALIGN=RIGHT>
+<%$Ticket->Id%>
+</TD>
+<TD>
+<A HREF="<% $RT::WebPath %>/Ticket/Display.html?id=<%$Ticket->Id%>">
+<%$Ticket->Subject || loc('(no subject)')%>
+</A>
+</TD>
+<TD>
+<%$Ticket->QueueObj->Name%>
+</TD>
+<TD>
+% if ($Ticket->HasUnresolvedDependencies ) {
+%     if ($Ticket->HasUnresolvedDependencies( Type => 'approval' ) or
+%         $Ticket->HasUnresolvedDependencies( Type => 'code' )) {
+<em><&|/l&>(pending approval)</&></em>
+%     } else {
+<em><&|/l&>(pending other tickets)</&></em>
+%     }
+% } else {
+<%loc($Ticket->Status)%>
+% }
+</TD>
+<TD ALIGN=RIGHT>
+[<A HREF="<% $RT::WebPath %>/Ticket/Update.html?id=<%$Ticket->Id%>"><&|/l&>Update</&></A>]
+</TD>
+</TR>
+% }
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+
+
+<%INIT>
+my $rows = 10;
+my $MyTickets;
+$MyTickets = new RT::Tickets ($session{'CurrentUser'});
+$MyTickets->LimitOwner(VALUE => $session{'CurrentUser'}->Id);
+$MyTickets->LimitStatus(VALUE => "open");
+$MyTickets->LimitStatus(VALUE => "new");
+$MyTickets->RowsPerPage($rows);
+$MyTickets->OrderBy(FIELD => 'Priority', ORDER => 'DESC');
+
+</%INIT>
diff --git a/rt/html/Elements/PageLayout b/rt/html/Elements/PageLayout
new file mode 100644 (file)
index 0000000..6853175
--- /dev/null
@@ -0,0 +1,99 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table class="darkblue" border=0 cellspacing=0 cellpadding=0 width="100%">
+  <th class="titlebox" align="left"><span class="rtname"><%$AppName%></span>
+  </th>
+      <span class="topactions">
+% foreach my $action (sort keys %{$topactions}) {
+        <td class="darkblueright">
+        <%$topactions->{"$action"}->{'html'} |n %>
+        </td>
+% }
+      </span>
+</table>
+<table border=0 cellspacing=0 cellpadding=0 width="100%" height="100%">
+%# Vertical menu
+<TR height="100%">
+<TD valign="top" width="140" class="blue">
+          <& /Elements/Menu, toptabs => $toptabs, current_toptab => $current_toptab &>
+</TD>
+<td valign="top">
+<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
+<tr>
+  <td class="blue" valign="top">
+    <span class="title"><%$title%></span>
+</td>
+</tr>
+<tr>
+<td class="blueright" valign="top">
+    <span class="nav"> 
+% if ($actions) {
+% my @actions;
+% foreach my $action (sort keys %{$actions}) {
+% if ($actions->{"$action"}->{'html'}) {
+% push @actions, $actions->{"$action"}->{'html'}; 
+% } else {
+% push @actions,  "<A class='nav' HREF=\"".$RT::WebPath."/".$actions->{$action}->{'path'}."\">".$actions->{$action}->{'title'}."</A>";
+% }
+%  }
+<% join(" | ", @actions) | n %>
+% if ($subactions) {
+% my @actions;
+% foreach my $action (sort keys %{$subactions}) {
+% push @actions, $subactions->{"$action"}->{'html'}; 
+%  }
+<% join(" | ", @actions) | n %>
+% }
+% }
+    </span>
+  </td>
+</tr>
+<TR valign="top">
+<TD valign="top" width="100%" height="100%" class="mainbody" >
+
+<%INIT>
+
+  foreach my $tab (sort keys %{$toptabs}) {
+    if ($toptabs->{$tab}->{'path'} eq $current_toptab) {
+      $toptabs->{$tab}->{"subtabs"} = $tabs;
+      $toptabs->{$tab}->{"current_subtab"} = $current_tab;
+    }
+  }
+
+if (! defined($AppName)) {
+  $AppName = loc("RT for [_1]", $RT::rtname);
+}
+
+</%INIT>
+<%ARGS>
+$current_toptab => undef
+$current_tab => undef
+$toptabs => undef
+$topactions => undef
+$tabs => undef
+$actions => undef
+$subactions => undef
+$title => $m->callers(-1)->path
+$AppName => undef
+</%ARGS>
diff --git a/rt/html/Elements/Quicksearch b/rt/html/Elements/Quicksearch
new file mode 100644 (file)
index 0000000..b1a67ab
--- /dev/null
@@ -0,0 +1,61 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, title => loc("Quick search"), bodyclass => "" &>
+
+<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%>                       
+<tr>                                                                          
+       <th align=left><&|/l&>Queue</&></th>                                         
+       <th align=right><font size=-1><&|/l&>New</&></font></th>
+       <th align=right><font size=-1><&|/l&>Open</&></font></th>          
+</tr>
+
+<%PERL>
+my $i;
+while (my $queue = $Queues->Next) {
+     $Tickets->ClearRestrictions;                                           
+     $Tickets->LimitStatus(VALUE => "open");                                
+     $Tickets->LimitQueue(VALUE => $queue->Name, OPERATOR => '=');            
+     my $open = $Tickets->Count();
+
+     $Tickets->ClearRestrictions;                                           
+     $Tickets->LimitStatus(VALUE => "new");
+     $Tickets->LimitQueue(VALUE => $queue->Name, OPERATOR => '=');            
+     my $new = $Tickets->Count();
+
+</%PERL>
+% $i++;                                                                         
+<TR class="<% $i%2 ? 'oddline' : 'evenline'%>" >                                
+<td><A HREF="<% $RT::WebPath%>/Search/Listing.html?ValueOfStatus=open&ValueOfStatus=new&StatusOp=%3D&QueueOp=%3D&ValueOfQueue=<%$queue->Id%>&RowsPerPage=50&NewSearch=1" TITLE="<% $queue->Description %>"><%$queue->Name%></a></TD>
+<td align="right"><A HREF="<% $RT::WebPath%>/Search/Listing.html?ValueOfStatus=new&StatusOp=%3D&QueueOp=%3D&ValueOfQueue=<%$queue->Id%>&RowsPerPage=50&NewSearch=1"><%$new%></a></TD>
+<td align="right"><A HREF="<% $RT::WebPath%>/Search/Listing.html?ValueOfStatus=open&StatusOp=%3D&QueueOp=%3D&ValueOfQueue=<%$queue->Id%>&RowsPerPage=50&NewSearch=1"><%$open%></a></TD>
+</TR>
+% }
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+
+<%INIT>
+my $Queues = RT::Queues->new($session{'CurrentUser'}); 
+$Queues->UnLimit();
+my $Tickets = RT::Tickets->new($session{'CurrentUser'});
+</%INIT>
diff --git a/rt/html/Elements/Refresh b/rt/html/Elements/Refresh
new file mode 100644 (file)
index 0000000..2b5376f
--- /dev/null
@@ -0,0 +1,45 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+<OPTION VALUE="-1"
+%unless ($Default) {
+ SELECTED
+%}
+><&|/l&>Don't refresh this page.</&></OPTION>
+%foreach my $value (@refreshevery) {
+<OPTION VALUE="<%$value%>"
+% if ($value == $Default) {
+SELECTED 
+% }
+><&|/l, $value/60 &>Refresh this page every [_1] minutes.</&></OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my @refreshevery = qw(120 300 600 1200 3600 7200);
+</%INIT>
+<%ARGS>
+$Name => undef
+$Default => 0
+</%ARGS>
diff --git a/rt/html/Elements/Section b/rt/html/Elements/Section
new file mode 100644 (file)
index 0000000..6912358
--- /dev/null
@@ -0,0 +1,34 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE WIDTH=100%>
+<TR>
+<TD>
+<font size=+4><%$title%></font>
+</TD>
+</TR>
+</TABLE>
+
+<%ARGS>
+$title => undef
+</%ARGS>
diff --git a/rt/html/Elements/SelectAttachmentField b/rt/html/Elements/SelectAttachmentField
new file mode 100644 (file)
index 0000000..47bc532
--- /dev/null
@@ -0,0 +1,31 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+<OPTION VALUE="Content"><&|/l&>content</&></OPTION>
+<OPTION VALUE="ContentType"><&|/l&>content-type</&></OPTION>
+<OPTION VALUE="Filename"><&|/l&>filename</&></OPTION>
+</SELECT>
+<%ARGS>
+$Name => 'AttachmentField'
+</%ARGS>
diff --git a/rt/html/Elements/SelectBoolean b/rt/html/Elements/SelectBoolean
new file mode 100644 (file)
index 0000000..8cf60dc
--- /dev/null
@@ -0,0 +1,46 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+<OPTION VALUE="<%$TrueVal%>" <%$TrueDefault%>><%$True%></OPTION>
+<OPTION VALUE="<%$FalseVal%>" <%$FalseDefault%>><%$False%></OPTION>
+</SELECT>
+
+<%ARGS>
+$Name => undef
+$True => loc("is")
+$Default => 'true'
+$TrueVal => 1
+$FalseVal => 0
+$False => loc("isn't")
+</%ARGS>
+
+<%INIT>
+my ($TrueDefault, $FalseDefault);
+if ($Default && $Default !~ /true/i) {
+       $FalseDefault = "SELECTED";
+}
+else {
+       $TrueDefault = "SELECTED";
+}
+</%INIT>
diff --git a/rt/html/Elements/SelectCustomFieldOperator b/rt/html/Elements/SelectCustomFieldOperator
new file mode 100644 (file)
index 0000000..e886cbe
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+% while (my $option = shift @Options) {
+% my $value = shift @Values;
+<OPTION VALUE="<%$value%>"
+% if ($Default eq $value) {
+SELECTED
+% }
+><%$option%></OPTION>
+% }
+</SELECT>
+
+<%ARGS>
+$Name => undef
+@Options => ( loc('contains'), loc("doesn't contain"), loc('is'), loc("isn't"), loc('less than'), loc('greater than'))
+@Values => ('LIKE', 'NOT LIKE', '=', '!=', '<', '>')
+$Default => undef
+</%ARGS>
diff --git a/rt/html/Elements/SelectCustomFieldValue b/rt/html/Elements/SelectCustomFieldValue
new file mode 100644 (file)
index 0000000..60f65bc
--- /dev/null
@@ -0,0 +1,41 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Callback, %ARGS &>
+% if ($CustomField->Type =~ /Select/i) {
+% my $values = $CustomField->Values;
+<select name="<%$Name%>">
+<option value="" SELECTED>-</option>
+<option value="null"><&|/l&>(no value)</&></option>
+% while (my $value = $values->Next) {
+<option value="<%$value->Name%>"><%$value->Name%></option>
+% }
+</select>
+% }
+% else {
+<input name="<%$Name%>" size="20">
+% }
+<%args>
+$Name => undef
+$CustomField =>undef
+</%args>
diff --git a/rt/html/Elements/SelectDate b/rt/html/Elements/SelectDate
new file mode 100644 (file)
index 0000000..5f169fc
--- /dev/null
@@ -0,0 +1,48 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<INPUT NAME="<%$Name%>" VALUE="<%$Default%>" size=16> 
+
+<%init>
+unless ((defined $Default) or 
+       ($current <= 0)) {
+       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+                                            localtime($current);
+        $Default = sprintf("%04d-%02d-%02d %02d:%02d",                         
+                           $year+1900,$mon+1,$mday,                            
+                           $hour,$min);   
+}
+
+unless ($Name) {
+       $Name = $menu_prefix. "_Date";
+}
+</%init>
+
+<%args>
+
+$ShowTime => undef
+$menu_prefix=>''
+$current=>time
+$Default => undef
+$Name => undef
+</%args>
diff --git a/rt/html/Elements/SelectDateRelation b/rt/html/Elements/SelectDateRelation
new file mode 100644 (file)
index 0000000..ee26efe
--- /dev/null
@@ -0,0 +1,36 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+<OPTION VALUE="&lt;"><%$Before%></OPTION>
+<OPTION VALUE="="><%$On%></OPTION>
+<OPTION VALUE="&gt;"><%$After%></OPTION>
+</SELECT>
+
+<%ARGS>
+$Name => undef
+$Default => undef
+$Before => loc('Before')
+$On =>         loc('On')
+$After => loc('After')
+</%ARGS>
diff --git a/rt/html/Elements/SelectDateType b/rt/html/Elements/SelectDateType
new file mode 100644 (file)
index 0000000..afb9a70
--- /dev/null
@@ -0,0 +1,36 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+<OPTION VALUE="Created"><&|/l&>Created</&></OPTION>
+<OPTION VALUE="Started"><&|/l&>Started</&></OPTION>
+<OPTION VALUE="Resolved"><&|/l&>Resolved</&></OPTION>
+<OPTION VALUE="Told"><&|/l&>Last Contacted</&></OPTION>
+<OPTION VALUE="LastUpdated"><&|/l&>Last Updated</&></OPTION>
+<OPTION VALUE="Starts"><&|/l&>Starts</&></OPTION>
+<OPTION VALUE="Due"><&|/l&>Due</&></OPTION>
+<OPTION VALUE="Updated"><&|/l&>Updated</&></OPTION>
+</SELECT>
+<%ARGS>
+$Name => 'DateType'
+</%ARGS>
diff --git a/rt/html/Elements/SelectEqualityOperator b/rt/html/Elements/SelectEqualityOperator
new file mode 100644 (file)
index 0000000..99c60d5
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+% while (my $option = shift @Options) {
+% my $value = shift @Values;
+<OPTION VALUE="<%$value%>"
+% if ($Default eq $value) {
+SELECTED
+% }
+><%$option%></OPTION>
+% }
+</SELECT>
+
+<%ARGS>
+$Name => undef
+@Options => (loc('less than'), loc('equal to'), loc('greater than'), loc('not equal to'))
+@Values => qw(< = > !=)
+$Default => undef
+</%ARGS>
diff --git a/rt/html/Elements/SelectGroups b/rt/html/Elements/SelectGroups
new file mode 100644 (file)
index 0000000..8f33c1e
--- /dev/null
@@ -0,0 +1,29 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<select name="GroupField">
+<option value="Name"><&|/l&>Name</&>
+<option value="Description"><&|/l&>Description</&>
+</select>
+<& /Elements/SelectMatch, Name=> 'GroupOp' &>
+<input size=8 name="GroupString">
diff --git a/rt/html/Elements/SelectLinkType b/rt/html/Elements/SelectLinkType
new file mode 100644 (file)
index 0000000..9ebefda
--- /dev/null
@@ -0,0 +1,37 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+<OPTION VALUE="MemberOf"><&|/l&>Member of</&></OPTION>
+<OPTION VALUE="DependsOn"><&|/l&>Depends on</&></OPTION>
+<OPTION VALUE="RefersTo"><&|/l&>Refers to</&></OPTION>
+</SELECT>
+
+<%ARGS>
+$Name => "LinkType"
+$Default => undef
+</%ARGS>
+
+<%INIT>
+# TODO handle Default
+</%INIT>
diff --git a/rt/html/Elements/SelectMatch b/rt/html/Elements/SelectMatch
new file mode 100644 (file)
index 0000000..d58a963
--- /dev/null
@@ -0,0 +1,53 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+<OPTION VALUE="LIKE" <%$LikeDefault%>><%$Like%></OPTION>
+<OPTION VALUE="NOT LIKE" <%$NotLikeDefault%>><%$NotLike%></OPTION>
+<OPTION VALUE="=" <%$TrueDefault%>><%$True%></OPTION>
+<OPTION VALUE="!=" <%$FalseDefault%>><%$False%></OPTION>
+</SELECT>
+
+<%ARGS>
+$Name => undef
+$Like => loc('contains')
+$NotLike => loc("doesn't contain")
+$True => loc('is')
+$False => loc("isn't")
+$Default => undef
+</%ARGS>
+<%INIT>
+my ($TrueDefault, $FalseDefault, $LikeDefault, $NotLikeDefault);
+if ($Default && $Default !~ /true/i) {
+       $FalseDefault = "SELECTED";
+}
+elsif ($Default && $Default !~ /false/i) {
+       $TrueDefault = "SELECTED";
+} 
+elsif ($Default && $Default !~ /notlike/i) {
+       $NotLikeDefault = "SELECTED";
+}
+else {
+       $LikeDefault = "SELECTED";
+}
+</%INIT>
diff --git a/rt/html/Elements/SelectNewTicketQueue b/rt/html/Elements/SelectNewTicketQueue
new file mode 100644 (file)
index 0000000..a629b7b
--- /dev/null
@@ -0,0 +1,56 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<LABEL ACCESSKEY="9">
+<SELECT NAME ="<%$Name%>">
+% foreach my $queue (@{$session{'create_in_queues'}}) {
+<OPTION VALUE="<%$queue->{'id'}%>" <%($Default && ($queue->{'id'} == $Default)) && 'SELECTED'%>><%$queue->{'Name'}%>
+%   if (($Verbose) and ($queue->{'Description'}) ){
+(<%$queue->{'Description'}%>)
+%  }
+</OPTION>
+% }
+</SELECT>
+</LABEL>
+
+<%INIT>
+unless ($session{'create_in_queues'}) { 
+
+@{$session{'create_in_queues'}} = ();
+my $q=new RT::Queues($session{'CurrentUser'});
+$q->UnLimit;
+while (my $queue=$q->Next) {
+        if ($queue->CurrentUserHasRight('CreateTicket')) {
+                my $ds = { Name => $queue->Name, Description => $queue->Description, id => $queue->id };
+                push (@{$session{'create_in_queues'}}, $ds);
+        }        
+}
+}
+</%INIT>
+
+
+<%ARGS>
+$Name => 'Queue'
+$Verbose => undef
+$Default => undef
+</%ARGS>
diff --git a/rt/html/Elements/SelectOwner b/rt/html/Elements/SelectOwner
new file mode 100644 (file)
index 0000000..04b078d
--- /dev/null
@@ -0,0 +1,59 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+<OPTION VALUE="">-</OPTION>
+<OPTION <% ($RT::Nobody->Id() == $Default) && "SELECTED" %> VALUE="<%$RT::Nobody->Id%>"><%$RT::Nobody->Name%></OPTION>
+%while ( my $User = $Users->Next())  {
+<OPTION VALUE="<%$User->Id()%>" <% ($User->Id() == $Default) && "SELECTED" %>><%$User->Name()%></OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my $Users = RT::Users->new($session{CurrentUser});
+my $object;
+
+
+if ($TicketObj) {
+        $object = $TicketObj;
+}
+elsif ($QueueObj) {
+        $object = $QueueObj;
+}
+if ($object) {
+        $Users->WhoHaveRight(Right => 'OwnTicket',
+                     Object => $object,
+                     IncludeSystemRights => 1,
+                     IncludeSuperusers => 1);
+} else {
+        $Users->LimitToPrivileged;
+}
+</%INIT>
+
+<%ARGS>
+$QueueObj => undef
+$Name => undef
+$Default => undef
+$User => undef
+$TicketObj => undef
+</%ARGS>
diff --git a/rt/html/Elements/SelectQueue b/rt/html/Elements/SelectQueue
new file mode 100644 (file)
index 0000000..c45b9b5
--- /dev/null
@@ -0,0 +1,59 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% if ($Lite) {
+<INPUT NAME="<%$Name%>" size=25 DEFAULT="<%$d->Name%>">
+% } else {
+<SELECT NAME ="<%$Name%>">
+% if ($ShowNullOption) {
+<OPTION VALUE="">-</OPTION>
+% }
+% while (my $queue=$q->Next) {
+% if ($ShowAllQueues || $queue->CurrentUserHasRight('CreateTicket')) {
+<OPTION VALUE="<%$queue->Id%>" <%($Default && ($queue->Id == $Default)) && 'SELECTED'%>><%$queue->Name%>
+%   if (($Verbose) and ($queue->Description) ){
+(<%$queue->Description%>)
+%  }
+</OPTION>
+% }
+% }
+</SELECT>
+% }
+<%ARGS>
+$ShowNullOption => 1
+$ShowAllQueues => 1
+$Name => undef
+$Verbose => undef
+$Default => 0
+$Lite => 0
+</%ARGS>
+
+<%INIT>
+
+my $q=new RT::Queues($session{'CurrentUser'});
+$q->UnLimit;
+
+my $d = new RT::Queue($session{'CurrentUser'});
+$d->Load($Default);
+
+</%INIT>
diff --git a/rt/html/Elements/SelectResultsPerPage b/rt/html/Elements/SelectResultsPerPage
new file mode 100644 (file)
index 0000000..1bde713
--- /dev/null
@@ -0,0 +1,43 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+%# TODO: Better default handling
+
+<SELECT NAME ="<%$Name%>">
+% foreach my $value (@values) {
+<OPTION VALUE="<%$value%>" <% $value == $Default && 'SELECTED' %>>
+<% shift @labels %>
+</OPTION>
+% }
+</SELECT>
+
+<%INIT>
+my @values = qw(0 10 25 50 100);
+my @labels = (loc('Unlimited'), qw(10 25 50 100));
+</%INIT>
+<%ARGS>
+
+$Name => undef
+$Default => 50
+
+</%ARGS>
diff --git a/rt/html/Elements/SelectSortOrder b/rt/html/Elements/SelectSortOrder
new file mode 100644 (file)
index 0000000..0ad999a
--- /dev/null
@@ -0,0 +1,41 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+%foreach my $order (@orders) {
+<OPTION VALUE="<%$order%>" <%$order eq $Default && 'SELECTED' %>>
+<% shift @order_names %>
+</OPTION>
+% }
+</SELECT>
+
+<%INIT>
+my @orders = qw (ASC DESC);
+my @order_names = (loc('Ascending'), loc('Descending'));
+
+</%INIT>
+
+<%ARGS>
+$Name => 'SortOrder'
+$Default => 'ASC'
+</%ARGS>
diff --git a/rt/html/Elements/SelectStatus b/rt/html/Elements/SelectStatus
new file mode 100644 (file)
index 0000000..2c1ffad
--- /dev/null
@@ -0,0 +1,37 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+<OPTION VALUE="">-</OPTION>
+%foreach my $status (@status) {
+<OPTION VALUE="<%$status%>" <%($Default eq $status) && 'SELECTED'%>><%loc($status)%></OPTION>
+% }
+</SELECT>
+<%ONCE>
+my $queue = new RT::Queue($session{'CurrentUser'});
+my @status = $queue->StatusArray();
+</%ONCE>
+<%ARGS>
+$Name => undef
+$Default => undef
+</%ARGS>
diff --git a/rt/html/Elements/SelectTicketSortBy b/rt/html/Elements/SelectTicketSortBy
new file mode 100644 (file)
index 0000000..1d0b394
--- /dev/null
@@ -0,0 +1,38 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+% foreach my $field (@sortfields) {
+<OPTION VALUE="<%$field%>" <% $field eq $Default && 'SELECTED'%>><% loc($field) %></OPTION>
+% }
+</SELECT>
+
+<%INIT>
+my $tickets = new RT::Tickets($session{'CurrentUser'});
+my @sortfields = $tickets->SortFields();
+
+</%INIT>
+<%ARGS>
+$Name => 'SortTicketsBy'
+$Default => 'id'
+</%ARGS>
diff --git a/rt/html/Elements/SelectTicketTypes b/rt/html/Elements/SelectTicketTypes
new file mode 100644 (file)
index 0000000..80aecac
--- /dev/null
@@ -0,0 +1,34 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME="<%$Name%>">
+%foreach (@Types) {
+<OPTION VALUE="<% $_ %>" <% ($_ eq $Default) && "SELECTED" %>><&|/l&><% $_ %></&>
+%}
+</SELECT>
+
+<%ARGS>
+$Name => 'TickType'
+$Default => undef
+@Types => qw(Approval Ticket)
+</%ARGS>
diff --git a/rt/html/Elements/SelectUsers b/rt/html/Elements/SelectUsers
new file mode 100644 (file)
index 0000000..7ed3835
--- /dev/null
@@ -0,0 +1,31 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<select name="UserField">
+<option value="Name"><&|/l&>User Id</&>
+<option value="EmailAddress"><&|/l&>Email</&>
+<option value="RealName"><&|/l&>Name</&>
+<option value="Organization"><&|/l&>Organization</&>
+</select>
+<& /Elements/SelectMatch, Name=> 'UserOp' &>
+<input size=8 name="UserString">
diff --git a/rt/html/Elements/SelectWatcherType b/rt/html/Elements/SelectWatcherType
new file mode 100644 (file)
index 0000000..26de8f7
--- /dev/null
@@ -0,0 +1,44 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SELECT NAME ="<%$Name%>">
+<OPTION VALUE="">-</OPTION>
+%for my $option (@types) {
+<OPTION VALUE="<%$option%>" <%$option eq $Default && "SELECTED"%>><%loc($option)%></OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my @types;
+if ($Scope =~ 'queue') {
+   @types = qw(Cc AdminCc);
+}
+else { 
+   @types = qw(Requestor Cc AdminCc);
+}
+</%INIT>
+<%ARGS>
+$Default=>undef
+$Scope => 'ticket'
+$Name => 'WatcherType'
+</%ARGS>
diff --git a/rt/html/Elements/SetupSessionCookie b/rt/html/Elements/SetupSessionCookie
new file mode 100644 (file)
index 0000000..4d728ce
--- /dev/null
@@ -0,0 +1,77 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%init>
+my %cookies = CGI::Cookie->fetch();
+my %backends = (
+    mysql      => 'Apache::Session::MySQL',
+    Pg         => 'Apache::Session::Postgres',
+    Oracle     => 'Apache::Session::Oracle',
+) unless $RT::WebSessionClass;
+my $session_class = $RT::WebSessionClass || $backends{$RT::DatabaseType} || 'Apache::Session::File';
+my $pm = "$session_class.pm"; $pm =~ s|::|/|g; require $pm;
+
+    eval {
+        tie %session, $session_class,
+          $SessionCookie || ( $cookies{'RT_SID'} ? $cookies{'RT_SID'}->value() : undef ),
+          $backends{$RT::DatabaseType} ? {
+            Handle     => $RT::Handle->dbh,
+            LockHandle => $RT::Handle->dbh,
+          } : {
+            Directory     => $RT::MasonSessionDir,
+            LockDirectory => $RT::MasonSessionDir,
+          };
+    };
+    if ($@) {
+
+        # If the session is invalid, create a new session.
+        if ( $@ =~ /Object does not/i ) {
+            tie %session, $session_class, undef,
+             $backends{$RT::DatabaseType} ? {
+                Handle     => $RT::Handle->dbh,
+                LockHandle => $RT::Handle->dbh,
+              } : {
+                Directory     => $RT::MasonSessionDir,
+                LockDirectory => $RT::MasonSessionDir,
+              };
+            undef $cookies{'RT_SID'};
+        }
+        else {
+            die "RT Couldn't write to session directory '$RT::MasonSessionDir': $@. Check that this dir ectory's permissions are correct.";
+        }
+    }
+
+    if ( !$cookies{'RT_SID'} ) {
+        my $cookie = new CGI::Cookie(
+            -name  => 'RT_SID',
+            -value => $session{_session_id},
+            -path  => '/',
+        );
+        $r->header_out('Set-Cookie', $cookie->as_string);
+
+    } 
+    return();
+</%init>
+<%args>
+$SessionCookie => ''
+</%args>
diff --git a/rt/html/Elements/ShadedBox b/rt/html/Elements/ShadedBox
new file mode 100644 (file)
index 0000000..36b9cae
--- /dev/null
@@ -0,0 +1,33 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table>
+  <tr>
+    <td class="label"><%$title |n %>:</td>
+    <td class="value"><%$content |n %></td>
+  </tr>
+</table>
+<%ARGS>
+$title => undef
+$content => "&nbsp;"
+</%ARGS>
diff --git a/rt/html/Elements/ShadedInputRow b/rt/html/Elements/ShadedInputRow
new file mode 100644 (file)
index 0000000..e9fb69e
--- /dev/null
@@ -0,0 +1,35 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<tr>
+  <td class="label"><%$title |n %>:</td>
+  <td class="value">
+    <input name=<%$name%> value="<%$content|h%>" SIZE=<%$size%>>
+  </td>
+</tr>
+<%ARGS>
+$title => undef
+$content => "&nbsp;"
+$name => undef
+$size => undef
+</%ARGS>
diff --git a/rt/html/Elements/ShadedRow b/rt/html/Elements/ShadedRow
new file mode 100644 (file)
index 0000000..8947fcd
--- /dev/null
@@ -0,0 +1,31 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<tr>
+  <td class="label"><%$title |n %>:</td>
+  <td class="value"><%$content |n %></td>
+</tr>
+<%ARGS>
+$title => undef
+$content => "&nbsp;"
+</%ARGS>
diff --git a/rt/html/Elements/SimpleSearch b/rt/html/Elements/SimpleSearch
new file mode 100644 (file)
index 0000000..69541f8
--- /dev/null
@@ -0,0 +1,27 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<form action="<% $RT::WebPath %>/index.html">
+<input size="12" name="q" accesskey="0">
+<input type="submit" value="<&|/l&>Search</&>">&nbsp;
+</form>
diff --git a/rt/html/Elements/Submit b/rt/html/Elements/Submit
new file mode 100644 (file)
index 0000000..2c35ca0
--- /dev/null
@@ -0,0 +1,62 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE WIDTH=100% BGCOLOR="<%$color%>" CELLSPACING=0 BORDER=0 CELLPADDING=0 >
+<TR>
+% if ($Reset) {
+<TD>
+<FONT COLOR=#ffd800 >
+<INPUT TYPE=RESET VALUE="<%$ResetLabel%>">
+</FONT>
+</TD>
+%}
+<TD>
+&nbsp;
+</TD>
+<TD ALIGN=RIGHT VALIGN=CENTER><FONT COLOR=#ffd800>
+% if ($AlternateLabel) {
+<B><%$AlternateCaption%>
+<INPUT TYPE=SUBMIT
+%if ($Name) {
+NAME="<%$Name%>"
+%}
+VALUE='<%$AlternateLabel%>'></B>
+% }
+<B><%$Caption%> <INPUT TYPE=SUBMIT
+%if ($Name) {
+NAME="<%$Name%>"
+% }
+ VALUE='<%$Label%>'></B></FONT>
+</TD>
+</TR>
+</TABLE>
+<%ARGS>
+$color => "#336699"
+$Caption => undef
+$AlternateCaption => undef
+$AlternateLabel => undef
+$Label => loc('Submit')
+$Name => undef
+$Reset => undef
+$ResetLabel => loc('Reset')
+</%ARGS>
diff --git a/rt/html/Elements/Tabs b/rt/html/Elements/Tabs
new file mode 100644 (file)
index 0000000..4db3849
--- /dev/null
@@ -0,0 +1,82 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/PageLayout,
+    current_toptab => $current_toptab,
+    current_tab => $current_tab,
+    toptabs => $toptabs,
+    topactions => $topactions,
+    tabs => $tabs,
+    actions => $actions,
+    subactions => $subactions,
+    title => $Title
+&>
+<a name="skipnav" id="skipnav" accesskey="8"></a>
+<%INIT>
+my $action;
+my $basetopactions = {
+       A => { html => $m->scomp('/Elements/CreateTicket')      
+               },
+       B => { html => $m->scomp('/Elements/SimpleSearch') 
+               }
+       };
+my $basetabs = {     A => { title => loc('Homepage'),
+                           path => '',
+                         },
+                    B => { title => loc('Tickets'),
+                        path => 'Search/Listing.html'
+                      },
+                    E => { title => loc('Configuration'),
+                           path => 'Admin/'
+                         },
+                    K => { title => loc('Preferences'),
+                        path => 'User/Prefs.html'
+                      },
+                    P => { title => loc('Approval'),
+                           path => 'Approvals/'
+                         },
+                 };
+
+if (!defined $toptabs) {
+   $toptabs = $basetabs;
+}
+if (!defined $topactions) {
+   $topactions = $basetopactions;
+}
+                    
+  # Now let callbacks add their extra tabs
+  $m->comp('/Elements/Callback', 
+    topactions => $topactions, 
+    toptabs => $toptabs, %ARGS);
+
+</%INIT>
+<%ARGS>
+$current_toptab => undef
+$current_tab => undef
+$toptabs => undef
+$topactions => undef
+$tabs => undef
+$actions => undef
+$subactions => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Elements/TitleBoxEnd b/rt/html/Elements/TitleBoxEnd
new file mode 100644 (file)
index 0000000..37f3744
--- /dev/null
@@ -0,0 +1,31 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+    </TD>
+  </TR>
+</TABLE>
+<%ARGS>
+$title => undef
+$content => undef
+</%ARGS>
+
diff --git a/rt/html/Elements/TitleBoxStart b/rt/html/Elements/TitleBoxStart
new file mode 100644 (file)
index 0000000..02c76a7
--- /dev/null
@@ -0,0 +1,60 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE CLASS="<%$class|n%>" 
+        BGCOLOR="<%$color%>" 
+        CELLSPACING=0
+        BORDER=0
+        WIDTH="<%$width%>"
+        CELLPADDING="0">
+
+  <TR>
+    <TH 
+        <%$color && "style=\"color: $color;\""|n%>
+        <%$class ? "class=\"$class\"" : "class=\"titlebox\""|n%>>
+      <span class="titleboxtitle">
+        <b>
+         <% $title_href && "<A CLASS=\"$title_class\" HREF=\"$title_href\">"|n%><%$title |n %><%  $title_href && "</A>" |n%></b>
+      </span>
+    </TH>
+    <TH  
+         <%$color && "style=\"color: $color;\""|n%>
+         <%$class ? "class=\"$class\"": "class=\"titleboxright\""|n%>>
+      <span class="titleboxright"><%$titleright ? $titleright : '&nbsp;' |n %></span>
+    </TH>
+  </TR>
+  <tr>
+    <td bgcolor="<%$contentbg%>" colspan="2" class="<%defined($bodyclass) ? $bodyclass :  $class|n%>">
+<%ARGS>
+$width => "100%"
+$class =>  undef
+$bodyclass => undef
+$title_href => undef
+$title => undef
+$title_class => undef
+
+$titleright_href => undef
+$titleright => undef
+$contentbg => "#dddddd"
+$color => "#336699"
+</%ARGS>
diff --git a/rt/html/Elements/ViewUser b/rt/html/Elements/ViewUser
new file mode 100644 (file)
index 0000000..6572724
--- /dev/null
@@ -0,0 +1,51 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, 
+       title => "<a class='inverse' href=\"$RT::WebPath/Search/Listing.html?LimitRequestorById=1&IdOfRequestor=".$User->id."\">".loc("Tickets from [_1]", $name)."</a>",
+       titleright=> "<a class='inverse' href=\"$RT::WebPath/EditUserComments.html?id=".$User->id."\">".loc("Comments about [_1]", $name)."</a>" &>
+<TABLE WIDTH="100%">
+<tr>
+<td halign=left valign=top>
+%while (my $w=$tickets->Next) {
+<%$w->Id%>: <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$w->id%>"><%$w->Subject%></a> (<%$w->Status%>)<BR>
+%}
+</td>
+<td align=right valign=top>
+       <% ($User->Comments || loc("No comment entered about this user")) %>
+</tr>
+</table>
+<& /Elements/TitleBoxEnd &>
+
+<%ARGS>
+$User=>undef
+</%ARGS>
+
+<%INIT>
+my $name=$User->RealName || $User->EmailAddress;       
+
+my $tickets = new RT::Tickets($session{'CurrentUser'});
+$tickets->LimitWatcher(TYPE => 'Requestor', VALUE => $User->EmailAddress);
+
+
+</%INIT>
diff --git a/rt/html/NoAuth/Logout.html b/rt/html/NoAuth/Logout.html
new file mode 100644 (file)
index 0000000..a4bb997
--- /dev/null
@@ -0,0 +1,46 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<HTML>
+<HEAD>
+<TITLE>RT: Logout</TITLE>
+ <META HTTP-EQUIV="Refresh" CONTENT="0;URL=<%$URL%>">
+</HEAD>
+<BODY>
+<p><&|/l&>You have been logged out of RT.</&>
+
+<br>
+<br>
+<A HREF="<%$URL%>"><&|/l&>You're welcome to login again</&></a>
+
+
+<%PERL>
+if (defined %session) {
+       tied(%session)->delete;
+}
+$m->abort();
+</%PERL>
+
+<%ARGS>
+$URL => $RT::WebPath."/"
+</%ARGS>
diff --git a/rt/html/NoAuth/Reminder.html b/rt/html/NoAuth/Reminder.html
new file mode 100644 (file)
index 0000000..35da66e
--- /dev/null
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, title => loc('Password Reminder') &>
+
+<&|/l&>Not yet implemented.</&>
diff --git a/rt/html/NoAuth/images/back_home.gif b/rt/html/NoAuth/images/back_home.gif
new file mode 100644 (file)
index 0000000..40b19c1
Binary files /dev/null and b/rt/html/NoAuth/images/back_home.gif differ
diff --git a/rt/html/NoAuth/images/bplogo.gif b/rt/html/NoAuth/images/bplogo.gif
new file mode 100644 (file)
index 0000000..e2cf49c
Binary files /dev/null and b/rt/html/NoAuth/images/bplogo.gif differ
diff --git a/rt/html/NoAuth/images/favicon.png b/rt/html/NoAuth/images/favicon.png
new file mode 100644 (file)
index 0000000..ed1ee37
Binary files /dev/null and b/rt/html/NoAuth/images/favicon.png differ
diff --git a/rt/html/NoAuth/images/head_requestracker.gif b/rt/html/NoAuth/images/head_requestracker.gif
new file mode 100644 (file)
index 0000000..73315e9
Binary files /dev/null and b/rt/html/NoAuth/images/head_requestracker.gif differ
diff --git a/rt/html/NoAuth/images/rt.jpg b/rt/html/NoAuth/images/rt.jpg
new file mode 100644 (file)
index 0000000..a137a93
Binary files /dev/null and b/rt/html/NoAuth/images/rt.jpg differ
diff --git a/rt/html/NoAuth/images/space.gif b/rt/html/NoAuth/images/space.gif
new file mode 100644 (file)
index 0000000..1d11fa9
Binary files /dev/null and b/rt/html/NoAuth/images/space.gif differ
diff --git a/rt/html/NoAuth/images/spacer.gif b/rt/html/NoAuth/images/spacer.gif
new file mode 100644 (file)
index 0000000..5bfd67a
Binary files /dev/null and b/rt/html/NoAuth/images/spacer.gif differ
diff --git a/rt/html/NoAuth/images/squares_blue.gif b/rt/html/NoAuth/images/squares_blue.gif
new file mode 100644 (file)
index 0000000..a28da5c
Binary files /dev/null and b/rt/html/NoAuth/images/squares_blue.gif differ
diff --git a/rt/html/NoAuth/webrt.css b/rt/html/NoAuth/webrt.css
new file mode 100644 (file)
index 0000000..62c6d66
--- /dev/null
@@ -0,0 +1,338 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+SPAN.nav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 12px;
+        color: #FFFFFF;
+        text-decoration: none;
+        white-space: nowrap}
+.nav2 {         font-size: 10px;
+        white-space: nowrap}
+.nav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        color: #FFFFFF;
+        text-decoration: none;
+        white-space: nowrap}
+.currentnav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+         font-weight: bold;
+        color: #FFFF66;
+        text-decoration: none;
+        white-space: nowrap}
+.topnav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 16px;
+        font-weight: normal;
+        color: #FFFFFF;
+        text-decoration: none;
+        white-space: nowrap}
+.currenttopnav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 16px;
+         font-weight: bold;
+        color: #FFFF66;
+        text-decoration: none;
+        white-space: nowrap}
+.topactions {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 10px;
+        color: #FFFFFF;
+        text-decoration: none;
+        white-space: nowrap}
+.subnav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 11px;
+        font-weight: normal;
+        color: #FFFFFF;
+        text-decoration: none;
+        white-space: nowrap}
+.currentsubnav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 11px;
+         font-weight: bold;
+        color: #FFFF66;
+        text-decoration: none;
+        white-space: nowrap}
+.error {  background-color: #ff0000;
+        background-position: left top;
+        vertical-align: top;
+        text-align: left;
+         }
+.oldblue {  background-color: #0066CC;
+        background-position: left top;
+        vertical-align: top;
+        text-align: left;
+         }
+.blue {  background-color: #4682B4;
+        background-position: left top;
+        vertical-align: top;
+        text-align: left;
+         }
+.blueright {  background-color: #4682B4;
+        background-position: left top;
+        vertical-align: top;
+        text-align: right;
+         }
+.olddarkblue {  background-color: #003399;
+        background-position: left top;
+        vertical-align: top;
+        text-align: left;
+         }
+.darkblue {  background-color: #000080;
+        background-position: left top;
+        vertical-align: top;
+        text-align: left;
+         }
+.darkblueright {  background-color: #000080;
+        background-position: left top;
+        vertical-align: top;
+        text-align: right;
+         }
+
+td {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 11px;
+        background-position: left top;
+         }
+.black { background-color: #000000;
+        background-position: left top;
+         }
+span.rtname {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 18px;
+        font-weight: normal;
+        color: #ffffff}
+span.title {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 20px;
+        font-weight: bold;
+        color: #ffffff}
+.header {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 12px;
+        font-weight: bold;
+        color: #0066CC}
+.subheader { font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 11px;
+        font-weight: bold;
+        color: #0066CC }
+.value {       font-weight: bold; }
+.entry {       font-weight: normal; }
+.label {       font-weight: normal;
+              text-align: right; }
+.labeltop {       font-weight: normal;
+              text-align: right;
+              vertical-align: top }
+.productnav {  font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 11px;
+        color: #000000;
+        text-align: center;
+        vertical-align: middle;
+        text-decoration: none}
+.rtblue { background-color: #3399FF;
+         margin-top: 0.2em;
+        background-position: left top;
+        vertical-align: top }
+
+
+.currenttab { margin: 0.2em; background: #336699; }
+.othertab { margin: 0.2em; background: #efefef; }
+.oddline { background-color : #ccccee; }
+
+UL.topnav LI :focus { text-decoration: underline; }
+
+TD.mainbody {
+        padding-top: 0.5em;
+        padding-left: 0em;
+        padding-right: 1em;
+        margin-left: 1em;
+        margin-right: 1em;
+}
+
+th.ticketheader { font-size: 80%;
+     font-weight: bold;
+     color: #336699;
+     background: #cccccc; 
+}
+
+th.titlebox {
+        text-align: left;
+        padding-left: 0.5em;
+        padding-right: 0.5em;
+        margin-left: 0.5em;
+        margin-right: 0.5em;
+        border-top: solid black 1px;
+        border-bottom: solid black 1px;
+}    
+th.titleboxright {
+        text-align: right;
+        padding-left: 0.5em;
+        padding-right: 0.5em;
+        margin-left: 0.5em;
+        margin-right: 0.5em;
+        border-top: solid black 1px;
+        border-bottom: solid black 1px;
+}    
+
+TD.titlebox {
+        padding-left: 1em;
+        padding-right: 1em;
+        padding-top: 1em;
+        padding-bottom: 1em;
+}
+
+SPAN.message {
+       font-size: 100%;
+        font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+
+BODY {
+  color: #000;
+  background: #FFFFFF;
+  font-family: "Helvetica", sans-serif;
+  margin-top: 0px;
+  margin-bottom: 0px;
+  margin-left: 0px;
+  margin-right: 0px;
+  border-top: 0px;
+  border-bottom: 0px;
+  border-left: 0px;
+  border-right: 0px;
+}
+
+
+TR.oddline { 
+    background-color : #ffffff;
+}
+
+TR.evenline { 
+    background-color : #ccccee;
+}
+
+H1, H2, H3 { 
+  margin-top: 0.2em;
+  color: #336699;
+  font-family: "Helvetica", sans-serif;
+
+  clear: both;
+}
+
+
+DIV.endmatter { margin-left: -7% }
+.bpscredits {margin-top: 1em;
+             text-align: right; 
+             color: #666666;
+             }
+
+
+A { font-weight: bold; color: #000000;
+            }
+
+.currenttab { color: #ffffff;}
+.othertab { color: #336699; }
+
+.inverse { color: #ffffff; }
+
+
+
+A:link IMG, A:visited IMG { border-style: none }
+a:focus {text-decoration: underline }
+A IMG { color: white } /* The only way to hide the border in NS 4.x */
+
+a:link {  text-decoration: none}
+a:visited {  text-decoration: none}  
+a:hover {  text-decoration: underline}
+/* a:focus { background-color: #ccccee } */
+
+.hide {
+  display: none;
+  color: white;
+}
+
+SPAN.date { font-size: 0.8em }
+
+span.title { font-size: 1.6em;
+            vertical-align: middle;
+             color: #ffffff;}
+span.productname { font-size: 2em;
+             color: #0066cc;}
+SPAN.titleboxtitle {
+        font-size: 1.1em;
+        color: #ffffff;
+        vertical-align: middle;
+        text-align: left;
+        }
+
+SPAN.titleboxright {
+        font-size: 0.8em;
+        color: #ffffff;
+        vertical-align: middle;
+        text-align: right;
+        }
+
+SPAN.attribution {
+  font-weight: bold;
+}
+
+SPAN.label { font-size: 0.8em; 
+}
+
+BLOCKQUOTE {
+  font-style: italic;
+  /* color: #990; */
+}
+
+ADDRESS { 
+  text-align: right;
+  font-weight: bold;
+  font-style: italic 
+}
+
+BLOCKQUOTE P {                 /* Try to avoid space above the attribution */
+  margin-bottom: 0;
+}
+BLOCKQUOTE ADDRESS {
+  margin: 0;
+}
+
+
+.emphasized {
+  font-weight: bold
+}
+
+
+P.map-also { font-style: italic; margin-left: 15%; text-align: right }
+
+.oddline { 
+        background-color : #ccccee;
+}
+
+ul.topnav {
+       list-style: none;
+       margin-left: 0;
+       margin-right: 0.25em;           
+       padding-left: 0.25em;
+       padding-bottom: 0;      
+       padding-top:0;
+       margin-top: 0;
+       margin-bottom:0;
+}
+
+
+<%init>
+$r->content_type('text/css');
+$r->header_out('Expires' ,'+30m');
+</%init>
diff --git a/rt/html/REST/1.0/NoAuth/mail-gateway b/rt/html/REST/1.0/NoAuth/mail-gateway
new file mode 100644 (file)
index 0000000..8db80d5
--- /dev/null
@@ -0,0 +1,49 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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>
+$message
+$queue => 1
+$action => "correspond"
+$ticket => undef
+</%ARGS>
+<%init>
+use RT::Interface::Email; 
+my ( $status, $error, $Ticket ) = RT::Interface::Email::Gateway( %ARGS);
+</%init>
+<%flags>
+inherit => undef # inhibit UTF8 conversion done in /autohandler
+</%flags>
+%    if ($status) {
+ok
+%        if ( $Ticket->Id ) {
+Ticket: <% $Ticket->Id %>
+Queue: <% $Ticket->QueueObj->Name %>
+Owner: <% $Ticket->OwnerObj->Name %>
+Status: <% $Ticket->Status %>
+Subject: <% $Ticket->Subject %>
+Requestor: <% $Ticket->Requestors->MemberEmailAddressesAsString %>
+%        }
+% }   else { 
+not ok - <%$error%> 
+% }
diff --git a/rt/html/Search/Bulk.html b/rt/html/Search/Bulk.html
new file mode 100644 (file)
index 0000000..df43cfa
--- /dev/null
@@ -0,0 +1,217 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("Bulk ticket update") &>
+<& /Elements/Tabs, Title => loc("Bulk ticket update") &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST>
+<TABLE WIDTH=100% border=0 cellpadding=3 CELLSPACING=0>
+<TR>
+<TH><&|/l&>Update</&></TH>
+%foreach my $col (@cols) {
+% my $colalias = $col;
+% $colalias =~ s/(Obj\-\>|)(Name|AsString)//;
+
+<TH><% loc($colalias) %>&nbsp;</TH>
+%}
+</TR>
+
+<%PERL>
+
+my $i;
+
+
+      
+$session{'tickets'}->RedoSearch();
+while (my $Ticket = $session{'tickets'}->Next) {
+ $i++;
+ if ($i % 2) {
+     $bgcolor = "#dddddd";
+ }
+ else {
+     $bgcolor = "#ffffff";
+ }
+      </%PERL>
+<TR bgcolor="<%$bgcolor%>">
+<TD><input type=checkbox name="UpdateTicket<%$Ticket->Id%>" CHECKED></TD>
+%# The ticket view is controlled by config.pm, WebOptions
+%foreach my $col (@cols) {
+<TD>
+% if ($col eq 'id') {
+<A HREF="<% $RT::WebPath%>/Ticket/Display.html?id=<%$Ticket->Id%>"><%$Ticket->Id()%></A>
+% }
+%else {
+<% eval "\$Ticket->$col()" %>&nbsp;
+%}
+</TD>
+%}
+</TR>
+%}
+
+
+
+</TABLE>
+
+<HR>
+
+
+<& /Elements/TitleBoxStart, title => loc('Update selected tickets') &>
+<TABLE>
+<TR>
+<TD VALIGN=TOP>
+<table>
+<tr><td class=label> <&|/l&>Make Owner</&>: </td>
+<td class=value> <& /Elements/SelectOwner, Name => "Owner" &> (<input type=checkbox name="ForceOwnerChange"> <&|/l&>Force change</&>) </td></tr>
+<tr><td class=label> <&|/l&>Add Requestor</&>: </td>
+<td class=value> <INPUT Name="AddRequestor" SIZE=20> </td></tr>
+<tr><td class=label> <&|/l&>Remove Requestor</&>: </td>
+<td class=value> <INPUT Name="DeleteRequestor" SIZE=20> </td></tr>
+<tr><td class=label> <&|/l&>Add Cc</&>: </td>
+<td class=value> <INPUT Name="AddCc" SIZE=20> </td></tr>
+<tr><td class=label> <&|/l&>Remove Cc</&>: </td>
+<td class=value> <INPUT Name="DeleteCc" SIZE=20> </td></tr>
+<tr><td class=label> <&|/l&>Add AdminCc</&>: </td>
+<td class=value> <INPUT Name="AddAdminCc" SIZE=20> </td></tr>
+<tr><td class=label> <&|/l&>Remove AdminCc</&>: </td>
+<td class=value> <INPUT Name="DeleteAdminCc" SIZE=20> </td></tr>
+</table>
+</TD>
+<TD VALIGN=TOP>
+<table>
+<tr><td class=label> <&|/l&>Make subject</&>: </td>
+<td class=value> <INPUT Name="Subject" SIZE=20> </td></tr>
+<tr><td class=label> <&|/l&>Make priority</&>: </td>
+<td class=value> <INPUT Name="Priority" SIZE=4> </td></tr>
+<tr><td class=label> <&|/l&>Make queue</&>: </td>
+<td class=value> <& /Elements/SelectQueue, Name => "Queue" &> </td></tr>
+<tr><td class=label> <&|/l&>Make Status</&>: </td>
+<td class=value> <& /Elements/SelectStatus, Name => "Status" &> </td></tr>
+<tr><td class=label> <&|/l&>Make date Starts</&>: </td>
+<td class=value> <& /Elements/SelectDate, Name => "Starts_Date", ShowTime => 0, Default => '' &> </td></tr>
+<tr><td class=label> <&|/l&>Make date Started</&>: </td>
+<td class=value> <& /Elements/SelectDate, Name => "Started_Date", ShowTime => 0, Default => '' &> </td></tr>
+<tr><td class=label> <&|/l&>Make date Told</&>: </td>
+<td class=value> <& /Elements/SelectDate, Name => "Told_Date", ShowTime => 0, Default => '' &> </td></tr>
+<tr><td class=label> <&|/l&>Make date Due</&>: </td>
+<td class=value> <& /Elements/SelectDate, Name => "Due_Date", ShowTime => 0, Default => '' &> </td></tr>
+<tr><td class=label> <&|/l&>Make date Resolved</&>: </td>
+<td class=value> <& /Elements/SelectDate, Name => "Resolved_Date", ShowTime => 0, Default => '' &> </td></tr>
+</table>
+
+</TD>
+</TR>
+</table>
+<& /Elements/TitleBoxEnd&>
+<& /Elements/TitleBoxStart, title => loc('Add comments or replies to selected tickets') &>
+<table>
+<tr><td align=right><&|/l&>Update Type</&>:</td>
+<td><select name="UpdateType">
+  <option value="private" ><&|/l&>Comments (not sent to requestors)</&></option>
+<option value="response" ><&|/l&>Response to requestors</&></option>
+</select> 
+</td></tr>
+<tr><td align=right><&|/l&>Subject</&>:</td><td> <input name="UpdateSubject" size=60 value=""></td></tr>
+ <tr><td align=right><&|/l&>Attach</&>:</td><td><input name="UpdateAttachment" type="file"></td></tr>
+ <tr><td class=labeltop><&|/l&>Message</&>:</td><td>
+ <& /Elements/MessageBox, Name=>"UpdateContent"&>
+ </td></tr>
+ </table>
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/TitleBoxStart, title => loc('Edit Relationships'), color => "#336633"&>
+<i><&|/l&>Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces.</&></i><br>
+<& /Ticket/Elements/BulkLinks &>
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/Submit &>
+
+
+</FORM>
+<%INIT>
+
+# Iterate through the ARGS hash and remove anything with a null value.
+map ($ARGS{$_} =~ /^$/ && (delete $ARGS{$_}), keys %ARGS);
+
+my ($bgcolor, @results);
+my @cols = qw(id Status Priority Subject QueueObj->Name OwnerObj->Name RequestorAddresses DueAsString );
+
+Abort(loc("No search to operate on.")) unless ($session{'tickets'});
+
+
+my $do_comment_reply=0;
+# Prepare for ticket updates
+$ARGS{'UpdateContent'} =~ s/\r\n/\n/g;
+chomp ($ARGS{'UpdateContent'}) ;
+
+if ($ARGS{'UpdateContent'} &&
+    $ARGS{'UpdateContent'} ne '' &&
+    $ARGS{'UpdateContent'} ne  "-- \n" .
+    $session{'CurrentUser'}->UserObj->Signature) {
+            $do_comment_reply=1;
+}
+
+#Iterate through each ticket we've been handed
+my @linkresults;
+
+while (my $Ticket = $session{'tickets'}->Next) {
+    $RT::Logger->debug( "Checking Ticket ".$Ticket->Id ."\n");
+    next unless ($ARGS{"UpdateTicket".$Ticket->Id});
+    $RT::Logger->debug ("Matched\n");
+    #Update the basics.
+    my @basicresults = ProcessTicketBasics(TicketObj => $Ticket, ARGSRef => \%ARGS);
+    my @dateresults = ProcessTicketDates(TicketObj => $Ticket, ARGSRef => \%ARGS);
+    #Update the watchers
+    my @watchresults = ProcessTicketWatchers(TicketObj => $Ticket, ARGSRef => \%ARGS);    
+
+    #Update the links
+    $ARGS{'id'} = $Ticket;
+    $ARGS{$Ticket->Id.'-MergeInto'} = $ARGS{'Ticket-MergeInto'};
+    $ARGS{$Ticket->Id.'-DependsOn'} = $ARGS{'Ticket-DependsOn'};
+    $ARGS{'DependsOn-'.$Ticket->Id} = $ARGS{'DependsOn-Ticket'};
+    $ARGS{$Ticket->Id.'-MemberOf'} = $ARGS{'Ticket-MemberOf'};
+    $ARGS{'MemberOf-'.$Ticket->Id} = $ARGS{'MemberOf-Ticket'};
+    $ARGS{$Ticket->Id.'-RefersTo'} = $ARGS{'Ticket-RefersTo'};
+    $ARGS{'RefersTo-'.$Ticket->Id} = $ARGS{'RefersTo-Ticket'};
+    @linkresults = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
+    delete $ARGS{'id'};
+    delete $ARGS{$Ticket->Id.'-MergeInto'};
+    delete $ARGS{$Ticket->Id.'-DependsOn'};
+    delete $ARGS{'DependsOn-'.$Ticket->Id};
+    delete $ARGS{$Ticket->Id.'-MemberOf'};
+    delete $ARGS{'MemberOf-'.$Ticket->Id};
+    delete $ARGS{$Ticket->Id.'-RefersTo'};
+    delete $ARGS{'RefersTo-'.$Ticket->Id};
+    
+    my @updateresults; 
+    if ($do_comment_reply) {
+    ProcessUpdateMessage(TicketObj => $Ticket, ARGSRef => \%ARGS, Actions => \@updateresults); 
+   } 
+   my @tempresults = (@watchresults, @basicresults, @dateresults, @updateresults, @linkresults);
+    @tempresults = map { loc("Ticket [_1]: [_2]",$Ticket->Id,$_) } @tempresults;
+
+    @results = (@results, @tempresults);
+}
+
+</%INIT>
diff --git a/rt/html/Search/Elements/PickRestriction b/rt/html/Search/Elements/PickRestriction
new file mode 100644 (file)
index 0000000..a6911df
--- /dev/null
@@ -0,0 +1,141 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<FORM ACTION="Listing.html" METHOD="GET">
+<INPUT TYPE=HIDDEN NAME="Bookmark" VALUE="<% $session{'tickets'}->FreezeLimits()|u %>">
+<& /Elements/TitleBoxStart, title => loc('Refine search')&>
+<INPUT TYPE=HIDDEN NAME="CompileRestriction" VALUE=1>
+
+<ul>
+<li><&|/l&>Owner is</&>  <& /Elements/SelectBoolean, Name => "OwnerOp", 
+                                         TrueVal=> '=', 
+                                         FalseVal => '!=' 
+&> 
+<& /Elements/SelectOwner, Name => "ValueOfOwner" &>
+
+<li>
+<&|/l&>Requestor email address</&> 
+<& /Elements/SelectMatch, Name => "RequestorOp" &>
+<INPUT Name="ValueOfRequestor" SIZE=20>
+
+<li>
+<&|/l&>Subject</&> <& /Elements/SelectMatch, Name => "SubjectOp" &> 
+<INPUT Name="ValueOfSubject" SIZE=20>
+
+<li><&|/l&>Queue</&>  <& /Elements/SelectBoolean,  Name => "QueueOp" , 
+                                       True => loc("is"), 
+                                       False => loc("isn't"), 
+                                       TrueVal=> '=', 
+                                       FalseVal => '!=' &>
+<& /Elements/SelectQueue, Name => loc("ValueOfQueue") &>
+
+
+<li><&|/l&>Priority</&> <& /Elements/SelectEqualityOperator, Name => "PriorityOp" &>
+
+<INPUT Name="ValueOfPriority" SIZE=5>
+
+<li>
+<& /Elements/SelectDateType, Name => 'DateType' &>
+<& /Elements/SelectDateRelation, Name=>"DateOp" &>
+<& /Elements/SelectDate, Name => "ValueOfDate", ShowTime => 0, Default => '' &>
+
+<li><&|/l&>Ticket attachment</&> 
+
+<& /Elements/SelectAttachmentField, Name => 'AttachmentField' &>
+<& /Elements/SelectBoolean, Name => "AttachmentFieldOp", 
+                           True => loc("matches"), 
+                           False => loc("does not match"), 
+                           TrueVal => 'LIKE', 
+                           FalseVal => 'NOT LIKE' 
+&> 
+<Input Name="ValueOfAttachmentField" Size=20>
+
+<li><&|/l&>Status</&> 
+<& /Elements/SelectBoolean, Name => "StatusOp", 
+                           True => loc("is"), 
+                           False => loc("isn't"), 
+                           TrueVal=> '=', 
+                           FalseVal => '!=' 
+&>  
+<& /Elements/SelectStatus, Name => "ValueOfStatus" &>
+
+
+% while ( my $CustomField = $CustomFields->Next ) {
+
+<li><% $CustomField->Name %> 
+        <& /Elements/SelectCustomFieldOperator, Name => "CustomFieldOp". $CustomField->id, 
+                                    True => loc("is"), 
+                                    False => loc("isn't"), 
+                                    TrueVal=> '=', FalseVal => '!=' &>
+
+<& /Elements/SelectCustomFieldValue, Name => "CustomField".$CustomField->id,
+                            CustomField => $CustomField,
+                            &>
+% }
+
+</UL>
+
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/TitleBoxStart, title => loc('Ordering and sorting')&>
+
+<UL>
+
+<li><&|/l&>Results per page</&> <& /Elements/SelectResultsPerPage, Name => "RowsPerPage", 
+                                                       Default => $session{'tickets_rows_per_page'} || '50'
+&>
+
+<li><&|/l&>Sort results by</&> <& /Elements/SelectTicketSortBy, Name => "TicketsSortBy", 
+                                                    Default => $session{'tickets_sort_by'} 
+&> 
+<& /Elements/SelectSortOrder, Name => 'TicketsSortOrder', Default => $session{'tickets_sort_order'} &>
+
+<li><input type="checkbox" name="HideResults" <%$ARGS{'HideResults'} && 'CHECKED'%>> <&|/l&>Don't show search results</&>
+<li><& /Elements/Refresh, Name => 'RefreshSearchInterval' , Default => $session{'tickets_refresh_interval'} &>
+
+</UL>
+
+
+</DIV>
+
+
+
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/Submit, Label => loc('Search'), Name => 'Action'&>
+
+</FORM>
+
+
+ <%INIT>
+my $CustomFields = RT::CustomFields->new( $session{'CurrentUser'});
+ foreach ( $session{'tickets'}->RestrictionValues('Queue') ) {
+        # Gotta load up the $queue object, since queues get stored by name now.
+        my $queue = RT::Queue->new($session{'CurrentUser'});
+        $queue->Load($_);
+        $CustomFields->LimitToQueue($queue->Id);
+ }
+
+ $CustomFields->LimitToGlobal();
+
+</%INIT>
diff --git a/rt/html/Search/Elements/TicketHeader b/rt/html/Search/Elements/TicketHeader
new file mode 100644 (file)
index 0000000..ed2f60e
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TR>
+<& TicketHeaderCell , Attribute => 'id', Header => '#'&>
+<& TicketHeaderCell , Attribute => 'Subject'&>
+<& TicketHeaderCell , Attribute => 'Status'&>
+<& TicketHeaderCell , Attribute => 'Queue'&>
+<& TicketHeaderCell , Attribute => 'Owner'&>
+<& TicketHeaderCell , Attribute => 'Priority'&>
+</TR>
+<TR>
+<TH class="ticketheader">&nbsp;</TH>
+<& TicketHeaderCell , Attribute => 'Requestor(s)'&>
+<& TicketHeaderCell , Attribute => 'Created'&>
+<& TicketHeaderCell , Attribute => 'Told', Header => 'Last Contact'&>
+<& TicketHeaderCell , Attribute => 'LastUpdated', Header => 'Last Updated'&>
+<& TicketHeaderCell , Attribute => 'TimeLeft', Header => 'Left'&>
+</TR>
+%# loc('Last Notified');
diff --git a/rt/html/Search/Elements/TicketHeaderCell b/rt/html/Search/Elements/TicketHeaderCell
new file mode 100644 (file)
index 0000000..5def9ea
--- /dev/null
@@ -0,0 +1,55 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%INIT> 
+my ($order,$curorder);
+ $Attribute =~ s/Obj->(Name|AsString|AgeAsString)//g;
+  if ($session{'tickets_sort_order'} =~ /^asc$/i) {
+   $order = 'DESC';
+   $curorder = 'ASC';
+ } else {
+   $order = 'ASC';
+   $curorder = 'DESC';
+ }
+$Header = $Attribute unless ($Header);
+
+</%INIT>
+<th class="ticketheader">
+% if (grep (/^$Attribute$/i, $session{'tickets'}->SortFields)) {
+<A 
+% if ($Attribute eq $session{'tickets_sort_by'}) {
+class="currenttab"
+HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$Attribute%>&TicketsSortOrder=<%$order%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>">
+% } else {
+HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$Attribute%>&TicketsSortOrder=<%$curorder%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>">
+% }
+<% loc($Header) %>
+</A>
+% } else {
+<% loc($Header) %>
+% }
+</th>
+<%ARGS>
+$Header => undef
+$Attribute => undef 
+</%ARGS>
diff --git a/rt/html/Search/Elements/TicketRow b/rt/html/Search/Elements/TicketRow
new file mode 100644 (file)
index 0000000..5d1ad20
--- /dev/null
@@ -0,0 +1,55 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<SPAN class="search">
+<TR
+% if ($i%2) {
+CLASS="oddline"
+% } else {
+CLASS="evenline"
+% }
+>
+<TD ROWSPAN="2"><B><A HREF="<%$RT::WebPath%>/Ticket/Display.html?id=<%$Ticket->Id%>"><%$Ticket->id%></a></B></TD>
+<TD><B><A HREF="<%$RT::WebPath%>/Ticket/Display.html?id=<%$Ticket->Id%>"><%$Ticket->Subject%></a></B></TD>
+<TD><%loc($Ticket->Status)%></TD>
+<TD><%$Ticket->QueueObj->Name%></TD>
+<TD><%$Ticket->Owner == $RT::Nobody->Id ? loc('Nobody') : $Ticket->OwnerObj->Name%></TD>
+<TD><%$Ticket->Priority%></TD>
+</TR>
+<TR
+% if ($i%2) {
+CLASS="oddline"
+% } else {
+CLASS="evenline"
+% }
+><TD><small><%$Ticket->Requestors->MemberEmailAddressesAsString%></small></TD>
+<TD><SMALL><%$Ticket->CreatedObj->AgeAsString || '-'%></SMALL></TD>
+<TD><SMALL><%$Ticket->ToldObj->AgeAsString || '-'%></SMALL></TD>
+<TD><SMALL><%$Ticket->LastUpdatedObj->AgeAsString || '-'%></SMALL></TD>
+<TD><SMALL><%$Ticket->TimeLeft%></SMALL></TD>
+</TR>
+</SPAN>
+<%ARGS>
+$Ticket => undef
+$i => undef
+</%ARGS>
diff --git a/rt/html/Search/Listing.html b/rt/html/Search/Listing.html
new file mode 100644 (file)
index 0000000..5085345
--- /dev/null
@@ -0,0 +1,112 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => $title, Refresh => $session{'tickets_refresh_interval'} &>
+<& /Ticket/Elements/Tabs, 
+    current_tab => 'Search/Listing.html', 
+    Title => $title &>
+
+%if ($ticketcount && !  $ARGS{'HideResults'}) {
+<TABLE WIDTH=100% border=0 cellpadding=2 CELLSPACING=0>
+<& Elements/TicketHeader, %ARGS &>
+% my $i;
+%while (my $Ticket = $session{'tickets'}->Next) {
+% $i++;
+<& Elements/TicketRow, Ticket => $Ticket, i=> $i, %ARGS &>
+%}
+</TABLE>
+<div align=center>
+<font size=2>
+<a href="Listing.html?GotoPage=1"><&|/l&>First page</&></a>
+&nbsp;&nbsp;
+%  if ( $session{'tickets'}->FirstRow >= $session{'tickets_rows_per_page'}-1 ) {
+<a href="Listing.html?GotoPage=Prev">&lt;<&|/l&>Previous page</&></a>
+&nbsp;&nbsp;
+%  }                                                                           
+%  if ( $session{'tickets'}->FirstRow + $session{'tickets_rows_per_page'} < $ticketcount ) {                                                               
+<a href="Listing.html?GotoPage=Next"><&|/l&>Next page</&>&gt;</a>
+%  }
+%#&nbsp;&nbsp;<form method=get action="Listing.html"><&|/l&>Goto page</&> <input name=GotoPage size=2></form>
+</font>
+</div>
+<!--<div align=right>-->
+<table width="100%" border=0 cellpadding=3 CELLSPACING=1>
+<tr>
+<td align=left>
+(<&|/l, ($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ) &>[_1] - [_2] shown</&>)
+</td>
+<td align=right>
+
+<a href="Bulk.html"><&|/l&>Update all these tickets at once</&></a>
+<!--</div>-->
+</td>
+</tr>
+</table>
+
+% }
+<TABLE WIDTH="100%">
+<TR>
+<TD VALIGN="TOP">
+<& /Elements/TitleBoxStart, title => loc('Current search criteria')&>
+
+%my %restrictions=$session{'tickets'}->DescribeRestrictions();
+%foreach my $row (keys %restrictions){
+<%$restrictions{"$row"}%> <A HREF="<% $RT::WebPath %>/Search/Listing.html?DeleteRestriction=<%$row%>">[<&|/l&>delete</&>]</a><br>
+%}
+<BR>
+<BR>
+<A HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$session{'tickets_sort_by'}%>&TicketsSortOrder=<%$session{'tickets_sort_order'}%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>"><&|/l&>Bookmarkable URL for this search</&></a>
+<& /Elements/TitleBoxEnd&>
+</TD>
+<TD>
+
+<& Elements/PickRestriction, %ARGS &>
+
+</TD>
+</TR>
+</TABLE>
+
+<%INIT>
+
+my ($title, $ticketcount);
+$session{'i'}++;
+if ($session{'tickets'}) {
+    if ($ARGS{'DeleteRestriction'}) {
+           $session{'tickets'}->DeleteRestriction($ARGS{'DeleteRestriction'});
+    }
+    if ( ($ARGS{'ClearRestrictions'}) || ($ARGS{'NewSearch'}) ) {
+           $session{'tickets'}->ClearRestrictions;
+       }       
+}
+   ProcessSearchQuery(ARGS=>\%ARGS);
+   $session{'tickets'}->RedoSearch();
+   if ( $session{'tickets'}->DescribeRestrictions()) {
+       $ticketcount = $session{tickets}->CountAll();
+        $title = loc('Found [quant,_1,ticket]', $ticketcount);
+    } else {
+        $title = loc("Find tickets");
+   }
+</%INIT>
+<%CLEANUP>
+$session{'tickets'}->PrepForSerialization();
+</%CLEANUP>
diff --git a/rt/html/SelfService/Attachment/dhandler b/rt/html/SelfService/Attachment/dhandler
new file mode 100644 (file)
index 0000000..4bebbe5
--- /dev/null
@@ -0,0 +1,27 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%init>
+$m->comp('/Ticket/Attachment/dhandler', %ARGS);
+$m->abort;
+</%init>
diff --git a/rt/html/SelfService/Closed.html b/rt/html/SelfService/Closed.html
new file mode 100644 (file)
index 0000000..b9b2ac6
--- /dev/null
@@ -0,0 +1,27 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /SelfService/Elements/Header, Title => loc('Closed Tickets') &>
+
+<& /SelfService/Elements/MyRequests, status => ['rejected', 'resolved'], friendly_status =>
+loc('closed') &>
diff --git a/rt/html/SelfService/Create.html b/rt/html/SelfService/Create.html
new file mode 100644 (file)
index 0000000..7bbc88a
--- /dev/null
@@ -0,0 +1,80 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& Elements/Header, Title => loc("Create a ticket") &>
+
+<FORM ACTION="Display.html" METHOD="POST" ENCTYPE="multipart/form-data">
+<INPUT TYPE=HIDDEN Name="id" VALUE="new">
+
+<TABLE>
+<TR>
+<TD>
+<&|/l&>Queue</&>:
+</TD>
+<TD>
+<& /Elements/SelectNewTicketQueue, Verbose => 'True' &>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Requestors</&>:
+</TD>
+<TD>
+<INPUT Name="Requestors" Value="<%$session{CurrentUser}->EmailAddress%>" SIZE=20>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Cc</&>:
+</TD>
+<TD>
+ <INPUT NAME="Cc" SIZE=20>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Subject</&>:
+</TD>
+<TD>
+<INPUT Name="Subject" SIZE=60 MAXSIZE=100 value="">
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Attach file</&>:
+</TD>
+<TD>
+<INPUT Name="Attach" type=file>
+</TD>
+</TR>
+<TR>
+<TD COLSPAN=2>
+<&|/l&>Describe the issue below</&>:<br>
+<& /Elements/MessageBox &>
+</TD>
+</TR>
+</TABLE>
+<& /Elements/Submit, Label => loc("Create ticket")&>
+
+
+</FORM>
diff --git a/rt/html/SelfService/Display.html b/rt/html/SelfService/Display.html
new file mode 100644 (file)
index 0000000..fc3fcb2
--- /dev/null
@@ -0,0 +1,141 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /SelfService/Elements/Header, Title => loc('#[_1]: [_2]', $Ticket->id, $Ticket->Subject) &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+  <TABLE WIDTH="100%" class="ticketsummary" >
+      <TR>
+        <TD VALIGN=TOP WIDTH="50%">
+          <& /Elements/TitleBoxStart, title => loc('The Basics'), 
+                title_class=> 'inverse',  
+                color => "#993333" &>
+                <& /Ticket/Elements/ShowBasics, Ticket => $Ticket &>
+          <& /Elements/TitleBoxEnd &>
+</TD>
+        <TD VALIGN=TOP WIDTH="50%">
+          <& /Elements/TitleBoxStart, title => loc("Dates"),
+                title_class=> 'inverse',
+                 color => "#663366" &>
+          <& /Ticket/Elements/ShowDates, Ticket => $Ticket &>
+          <& /Elements/TitleBoxEnd &>
+</TD>
+</TR>
+</TABLE>
+
+
+
+<& /Ticket/Elements/ShowHistory, Ticket => $Ticket&>
+
+
+
+<%INIT>
+
+my ( $field, @results );
+
+# {{{ Load the ticket
+#If we get handed two ids, mason will make them an array. bleck.
+# We want teh first one. Just because there's no other sensible way
+# to deal
+my @id = ( ref $id eq 'ARRAY' ) ? @{$id} : ($id);
+
+my $Ticket = new RT::Ticket( $session{'CurrentUser'} );
+if ( $id[0] eq 'new' ) {
+
+    # {{{ Create a new ticket
+
+    my $Queue = new RT::Queue( $session{'CurrentUser'} );
+    unless ( $Queue->Load( $ARGS{'Queue'} ) ) {
+        $m->comp( 'Error.html', Why => loc('Queue not found') );
+        $m->abort;
+    }
+
+    unless ( $Queue->CurrentUserHasRight('CreateTicket') ) {
+        $m->comp( 'Error.html',
+             Why =>
+               loc('You have no permission to create tickets in that queue.') );
+        $m->abort;
+    }
+
+    my @Requestors = split ( /\s*,\s*/, $ARGS{'Requestors'} );
+    my @Cc         = split ( /\s*,\s*/, $ARGS{'Cc'} );
+
+    my $MIMEObj = MakeMIMEEntity( Subject             => $ARGS{'Subject'},
+                                  From                => $ARGS{'From'},
+                                  Cc                  => $ARGS{'Cc'},
+                                  Body                => $ARGS{'Content'},
+                                  AttachmentFieldName => 'Attach' );
+
+    #TODO in Create_Details.html: priorities and due-date
+    my ( $id, $Trans, $ErrMsg ) = $Ticket->Create( Queue     => $ARGS{Queue},
+                                                   Requestor => \@Requestors,
+                                                   Cc        => \@Cc,
+                                                   Subject   => $ARGS{Subject},
+                                                   MIMEObj   => $MIMEObj );
+    unless ( $id && $Trans ) {
+        $m->comp( 'Error.html', Why => $ErrMsg );
+        $m->abort();
+    }
+
+    push ( @results, $ErrMsg );
+
+    # }}}
+}
+else {
+    unless ( $Ticket->Load( $id[0] ) ) {
+        $m->comp( 'Error.html',
+                  Why => loc( "Couldn't load ticket '[_1]'", $id ) );
+        $m->abort();
+    }
+}
+
+# }}}
+
+unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
+    $m->comp( 'Error.html',
+              Why => loc("No permission to display that ticket") );
+    $m->abort();
+}
+
+my ( $code, $msg );
+
+#Update the status
+if (     ( defined $ARGS{'Status'} )
+     and ( $ARGS{'Status'} ne $Ticket->Status ) ) {
+    ( $code, $msg ) = $Ticket->SetStatus( $ARGS{'Status'} );
+    push @results, "$msg";
+}
+
+ProcessUpdateMessage( ARGSRef   => \%ARGS,
+                      Actions   => \@results,
+                      TicketObj => $Ticket );
+
+my $Transactions = $Ticket->Transactions;
+
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/SelfService/Elements/GotoTicket b/rt/html/SelfService/Elements/GotoTicket
new file mode 100644 (file)
index 0000000..71da8c1
--- /dev/null
@@ -0,0 +1,24 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<FORM ACTION="<%$RT::WebPath%>/SelfService/Display.html"><input type=submit value="<&|/l&>Goto ticket</&>">&nbsp;<input size=4 name=id></FORM>
diff --git a/rt/html/SelfService/Elements/Header b/rt/html/SelfService/Elements/Header
new file mode 100644 (file)
index 0000000..6ad1379
--- /dev/null
@@ -0,0 +1,25 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, %ARGS, Prefs => '/SelfService/Prefs.html' &>
+<& /SelfService/Elements/Tabs, %ARGS &>
diff --git a/rt/html/SelfService/Elements/MyRequests b/rt/html/SelfService/Elements/MyRequests
new file mode 100644 (file)
index 0000000..95ede08
--- /dev/null
@@ -0,0 +1,62 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/TitleBoxStart, title =>  $title &>
+<TABLE BORDER=0 cellspacing=1 cellpadding=1 BGCOLOR="#eeeeee" WIDTH=100%>
+<TR>
+<TH><&|/l&>Subject</&></TH>
+<TH><&|/l&>Status</&></TH>
+<TH><&|/l&>Owner</&></TH>
+</TR>
+<TR>
+% while (my $Ticket = $MyTickets->Next) {
+<TR>
+<TD>
+<a href="<%$RT::WebPath%>/SelfService/Display.html?id=<%$Ticket->Id%>"><%$Ticket->Id%>: <%$Ticket->Subject%></a>
+</TD>
+<TD>
+<%$Ticket->Status%>
+</TD><TD>
+<%$Ticket->OwnerObj->Name%>
+</TR>
+% }
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+
+
+<%INIT>
+$title ||= loc("My [_1] tickets", $friendly_status);
+my $MyTickets;
+$MyTickets = new RT::Tickets ($session{'CurrentUser'});
+$MyTickets->LimitWatcher(TYPE => 'Requestor', VALUE => $session{'CurrentUser'}->EmailAddress);
+
+foreach my $status (@status) {
+
+        $MyTickets->LimitStatus(VALUE => $status);
+}
+</%INIT>
+<%ARGS>
+$title => undef
+$friendly_status => loc('open')
+@status => ('open', 'new', 'stalled')
+</%ARGS>
diff --git a/rt/html/SelfService/Elements/Tabs b/rt/html/SelfService/Elements/Tabs
new file mode 100644 (file)
index 0000000..efab866
--- /dev/null
@@ -0,0 +1,64 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/PageLayout,
+    current_toptab => $current_toptab,
+    current_tab => $current_tab,
+    toptabs => $tabs,
+    topactions => $actions,
+    title => $Title
+&>
+<a name="skipnav" id="skipnav" accesskey="8"></a>
+<%INIT>
+
+if ($Title) {
+$Title = loc ("RT Self Service") . " / " . $Title;
+} else {
+$Title = loc ("RT Self Service");
+
+}
+my ($tab);
+my $tabs = { A  => { title => loc('Open tickets'),
+                        path => 'SelfService/',
+                      },
+             B => { title => loc('Closed tickets'),
+                         path => 'SelfService/Closed.html',
+                       },
+             C => { title => loc('New ticket'),
+                    path => 'SelfService/Create.html'
+                    },
+             Z => { title => loc('Preferences'),
+                    path => 'SelfService/Prefs.html'
+                    }
+           };
+my $actions = {
+       B => { html => $m->scomp('GotoTicket') 
+               }
+       };
+</%INIT>
+<%ARGS>
+$Title => undef
+$current_toptab => undef
+$current_tab => undef
+</%ARGS>
+
diff --git a/rt/html/SelfService/Error.html b/rt/html/SelfService/Error.html
new file mode 100644 (file)
index 0000000..ac93ace
--- /dev/null
@@ -0,0 +1,46 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /SelfService/Elements/Header, Title => loc('Error') &>
+<h2 class="title"><%loc('Error')%></h2>
+<& /Elements/TitleBoxStart, title => $Title &>
+<%$Why%>
+<br>
+<font size=-1>
+<%$Details%>
+</font>
+<& /Elements/TitleBoxEnd &>
+</body>
+</HTML>
+
+
+<%args>
+$Code => undef
+$Details => undef
+$Title => loc("RT Error")
+$Why => loc("the calling component did not specify why")
+</%args>
+
+<%INIT>
+$RT::Logger->error("WebRT: $Why ($Details)");
+</%INIT>
diff --git a/rt/html/SelfService/Prefs.html b/rt/html/SelfService/Prefs.html
new file mode 100644 (file)
index 0000000..3bbb9b9
--- /dev/null
@@ -0,0 +1,68 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /SelfService/Elements/Header, Title => loc('Preferences') &>
+
+<& /Elements/ListActions, actions => \@results &>
+<form method=post>
+
+% unless ($RT::WebExternalAuth and !$RT::WebFallbackToInternalAuth) {
+<& /Elements/TitleBoxStart, title => loc('Change password')  &>
+<&|/l&>New password</&>: <input type=password name="NewPass1" size=16>
+<&|/l&>Confirm</&>: <input type=password name="NewPass2" size=16>
+<& /Elements/TitleBoxEnd &>
+<BR>
+% }
+<& /Elements/Submit &>
+         </form>
+
+
+<%INIT>
+my @results;
+
+if ($NewPass1) {
+    if ($NewPass1 ne $NewPass2) {
+       push (@results, "Passwords did not match.");
+    }  
+    else {
+       my ($val, $msg)=$session{'CurrentUser'}->UserObj->SetPassword($NewPass1);
+       push (@results, "Password: ".$msg);
+    }  
+}
+if ($Signature) {
+    $Signature =~ s/(\r\n|\r)/\n/g;
+    if ($Signature ne $session{'CurrentUser'}->UserObj->Signature) {
+       my ($val, $msg)=$session{'CurrentUser'}->UserObj->SetSignature($Signature);
+       push (@results, "Signature: ".$msg);
+    }
+}
+#A hack to make sure that session gets rewritten.
+
+$session{'i'}++;
+</%INIT>
+
+<%ARGS>
+$Signature => undef
+$NewPass1 => undef
+$NewPass2 => undef
+</%ARGS>
diff --git a/rt/html/SelfService/Update.html b/rt/html/SelfService/Update.html
new file mode 100644 (file)
index 0000000..9ff3177
--- /dev/null
@@ -0,0 +1,61 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /SelfService/Elements/Header, Title =>loc('Update ticket #[_1]', $Ticket->id) &>
+
+
+<FORM ACTION="Display.html" METHOD=POST ENCTYPE="multipart/form-data">
+<input type=hidden name="UpdateType" value="response">
+
+<&|/l&>Status</&>: <& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &><br>
+<&|/l&>Subject</&>: <input name="UpdateSubject" size=60 value="Re: <% $Ticket->Subject %>"> <br>
+<&|/l&>Attach</&>: <input name="UpdateAttachment" type=file><br>
+<& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &>
+               <INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"><br>
+
+
+<& /Elements/Submit &>
+  </FORM>
+
+
+
+<%INIT>
+
+my $Ticket = LoadTicket($id);
+
+my $title = loc("Update ticket #[_1]", $Ticket->id);
+
+$DefaultStatus = $Ticket->Status() unless ($DefaultStatus);
+
+
+Abort(loc("No permission to view update ticket")) 
+       unless ( $Ticket->CurrentUserHasRight('ReplyToTicket') or
+                     $Ticket->CurrentUserHasRight('ModifyTicket') ); 
+
+</%INIT>
+
+<%ARGS>
+$id => undef
+$Action => undef
+$DefaultStatus => undef
+</%ARGS>
diff --git a/rt/html/SelfService/index.html b/rt/html/SelfService/index.html
new file mode 100644 (file)
index 0000000..71dc115
--- /dev/null
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /SelfService/Elements/Header, Title => undef &>
+
+<& /SelfService/Elements/MyRequests &>
diff --git a/rt/html/Ticket/Attachment/dhandler b/rt/html/Ticket/Attachment/dhandler
new file mode 100644 (file)
index 0000000..e0f00f5
--- /dev/null
@@ -0,0 +1,68 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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>
+     my ($ticket, $trans,$attach, $filename);
+     my $arg = $m->dhandler_arg;                # get rest of path
+     if ($arg =~ '^(\d+)/(\d+)') {
+        $trans = $1;
+        $attach = $2;
+     }
+    else {
+        Abort("Corrupted attachment URL.");
+        }
+     my $AttachmentObj = new RT::Attachment($session{'CurrentUser'});
+     $AttachmentObj->Load($attach) || Abort("Attachment '$attach' could not be loaded");
+
+
+     unless ($AttachmentObj->id) {
+        Abort("Bad attachment id. Couldn't find attachment '$attach'\n");
+    }
+     unless ($AttachmentObj->TransactionId() == $trans ) {
+        Abort("Bad transaction number for attachment. $trans should be".$AttachmentObj->TransactionId() ."\n");
+
+     }
+
+     my $content_type = $AttachmentObj->ContentType || 'text/plain';
+        
+     unless ($RT::TrustHTMLAttachments) {
+         $content_type = 'text/plain' if ($content_type =~ /^text\/html/i);
+     }
+
+     if (my $enc = $AttachmentObj->OriginalEncoding) {
+       # normalize Encode.pm convention with IANA ones
+        $enc = 'big5'  if $enc eq 'big5-eten';
+        $enc = 'utf-8' if $enc eq 'utf8';
+       $content_type .= ";charset=$enc";
+     }
+
+     # unless ($RT::TrustMIMEAttachments) {
+     #     $content_type = 'application/octet-stream';
+     # }
+
+     $r->content_type( $content_type );
+     $m->clear_buffer();
+     $m->out($AttachmentObj->OriginalContent);
+     $m->abort; 
+</%perl>
+
diff --git a/rt/html/Ticket/Create.html b/rt/html/Ticket/Create.html
new file mode 100644 (file)
index 0000000..5b8c908
--- /dev/null
@@ -0,0 +1,257 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("Create a new ticket") &>
+<& /Elements/Tabs, 
+    current_toptab => "Ticket/Create.html", 
+    Title => loc("Create a new ticket") &>
+<FORM ACTION="<%$RT::WebPath%>/Ticket/Create.html" METHOD="POST" ENCTYPE="multipart/form-data">
+<INPUT TYPE=HIDDEN Name="id" VALUE="new">
+<A NAME="top">
+       
+       
+[<a class="currenttab"><&|/l&>Show basics</&></a>] [<A HREF="#detail"><&|/l&>Show details</&></a>]
+<BR>
+<& /Elements/TitleBoxStart, contentbg => "#cccccc", title => loc("Create a new ticket") &>
+<TABLE border=0 cellpadding=0 cellspacing=0>
+<TR><TD><&|/l&>Queue</&></TD>
+<TD><% $QueueObj->Name %>
+<INPUT TYPE=HIDDEN NAME=Queue Value="<%$QueueObj->Name%>">
+</TD>
+<TD><&|/l&>Status</&>:
+</TD>
+<TD>
+<& /Elements/SelectStatus, Name => "Status", Default => $ARGS{Status}||'new' &>
+</TD>
+<TD>
+<&|/l&>Owner</&>:
+</TD>
+<TD>
+<& /Elements/SelectOwner, Name => "Owner", QueueObj => $QueueObj, Default => $ARGS{Owner}||undef &>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Requestors</&>:
+</TD>
+<TD COLSPAN=5>
+<INPUT Name="Requestors" Value="<% ($ARGS{Requestors}) || $session{CurrentUser}->EmailAddress %>" SIZE=40>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Cc</&>:
+</TD>
+<TD COLSPAN=5>
+<INPUT NAME="Cc" SIZE=40<% $ARGS{Cc} && " VALUE=\"$ARGS{Cc}\""%>><BR>
+<i><font size=-2>
+<&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)</&></font></i>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Admin Cc</&>:
+</TD>
+<TD COLSPAN=5>
+<INPUT NAME="AdminCc" SIZE=40<% $ARGS{AdminCc} && " VALUE=\"$ARGS{AdminCc}\""%>><BR>
+<i><font size=-2>
+<&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)</&></font></i>
+</TD>
+</TR>
+<TR>
+<TD>
+<&|/l&>Subject</&>:
+</TD>
+<TD COLSPAN=5>
+<INPUT Name="Subject" SIZE=60 MAXSIZE=100 value="<%$ARGS{Subject} || ''%>">
+</TD>
+</TR>
+<TR>
+<TD COLSPAN=6>
+<& /Ticket/Elements/EditCustomFields, QueueObj => $QueueObj &>
+</TD>
+</TR>
+<TR>
+% if (exists $session{'Attachments'}) {
+<TD>
+<&|/l&>Attached file</&>:
+</TD>
+<TD COLSPAN=5>
+<&|/l&>Check box to delete</&><BR>
+% foreach my $attach_name (keys %{$session{'Attachments'}}) {
+<input type="checkbox" name="DeleteAttach-<%$attach_name%>"><%$attach_name%><BR>
+% } # end of foreach
+</TD>
+</TR>
+<TR>
+% } # end of if
+<TD>
+<&|/l&>Attach file</&>:
+</TD>
+<TD COLSPAN=5>
+<INPUT TYPE=FILE NAME="Attach">
+<INPUT TYPE=SUBMIT NAME="AddMoreAttach" VALUE="<&|/l&>Add More Files</&>">
+</TD>
+</TR>
+<TR>
+<TD COLSPAN=6>
+<&|/l&>Describe the issue below</&>:<br>
+% if (exists $ARGS{Content}) {
+<& /Elements/MessageBox, Default => $ARGS{Content} &>
+% } else {
+<& /Elements/MessageBox, QuoteTransaction => $QuoteTransaction &>
+%}
+
+<BR>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT COLSPAN=2>
+</TD>
+</TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, Label => loc("Create")&>
+
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+
+<A NAME="detail">
+       [<A HREF="#top"><&|/l&>Show basics</&></a>] [<a class="currenttab"><&|/l&>Show details</&></a>]
+<BR>
+<TABLE WIDTH="100%" BORDER=0>
+<TR>
+<TD WIDTH="50%" VALIGN=TOP>
+
+         <& /Elements/TitleBoxStart, title => loc('The Basics'), 
+               title_class=> 'inverse',  
+               color => "#993333" &>
+<TABLE BORDER=0>
+<TR><TD ALIGN=RIGHT><&|/l&>Priority</&>:</TD><TD><input size=3 name="InitialPriority" value="<% $ARGS{InitialPriority} ? $ARGS{InitialPriority} : $QueueObj->InitialPriority %>"></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Final Priority</&>:</TD><TD><input size=3 name="FinalPriority" value="<% $ARGS{FinalPriority} ? $ARGS{FinalPriority} : $QueueObj->FinalPriority %>"></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Time Worked</&>:</TD><TD><input size=3 name="TimeWorked"<% $ARGS{TimeWorked} && " VALUE=\"$ARGS{TimeWorked}\""  %>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Time Left</&>:</TD><TD><input size=3 name="TimeLeft"<% $ARGS{TimeLeft} && " VALUE=\"$ARGS{TimeLeft}\"" %>></TD></TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<br>
+<& /Elements/TitleBoxStart, title => loc("Dates"),
+               title_class=> 'inverse',  
+                color => "#663366" &>
+
+<TABLE BORDER=0>
+<TR><TD ALIGN=RIGHT><&|/l&>Starts</&>:</TD><TD><input size=10 name="Starts"<% $ARGS{Starts} && " VALUE=\"$ARGS{Starts}\"" %>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Due</&>:</TD><TD><input size=10 name="Due"<% $ARGS{Due} && " VALUE=\"$ARGS{Due}\"" %>></TD></TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<BR>
+</TD>
+
+<TD VALIGN="TOP">
+<& /Elements/TitleBoxStart, title => loc('Relationships'), 
+       title_class=> 'inverse',  
+       titleright => '', color=> "#336633" &>
+
+<i><&|/l&>(Enter ticket ids or URLs, seperated with spaces)</&></i>
+<TABLE BORDER=0>
+<TR><TD ALIGN=RIGHT><&|/l&>Depends on</&></TD><TD><input size=10 name="new-DependsOn"<% $ARGS{'new-DependsOn'} && " VALUE=\"$ARGS{'new-DependsOn'}\""%>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Depended on by</&></TD><TD><input size=10 name="DependsOn-new"<% $ARGS{'DependsOn-new'} && " VALUE=\"$ARGS{'DependsOn-new'}\"" %>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Parents</&></TD><TD><input size=10 name="new-MemberOf"<% $ARGS{'new-MemberOf'} && " VALUE=\"$ARGS{'new-MemberOf'}\"" %>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Children</&></TD><TD><input size=10 name="MemberOf-new" <% $ARGS{'MemberOf-new'} && " VALUE=\"$ARGS{'MemberOf-new'}\"" %>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Refers to</&></TD><TD><input size=10 name="new-RefersTo"<% $ARGS{'new-RefersTo'} && " VALUE=\"$ARGS{'new-MemberOf'}\"" %>></TD></TR>
+<TR><TD ALIGN=RIGHT><&|/l&>Referred to by</&></TD><TD><input size=10 name="RefersTo-new"<% $ARGS{'RefersTo-new'} && " VALUE=\"$ARGS{'RefersTo-new'}\"" %>></TD></TR>
+
+
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<BR>
+
+</TD>
+</TR>
+</TABLE>
+<& /Elements/Submit, Label => loc("Create") &>
+</FORM>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+
+<%INIT>
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($Queue) || Abort(loc("Queue could not be loaded."));
+my $CFs = $QueueObj->CustomFields();
+
+# {{{ deal with deleting uploaded attachments
+foreach my $key (keys %ARGS) {
+    if ($key =~ m/^DeleteAttach-(.+)$/) {
+       delete $session{'Attachments'}{$1};
+    }
+    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
+}
+
+# {{{ 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 };
+}
+# }}}
+
+# delete temporary storage entry to make WebUI clean
+unless (keys %{$session{'Attachments'}} and $ARGS{'id'} eq 'new') {
+    delete $session{'Attachments'};
+}
+
+
+# }}}
+
+if ((!exists $ARGS{'AddMoreAttach'}) && ($ARGS{'id'} eq 'new')) { # new ticket?
+    $m->comp('Display.html', %ARGS);
+    $m->abort();
+}
+</%INIT>
+
+<%ARGS>
+$DependsOn => undef
+$DependedOnBy => undef
+$MemberOf => undef
+$QuoteTransaction => undef
+$Queue => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Display.html b/rt/html/Ticket/Display.html
new file mode 100644 (file)
index 0000000..cf32dce
--- /dev/null
@@ -0,0 +1,116 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, 
+    Title => loc("#[_1]: [_2]", $Ticket->Id, $Ticket->Subject) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $Ticket, 
+    current_tab => 'Ticket/Display.html?id='.$Ticket->id,
+    Title => loc("#[_1]: [_2]", $Ticket->Id, $Ticket->Subject) &>
+
+<& /Elements/ListActions, actions => \@Actions &>
+
+<& /Ticket/Elements/ShowSummary,  Ticket => $Ticket &>
+
+
+<BR>
+<& /Ticket/Elements/ShowHistory , 
+      Ticket => $Ticket, 
+      Collapsed => $ARGS{'Collapsed'}, 
+      ShowHeaders => $ARGS{'ShowHeaders'} &> 
+
+  
+<%ARGS>
+$id => undef
+$Create => undef
+$ShowHeaders => undef
+$Collapsed => undef
+</%ARGS>
+
+<%INIT>
+  my ($linkid, $message, $tid, $Ticket, @Actions);  
+
+$Ticket = new RT::Ticket($session{'CurrentUser'});
+
+unless ($id) {
+    Abort('No ticket specified');
+}
+
+if ($ARGS{'id'} eq 'new') {
+    # {{{ Create a new ticket
+    
+    my $Queue = new RT::Queue($session{'CurrentUser'});        
+    unless ($Queue->Load($ARGS{'Queue'})) {
+       Abort('Queue not found');
+    }
+    
+    unless ($Queue->CurrentUserHasRight('CreateTicket')) {
+       Abort('You have no permission to create tickets in that queue.');
+    }
+    ($Ticket, @Actions) =
+       CreateTicket(Attachments => $session{'Attachments'}, %ARGS);
+    delete $session{'Attachments'};
+    unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+      Abort("No permission to view newly created ticket #".$Ticket->id.".");
+    }
+    # }}}
+}
+
+else { 
+    $Ticket = LoadTicket($ARGS{'id'});
+    unless ($Ticket->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 ( $ARGS{'UpdateContent'} ) {
+        $ARGS{'UpdateContent'} =~ s/\r\n/\n/g;
+        if (    $ARGS{'UpdateContent'} ne ''
+             && $ARGS{'UpdateContent'} ne "-- \n"
+             . $session{'CurrentUser'}->UserObj->Signature ) {
+            $ARGS{UpdateAttachments} = $session{'Attachments'};
+            ProcessUpdateMessage( ARGSRef   => \%ARGS,
+                                  Actions   => \@Actions,
+                                  TicketObj => $Ticket );
+            delete $session{'Attachments'};
+        }
+    }
+#Process status updates
+my @BasicActions = ProcessTicketBasics(ARGSRef => \%ARGS, TicketObj=>$Ticket);
+my @results = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);                            
+
+push (@Actions, @BasicActions, @results);
+}
+</%INIT>
+
+
+
+
diff --git a/rt/html/Ticket/Elements/AddWatchers b/rt/html/Ticket/Elements/AddWatchers
new file mode 100644 (file)
index 0000000..e9f6515
--- /dev/null
@@ -0,0 +1,97 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<BR>
+<%$msg%><br>
+
+<&|/l&>Add new watchers</&>:<br>
+
+<table>
+% if ($Users and $Users->Count) {
+<tr><td>
+<&|/l&>Type</&>
+</td><td>
+<&|/l&>Username</&>
+</td></tr>
+% while (my $u = $Users->Next ) {
+<tr><td><&/Elements/SelectWatcherType, Name => "Ticket-AddWatcher-Principal-".$u->PrincipalId &></td><td><%$u->Name%> (<%$u->RealName%>)</td></tr>
+% }
+% }
+
+% if ($Groups and $Groups->Count) {
+<tr><td>
+<&|/l&>Type</&>
+</td><td>
+<&|/l&>Group</&>
+</td></tr>
+% while (my $g = $Groups->Next ) {
+<tr><td><&/Elements/SelectWatcherType, Name => "Ticket-AddWatcher-Principal-".$g->PrincipalId, Scope => 'queue' &></td><td><%$g->Name%> (<%$g->Description%>)</td></tr>
+% }
+% }
+
+<tr><td>
+<&|/l&>Type</&>
+</td><td>
+<&|/l&>Email</&>
+</td></tr>
+<tr><td>
+<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail1" &>
+</td><td>
+<input name="WatcherAddressEmail1" size=15>
+</td></tr>
+<tr><td>
+<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail2" &> 
+</td><td>
+<input name="WatcherAddressEmail2" size=15>
+</td></tr>
+<tr><td>
+<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail3" &>
+</td><td>
+<input name="WatcherAddressEmail3" size=15>
+</td></tr>
+</table>
+
+<%INIT>
+my ($msg, $Users, $Groups);
+
+if ($UserString) {
+    $Users = RT::Users->new($session{'CurrentUser'});
+    $Users->Limit(FIELD => $UserField, VALUE => $UserString, OPERATOR => $UserOp);
+     }
+
+if ($GroupString) {
+    $Groups = RT::Groups->new($session{'CurrentUser'});
+    $Groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'UserDefined');
+    $Groups->Limit(FIELD => $GroupField, VALUE => $GroupString, OPERATOR => $GroupOp);
+     }
+
+</%INIT>
+
+<%ARGS>
+$UserField => 'Name'
+$UserOp => '='
+$UserString => undef
+$GroupField => 'Name'
+$GroupOp => '='
+$GroupString => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/BulkLinks b/rt/html/Ticket/Elements/BulkLinks
new file mode 100644 (file)
index 0000000..e6b9cd5
--- /dev/null
@@ -0,0 +1,53 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE>
+  <TR>
+    <TD class="label"><&|/l&>Merge into</&>:</TD>
+    <TD class="entry"><input name="Ticket-MergeInto"> <i><&|/l&>(only one ticket)</&></i></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Depends on</&>:</TD>
+    <TD class="entry"><input name="Ticket-DependsOn"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Depended on by</&>:</TD>
+    <TD class="entry"><input name="DependsOn-Ticket"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Parents</&>:</TD>
+    <TD class="entry"><input name="Ticket-MemberOf"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Children</&>:</TD>
+    <TD class="entry"> <input name="MemberOf-Ticket"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Refers to</&>:</TD>
+    <TD class="entry"><input name="Ticket-RefersTo"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Referred to by</&>:</TD>
+    <TD class="entry"> <input name="RefersTo-Ticket"></TD>
+  </TR>
+</TABLE>
diff --git a/rt/html/Ticket/Elements/EditBasics b/rt/html/Ticket/Elements/EditBasics
new file mode 100644 (file)
index 0000000..5d66b1f
--- /dev/null
@@ -0,0 +1,79 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE>
+  <TR><td>
+    <table>
+      <td class="label"><&|/l&>Subject</&>:</td>
+      <td class="value">
+        <input name=Subject value="<%$TicketObj->Subject|h%>" SIZE=50>
+      </td>
+    </table>
+  </td></TR>
+  <TR><td>
+    <table>
+      <TD>
+        <& /Elements/ShadedBox, 
+            title => loc('Status'),
+            content => $SelectStatus &>
+      </TD>
+      <TD>
+        <& /Elements/ShadedBox,
+           title => loc('Time Worked'),
+           content => "<input name=TimeWorked value=\"".$TicketObj->TimeWorked."\" SIZE=5>" &>
+      </TD>
+      <TD>
+        <& /Elements/ShadedBox,
+           title => loc('Time Left'),
+           content => "<input name=TimeLeft value=\"".$TicketObj->TimeLeft."\" SIZE=5>" 
+&>
+      </TD>
+      <TD>
+        <& /Elements/ShadedBox,
+           title => loc('Priority'),
+           content => "<input name=Priority value=\"".$TicketObj->Priority."\" SIZE=3>" &>
+      </TD>
+      <TD>
+        <& /Elements/ShadedBox,
+           title => loc('Final Priority'),
+           content => "<input name=FinalPriority value=\"".$TicketObj->FinalPriority."\" SIZE=3>" &>
+      </TD>
+      <TD>
+        <& /Elements/ShadedBox,
+            title => loc('Queue'),
+            content => "$SelectQueue" &>
+      </TD>
+    </table>
+  </td></TR>
+</TABLE>
+
+<%INIT>
+#It's hard to do this inline, so we'll preload the html of the selectstatus in here.
+my $SelectStatus = $m->scomp("/Elements/SelectStatus", Name => 'Status', Default=> $TicketObj->Status);
+my $SelectQueue = $m->scomp("/Elements/SelectQueue", Name => 'Queue', Default =>$TicketObj->QueueObj->Id);
+
+</%INIT>
+<%ARGS>
+
+$TicketObj => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/EditCustomField b/rt/html/Ticket/Elements/EditCustomField
new file mode 100644 (file)
index 0000000..1fc7d43
--- /dev/null
@@ -0,0 +1,70 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% my $Values;
+% if ($TicketObj) {
+%          $Values  = $TicketObj->CustomFieldValues($CustomField->id);
+% }
+% if ($CustomField->Type eq 'FreeformSingle') {
+      <input name="<%$NamePrefix%><%$CustomField->Id%>-Value"
+        size="<%$Cols%>"
+% if ($TicketObj) {
+          value="<%$Values->Count ? $Values->First->Content : ''%>"
+% }
+>
+% } elsif ($CustomField->Type eq 'FreeformMultiple') {
+% my $content;
+% if ($TicketObj) {
+%          while (my $value = $Values->Next ) {
+%                 $content .= $value->Content;
+%           }
+%  }
+<input type="hidden" name="<%$NamePrefix%><%$CustomField->Id%>-Values-Magic" value="1">
+<textarea cols=<%$Cols%> rows=<%$Rows%> name="<%$NamePrefix%><%$CustomField->Id%>-Values"><%$content%></textarea>
+% } elsif ($CustomField->Type =~ /^Select/) {
+      <input type="hidden" name="<%$NamePrefix%><%$CustomField->Id%>-Values-Magic" value="1">
+      <select name="<%$NamePrefix%><%$CustomField->Id%>-Values"
+        size="<%$Rows%>"
+        <%$CustomField->Type eq 'SelectMultiple' && 'MULTIPLE'%>>
+% my $CustomFieldValues = $CustomField->Values();
+% my $selected;
+% while (my $value = $CustomFieldValues->Next) {
+        <option value="<%$value->Name%>" 
+% if ($TicketObj) {
+            <% $Values->HasEntry($value->Name) && ($selected = 1) && 'SELECTED' %>
+% } elsif ($Default) {
+            <% ($Default eq $value->Name) && ($selected = 1) && 'SELECTED' %>
+% }
+            ><% $value->Name%></option>
+% }
+        <option value="" <% !$selected && 'SELECTED' %>><&|/l&>(no value)</&></option>
+      </select>
+% }
+<%ARGS>
+$TicketObj => undef
+$CustomField => undef
+$NamePrefix => undef
+$Rows => 5
+$Cols=> 15
+$Default => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/EditCustomFields b/rt/html/Ticket/Elements/EditCustomFields
new file mode 100644 (file)
index 0000000..6b27389
--- /dev/null
@@ -0,0 +1,74 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table>
+<tr>
+<td valign="top" width="50%">
+<table>
+
+% my @entry_fields;
+% my $i;
+% my $cfcount = $CustomFields->Count;
+%  $cfcount++ if ($cfcount % 2) ; # if we have an odd number of 
+% #custom fields, fudge it so we know where to put in the table break
+% while (my $CustomField = $CustomFields->Next()) {
+% if ($cfcount == 2 * $i) {
+</table>
+</td>
+<td valign="top" width="50%">
+<table>
+% }
+% $i++;
+  <tr>
+    <td class="labeltop">
+      <b><%$CustomField->Name%></b><br>
+      <i><%$CustomField->FriendlyType%></i>
+    </td>
+    <td class="entry"><& EditCustomField, TicketObj => $TicketObj, CustomField => $CustomField, NamePrefix => $NamePrefix &></td>
+  </tr>
+% }
+</table>
+</td>
+</tr>
+</table>
+
+<%INIT>
+my $CustomFields;
+my $NamePrefix;
+
+if ($TicketObj) {
+ $CustomFields = $TicketObj->QueueObj->CustomFields();
+  $NamePrefix = "Ticket-".$TicketObj->Id."-CustomField-";
+
+} else {
+ $CustomFields = $QueueObj->CustomFields();
+  $NamePrefix = "CustomField-";
+}
+
+
+
+</%INIT>
+<%ARGS>
+$TicketObj => undef
+$QueueObj => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/EditDates b/rt/html/Ticket/Elements/EditDates
new file mode 100644 (file)
index 0000000..1f3bf1b
--- /dev/null
@@ -0,0 +1,53 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE>
+  <TR>
+    <TD class="label"><&|/l&>Starts</&>:</TD>
+    <TD class="entry"><& /Elements/SelectDate, menu_prefix => 'Starts', current => 0 &> 
+        (<% $TicketObj->StartsObj->AsString %>)</TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Started</&>:</TD>
+    <TD class="entry"><& /Elements/SelectDate, menu_prefix => 'Started', current => 0 &> (<%$TicketObj->StartedObj->AsString %>)</TD>
+  </TR>
+
+  <TR>
+    <TD class="label">
+      <&|/l&>Last Contact</&>:
+    </TD>
+    <TD class="entry">
+      <& /Elements/SelectDate, menu_prefix => 'Told', current => 0 &> (<% $TicketObj->ToldObj->AsString %>)
+    </TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Due</&>:</TD>
+    <TD class="entry">
+      <& /Elements/SelectDate, menu_prefix => 'Due', current => 0 &> (<% $TicketObj->DueObj->AsString %>)
+    </TD>
+  </TR>
+</TABLE>
+<%ARGS>
+$TicketObj => undef
+</%ARGS>
+
diff --git a/rt/html/Ticket/Elements/EditLinks b/rt/html/Ticket/Elements/EditLinks
new file mode 100644 (file)
index 0000000..7a522dd
--- /dev/null
@@ -0,0 +1,150 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE width=100%>
+  <TR>
+    <TD VALIGN=TOP WIDTH=50%>
+      <h3><&|/l&>Current Relationships</&></h3>
+
+<table>
+  <tr>
+    <td></td>
+    <td><i><&|/l&>(Check box to delete)</&></i></td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Depends on</&>:</td>
+    <td class="value">
+% while (my $link = $Ticket->DependsOn->Next) {
+% my $member = $link->TargetObj;
+      <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>">
+      <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+      [<%$member->Status%>]<br>
+% }
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Depended on by</&>:</td>
+    <td class="value">
+% while (my $link = $Ticket->DependedOnBy->Next) {
+% my $member = $link->BaseObj;
+      <INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-">
+      <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> 
+      [<%$member->Status%>]<br>
+% }
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Parents</&>:</td>
+    <td class="value">
+% while (my $link = $Ticket->MemberOf->Next) {
+% my $member = $link->TargetObj;
+      <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>">
+      <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+      [<%$member->Status%>]<br>
+% }
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Children</&>:</td>
+    <td class="value">
+% while (my $link = $Ticket->Members->Next) {
+      <INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-">
+% my $member = $link->BaseObj;
+      <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> 
+      [<%$member->Status%>]<br>
+% }
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Refers to</&>:</td>
+    <td class="value">
+% while (my $link = $Ticket->RefersTo->Next) {
+      <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>">
+% if ($link->TargetURI->IsLocal) {
+% my $member = $link->TargetObj;
+      <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+      <A HREF="<%$link->TargetURI->Resolver->HREF%>"><%$link->TargetURI->Resolver->AsString%></A><br>
+% }
+%}
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Referred to by</&>:</td>
+    <td class="value">
+% while (my $link = $Ticket->ReferredToBy->Next) {
+      <INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-">
+% if ($link->BaseURI->IsLocal) {
+% my $member = $link->BaseObj;
+      <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+      <A HREF="<%$link->BaseURI->Resolver->HREF%>"><%$link->BaseURI->Resolver->AsString%></A><br>
+%}
+% }
+    </td>
+  </tr>
+</table>
+                           
+</TD>
+<TD VALIGN=TOP>
+<h3><&|/l&>New Relationships</&></h3>
+<i><&|/l&>Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces.</&></i><br>
+<TABLE>
+  <TR>
+    <TD class="label"><&|/l&>Merge into</&>:</TD>
+    <TD class="entry"><input name="<%$Ticket->Id%>-MergeInto"> <i><&|/l&>(only one ticket)</&></i></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Depends on</&>:</TD>
+    <TD class="entry"><input name="<%$Ticket->Id%>-DependsOn"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Depended on by</&>:</TD>
+    <TD class="entry"><input name="DependsOn-<%$Ticket->Id%>"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Parents</&>:</TD>
+    <TD class="entry"><input name="<%$Ticket->Id%>-MemberOf"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Children</&>:</TD>
+    <TD class="entry"> <input name="MemberOf-<%$Ticket->Id%>"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Refers to</&>:</TD>
+    <TD class="entry"><input name="<%$Ticket->Id%>-RefersTo"></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Referred to by</&>:</TD>
+    <TD class="entry"> <input name="RefersTo-<%$Ticket->Id%>"></TD>
+  </TR>
+</TABLE>
+</TD>
+</TR>
+</TABLE>
+
+
+      
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/EditPeople b/rt/html/Ticket/Elements/EditPeople
new file mode 100644 (file)
index 0000000..1ab8f4a
--- /dev/null
@@ -0,0 +1,68 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE>
+<TR>
+<TD VALIGN=TOP>
+
+<h3><&|/l&>New watchers</&></h3>
+<&|/l&>Find people whose</&><BR>
+<& /Elements/SelectUsers &>
+<input type=submit name="OnlySearchForPeople" value="<&|/l&>Go!</&>">
+<BR>
+<&|/l&>Find group whose</&><BR>
+<& /Elements/SelectGroups &>
+<input type=submit name="OnlySearchForGroup" value="<&|/l&>Go!</&>">
+
+<& AddWatchers, Ticket => $Ticket, UserString => $UserString,
+        UserOp => $UserOp, UserField => $UserField,
+       GroupString => $GroupString, GroupOp => $GroupOp,
+       GroupField => $GroupField &> 
+</TD><TD VALIGN=TOP>
+<h3><&|/l&>Owner</&></h3>
+<&|/l&>Owner</&>: <& /Elements/SelectOwner, Name => 'Owner', QueueObj => $Ticket->QueueObj, TicketObj => $Ticket, Default => $Ticket->OwnerObj->Id &>
+<h3><&|/l&>Current watchers</&></h3>
+<&|/l&>(Check box to delete)</&><br>
+
+<&|/l&>Requestors</&>:
+<& EditWatchers, TicketObj => $Ticket, Watchers => $Ticket->Requestors &>
+
+<&|/l&>Cc</&>:
+<& EditWatchers, TicketObj => $Ticket, Watchers => $Ticket->Cc &>
+
+<&|/l&>Administrative Cc</&>:
+<& EditWatchers, TicketObj => $Ticket, Watchers => $Ticket->AdminCc &>
+
+</TD>
+</TR>
+</TABLE>
+
+<%ARGS>
+$UserField => undef
+$UserOp => undef
+$UserString => undef
+$GroupField => undef
+$GroupOp => undef
+$GroupString => undef
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/EditWatchers b/rt/html/Ticket/Elements/EditWatchers
new file mode 100644 (file)
index 0000000..145071c
--- /dev/null
@@ -0,0 +1,52 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<ul>
+%# Print out a placeholder if there are none.
+%if ($Members->Count == 0 ) {
+<li><i><&|/l&>none</&></i>
+% }
+
+
+%while (my $watcher=$Members->Next) {
+<li>
+<INPUT TYPE=CHECKBOX NAME="Ticket-DelWatcher-Type-<%$Watchers->Type%>-Principal-<%$watcher->MemberId%>" UNCHECKED>
+%if ($watcher->MemberObj->IsUser) { 
+<a href="<%$RT::WebPath%>/Admin/Users/Modify.html?id=<%$watcher->MemberObj->Object->id%>">
+<%$watcher->MemberObj->Object->Name%></a>
+%} else {
+<a href="<%$RT::WebPath%>/Admin/Groups/Modify.html?id=<%$watcher->MemberObj->Object->id%>">
+<%$watcher->MemberObj->Object->Name%></a>
+%}
+% }
+</ul>
+<%INIT>
+my $Members = $Watchers->MembersObj;
+</%INIT>
+<%ARGS>
+$TicketObj => undef
+$Watchers => undef
+</%ARGS>
+
+
+
diff --git a/rt/html/Ticket/Elements/ShowAttachments b/rt/html/Ticket/Elements/ShowAttachments
new file mode 100644 (file)
index 0000000..22b60d1
--- /dev/null
@@ -0,0 +1,76 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% if (keys %documents) {
+<& /Elements/TitleBoxStart, title => loc('Attachments'), 
+        title_class=> 'inverse',  
+        color => "#336699" &>
+
+% foreach my $key (keys %documents) {
+% my $fontsize='size="-1"';
+
+<%$key%><br>
+<ul>
+% foreach my $rev (@{$documents{$key}}) {
+
+<%PERL>
+my $size = $rev->ContentLength;
+
+if ($size) {
+    if ($size > 1024) {
+        $size = int($size/102.4)/10 . "k";
+    }
+    else {
+        $size = $size ."b";
+    }
+
+</%PERL>
+
+<li><font <%$fontsize%>>
+        <A HREF="<%$RT::WebPath%>/Ticket/Attachment/<%$rev->TransactionObj->Id%>/<%$rev->Id%>/<%$rev->Filename%>"><%$rev->CreatedAsString%> (<% $size %>)</a></font></li>
+% }
+% $fontsize='size="-2"';
+% }
+</ul>
+
+% }
+<& /Elements/TitleBoxEnd &>
+<BR>
+% }
+
+<%INIT>
+my %documents;
+my $transactions = $Ticket->Transactions();
+while (my $trans = $transactions->Next()) {
+        my $attachments = $trans->Attachments();
+        while (my $attach = $attachments->Next()) {
+              next unless ($attach->Filename());
+              # most recent at the top
+              unshift (@{$documents{$attach->Filename}}, $attach);
+        }
+}
+</%INIT>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
+
diff --git a/rt/html/Ticket/Elements/ShowBasics b/rt/html/Ticket/Elements/ShowBasics
new file mode 100644 (file)
index 0000000..ad23e8c
--- /dev/null
@@ -0,0 +1,54 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table>
+  <tr>
+    <td class="label"><&|/l&>Id</&>:</td>
+    <td class="value"><%$Ticket->Id %></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Status</&>:</td>
+    <td class="value"><&|/l&><% $Ticket->Status%></&></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Worked</&>:</td>
+    <td class="value"><&|/l, $TimeWorked &>[_1] min</&></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Priority</&>:</td>
+    <td class="value"><%$Ticket->Priority%>/<%$Ticket->FinalPriority %></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Queue</&>:</td>
+    <td class="value"><%$Ticket->QueueObj->Name%></td>
+  </tr>
+</table>
+<%INIT>
+my $TimeWorked = $Ticket->TimeWorked;
+if ($Ticket->TimeLeft > 0 ) {
+  $TimeWorked = $Ticket->TimeWorked."/".$Ticket->TimeLeft;
+}
+</%INIT>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowCustomFields b/rt/html/Ticket/Elements/ShowCustomFields
new file mode 100644 (file)
index 0000000..50d28f0
--- /dev/null
@@ -0,0 +1,46 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table>
+% my @entry_fields;
+% while (my $CustomField = $CustomFields->Next()) {
+% my $Values = $Ticket->CustomFieldValues($CustomField->Id);
+  <tr>
+    <td class="label"><%$CustomField->Name%>:</td>
+    <td class="value">
+% while (my $Value = $Values->Next()) {
+<%$Value->Content%><br>        
+% }
+% unless ($Values->Count()) {
+<i><&|/l&>(no value)</&></i>
+% }
+    </td>
+  </tr>
+% }
+</table>
+<%INIT>
+my $CustomFields = $Ticket->QueueObj->CustomFields();
+</%INIT>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowDates b/rt/html/Ticket/Elements/ShowDates
new file mode 100644 (file)
index 0000000..da7f75b
--- /dev/null
@@ -0,0 +1,56 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TABLE>
+  <TR>
+    <TD class="label"><&|/l&>Created</&>:</TD>
+    <TD class="value"><% $Ticket->CreatedObj->AsString %></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Starts</&>:</TD>
+    <TD class="value"><% $Ticket->StartsObj->AsString %></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Started</&>:</TD>
+    <TD class="value"><% $Ticket->StartedObj->AsString %></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Last Contact</&>:</TD>
+    <TD class="value"><% $Ticket->ToldObj->AsString %></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Due</&>:</TD>
+    <TD class="value"><% $Ticket->DueObj->AsString  %></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Closed</&>:</TD>
+    <TD class="value"><% $Ticket->ResolvedObj->AsString  %></TD>
+  </TR>
+  <TR>
+    <TD class="label"><&|/l&>Updated</&>:</TD>
+    <TD class="value"><A HREF="#lasttrans"><% $Ticket->LastUpdated ? (loc("[_1] by [_2]", $Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)) : loc("Never") | h %></a></TD>
+  </TR>
+</TABLE>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowDependencies b/rt/html/Ticket/Elements/ShowDependencies
new file mode 100644 (file)
index 0000000..b7f3968
--- /dev/null
@@ -0,0 +1,41 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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&>Depends on</&>:<BR>
+% while (my $Link = $Ticket->DependsOn->Next) {
+% my $member = $Link->TargetObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+ <br>
+% }
+<&|/l&>Depended on by</&>:<BR>
+% while (my $Link = $Ticket->DependedOnBy->Next) {
+% my $member = $Link->TargetObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> 
+[<%$member->Status%>]
+ <br>
+% }
+
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowHistory b/rt/html/Ticket/Elements/ShowHistory
new file mode 100644 (file)
index 0000000..2958f87
--- /dev/null
@@ -0,0 +1,86 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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>
+ if ($ShowDisplayModes or $ShowTitle) {
+my $title;
+my $titleright;
+if ($ShowTitle) {
+    $title = loc('History');
+}
+else {
+    $title = '&nbsp;';
+}
+$titleright = loc('Display mode') . ":";
+if ($ShowHeaders &&  $ShowHeaders == $Ticket->Id ) {
+    $titleright .= "[<A HREF=\"" . $URIFile . "?id="
+      . $Ticket->id . "\">"
+      . loc("Brief headers")
+      . "</a>] <b>["
+      . loc("Full headers") . "]</b>";
+}
+else {
+    $titleright .= "<b>["
+      . loc("Brief headers")
+      . "]</b> [<A HREF=\""
+      . $URIFile
+      . "?ShowHeaders="
+      . $Ticket->Id . "&id="
+      . $Ticket->id . "\">"
+      . loc("Full headers") . "</a>]";
+}
+</%perl>
+<& /Elements/TitleBoxStart, title => $title, titleright => $titleright, bodyclass=> ''&>
+% }
+
+<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=2 BORDER=0>
+% while (my $Transaction = $Transactions->Next) {
+% my $skip = 0;
+% $m->comp('/Elements/Callback', _CallbackName => 'SkipTransaction', Transaction => $Transaction, skip => \$skip, %ARGS);
+% next if $skip;
+% $i++;
+%      if ($Transactions->IsLast) {
+       <a name="lasttrans"></a>
+%      }
+           <& ShowTransaction, Ticket => $Ticket, Transaction => $Transaction, ShowHeaders => $ShowHeaders, Collapsed => $Collapsed, RowNum => $i, ShowTitleBarCommands => $ShowTitleBarCommands  &>
+% }
+</TABLE>
+% if ($ShowDisplayModes or $ShowTitle) {
+<& /Elements/TitleBoxEnd &>
+% }
+<%INIT>
+
+my $Transactions = $Ticket->Transactions;
+my $i;
+
+
+</%INIT>
+<%ARGS>
+$URIFile => 'Display.html'
+$Ticket => undef
+$ShowHeaders => undef
+$Collapsed => undef
+$ShowTitle => 1
+$ShowDisplayModes => 1
+$ShowTitleBarCommands => 1
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowLink b/rt/html/Ticket/Elements/ShowLink
new file mode 100644 (file)
index 0000000..493fd95
--- /dev/null
@@ -0,0 +1,40 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<A href="<%$URI->Resolver->HREF%>">
+% if ($URI->IsLocal) {
+% my $member = $URI->Object;
+% if (UNIVERSAL::isa($member, "RT::Ticket")) {
+<%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<% loc($member->Status) %>]
+% } elsif ( UNIVERSAL::can($member, 'Name')) {
+<%$URI->Resolver->AsString%>: <%$member->Name%>
+% } else {
+<%$URI->Resolver->AsString%>
+% }
+% } else {
+<%$URI->Resolver->AsString%>
+% }
+</a>
+<%ARGS>
+$URI => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowLinks b/rt/html/Ticket/Elements/ShowLinks
new file mode 100644 (file)
index 0000000..f88a600
--- /dev/null
@@ -0,0 +1,87 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table>
+  <tr>
+    <td class="labeltop"><&|/l&>Depends on</&>:</td>
+    <td class="value">
+<ul>
+% while (my $Link = $Ticket->DependsOn->Next) {
+<li><& ShowLink, URI => $Link->TargetURI &>
+% }
+</ul>
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Depended on by</&>:</td>
+    <td class="value">
+<ul>
+% while (my $Link = $Ticket->DependedOnBy->Next) {
+<li><& ShowLink, URI => $Link->BaseURI &>
+% }
+</ul>
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Parents</&>:</td>
+    <td class="value">
+<ul>
+% while (my $Link = $Ticket->MemberOf->Next) {
+<li><& ShowLink, URI => $Link->TargetURI &>
+% }
+</ul>
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Children</&>:</td>
+    <td class="value"><& /Ticket/Elements/ShowMembers, Ticket => $Ticket &></td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Refers to</&>:</td>
+    <td class="value">
+<ul>
+% while (my $Link = $Ticket->RefersTo->Next) {
+<li><& ShowLink, URI => $Link->TargetURI &>
+% }
+</ul>
+    </td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Referred to by</&>:</td>
+    <td class="value">
+    <ul>
+% while (my $Link = $Ticket->ReferredToBy->Next) {
+<li><& ShowLink, URI => $Link->BaseURI &>
+% }
+</ul>
+    </td>
+  </tr>
+
+% # Allow people to add more rows to the table                                                                                                                           
+%  $m->comp('/Elements/Callback', %ARGS );
+
+</table>
+
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowMemberOf b/rt/html/Ticket/Elements/ShowMemberOf
new file mode 100644 (file)
index 0000000..79e0a3b
--- /dev/null
@@ -0,0 +1,35 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<UL>
+% my $memberof = $Ticket->MemberOf;
+% while (my $member_of = $memberof->Next) {
+<LI><a href="/Ticket/Display.html?id=<%$member_of->Id%>"><%$member_of->Id%></a>: <%$member_of->Subject%> [<%$member_of->Status%>]
+% }
+</UL>
+
+<%INIT>
+</%INIT>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowMembers b/rt/html/Ticket/Elements/ShowMembers
new file mode 100644 (file)
index 0000000..e101662
--- /dev/null
@@ -0,0 +1,45 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% if ($members->Count) {
+<UL>
+% while (my $link = $members->Next) {
+% my $member= $link->BaseObj;
+<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: <%$member->Subject%> [<%loc($member->Status)%>]<br>
+% if ($depth < 8) {
+<&/Ticket/Elements/ShowMembers, Ticket => $member, depth => ($depth+1) &> 
+% }
+% }
+</UL>
+% }
+
+<%INIT>
+
+my $members = $Ticket->Members;
+
+</%INIT>
+
+<%ARGS>
+$Ticket => undef
+$depth => 1
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowMessageHeaders b/rt/html/Ticket/Elements/ShowMessageHeaders
new file mode 100644 (file)
index 0000000..11d873c
--- /dev/null
@@ -0,0 +1,32 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%$content |n%>
+<%INIT>
+my $content = $Headers;
+RT::Interface::Web::EscapeUTF8(\$content);
+$m->comp('/Elements/Callback', content => \$content, %ARGS);
+</%INIT>
+<%ARGS>
+$Headers => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowMessageStanza b/rt/html/Ticket/Elements/ShowMessageStanza
new file mode 100644 (file)
index 0000000..b099806
--- /dev/null
@@ -0,0 +1,51 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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>
+foreach my $stanza (@$Message) {
+    if ( ref $stanza eq "ARRAY" ) {
+        $m->comp( 'ShowMessageStanza',
+                  Depth   => $Depth + 1,
+                  Transaction => $Transaction,
+                  Message => $stanza );
+    }
+    elsif ( ref $stanza eq "HASH" ) {
+        my $content = $stanza->{raw};
+        RT::Interface::Web::EscapeUTF8(\$content);
+        $m->comp('/Elements/Callback', content => \$content, %ARGS);
+                $content =~ s/\n/<br>/gi;
+
+</%perl>
+<font color="<%$colors[$Depth]%>"><%$content |n%><br></font>
+%       }
+% }
+<%INIT>
+use URI::URL;
+my $server = 'fsck.com';
+my @colors = ('#000000', '#660000', '#006600', '#000066', '#cc0000', '#00cc00', '#0000cc', '#ff0000', '#00ff00', '#0000ff');
+</%INIT>
+<%ARGS>
+$Message => undef
+$Depth => 0
+$Transaction => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowPeople b/rt/html/Ticket/Elements/ShowPeople
new file mode 100644 (file)
index 0000000..0b80269
--- /dev/null
@@ -0,0 +1,45 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<table>
+  <tr>
+    <td class="label"><&|/l&>Owner</&>:</td>
+    <td class="value"><%$Ticket->OwnerObj->Name%></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Requestors</&>:</td>
+    <td class="value"><%$Ticket->RequestorAddresses%></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Cc</&>:</td>
+    <td class="value"><%$Ticket->CcAddresses%></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>AdminCc</&>:</td>
+    <td class="value"><%$Ticket->AdminCcAddresses%></td>
+  </tr>
+</table>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
+
diff --git a/rt/html/Ticket/Elements/ShowReferences b/rt/html/Ticket/Elements/ShowReferences
new file mode 100644 (file)
index 0000000..831923b
--- /dev/null
@@ -0,0 +1,50 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<UL>
+% while (my $Link = $Ticket->RefersTo->Next) {
+<LI>
+% if ($Link->TargetURI->IsLocal) {
+% my $member = $Link->TargetObj;
+
+<a href="/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$Link->TargetURI->HREF%>"><%$Link->Target%></A>
+% }
+%}
+
+
+
+% while (my $Link = $Ticket->ReferredToBy->Next) {
+<LI>
+% if ($Link->BaseURI->IsLocal) {
+% my $member = $Link->BaseObj;
+<a href="/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$Link->BaseURI->HREF%>"><%$Link->Base%></A>
+%}
+% }
+</UL>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowRequestor b/rt/html/Ticket/Elements/ShowRequestor
new file mode 100644 (file)
index 0000000..cc91f59
--- /dev/null
@@ -0,0 +1,59 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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>
+my $rows = 10;
+my $people = $Ticket->Requestors->MembersObj;
+while (my $member=$people->Next) {
+my $requestor = $member->MemberObj->Object;
+my $name=$requestor->RealName || $requestor->EmailAddress;     
+my $tickets = RT::Tickets->new($session{'CurrentUser'});
+$tickets->LimitWatcher(TYPE => 'Requestor', VALUE => $requestor->EmailAddress );
+$tickets->LimitStatus( VALUE => 'open');
+$tickets->LimitStatus( VALUE => 'new');
+$tickets->RowsPerPage($rows);
+$tickets->OrderBy(FIELD => 'Priority',
+                 ORDER => 'DESC');
+</%PERL>
+
+% unless ($requestor->Privileged) {
+<& /Elements/TitleBoxStart, 
+       title => "<a class='inverse' href=\"$RT::WebPath/Admin/Users/Modify.html?id=".$requestor->id."\">".loc("More about [_1]", $name)."</a>" &>
+
+<&|/l&>Comments about this user</&>:<BR>
+<B><% ($requestor->Comments || loc("No comment entered about this user")) %></B><BR>
+
+<&|/l, $rows &>This user's [_1] highest priority tickets</&>:<BR>
+<UL>
+%while (my $w=$tickets->Next) {
+<LI><a href="<%$RT::WebPath%><%$DisplayPath%>?id=<%$w->id%>"><%$w->Id%>: <%$w->Subject%></a> (<%$w->Status%>)
+%}
+</UL>
+<& /Elements/TitleBoxEnd &>
+
+% }
+%}
+<%ARGS>
+$Ticket=>undef
+$DisplayPath => "/Ticket/Display.html"
+</%ARGS>
diff --git a/rt/html/Ticket/Elements/ShowSummary b/rt/html/Ticket/Elements/ShowSummary
new file mode 100644 (file)
index 0000000..6ae8758
--- /dev/null
@@ -0,0 +1,82 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+      <TABLE WIDTH="100%" class="ticketsummary" >
+      <TR>
+       <TD VALIGN=TOP WIDTH="50%">
+         <& /Elements/TitleBoxStart, title => loc('The Basics'), 
+               title_href =>"$RT::WebPath/Ticket/Modify.html?id=".$Ticket->Id, 
+               title_class=> 'inverse',  
+               color => "#993333" &>
+               <& /Ticket/Elements/ShowBasics, Ticket => $Ticket &>
+         <& /Elements/TitleBoxEnd &>
+          <br>
+% if ($Ticket->QueueObj->CustomFields()->First) {
+         <& /Elements/TitleBoxStart, title => loc('Custom Fields'), 
+               title_href =>"$RT::WebPath/Ticket/Modify.html?id=".$Ticket->Id, 
+               title_class=> 'inverse',  
+               color => "#993333" &>
+               <& /Ticket/Elements/ShowCustomFields, Ticket => $Ticket &>
+         <& /Elements/TitleBoxEnd &>
+
+<br>
+% }
+         <& /Elements/TitleBoxStart, title => loc('People'), 
+               title_href =>"$RT::WebPath/Ticket/ModifyPeople.html?id=".$Ticket->Id, 
+               title_class=> 'inverse',  
+               color => "#333399" &>
+         <& /Ticket/Elements/ShowPeople, Ticket => $Ticket &>
+         <& /Elements/TitleBoxEnd &>
+       <BR>
+       </TD>
+       <TD VALIGN=TOP WIDTH="50%">
+
+         <& /Elements/TitleBoxStart, title => loc("Dates"),
+               title_href =>"$RT::WebPath/Ticket/ModifyDates.html?id=".$Ticket->Id, 
+               title_class=> 'inverse',  
+                color => "#663366" &>
+         <& /Ticket/Elements/ShowDates, Ticket => $Ticket &>
+         <& /Elements/TitleBoxEnd &>
+       <BR>  
+         <& /Elements/TitleBoxStart, title => loc('Relationships'), 
+               title_href => "$RT::WebPath/Ticket/ModifyLinks.html?id=".$Ticket->Id, 
+               title_class=> 'inverse',  
+               titleright => '', color=> "#336633" &>
+               <& /Ticket/Elements/ShowLinks, Ticket => $Ticket &>
+       <& /Elements/TitleBoxEnd &>
+        <BR>
+         <& /Ticket/Elements/ShowAttachments, Ticket => $Ticket &>
+
+         <& /Ticket/Elements/ShowRequestor, Ticket => $Ticket &>
+
+
+       </TD>
+      </TR>
+    </TABLE>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
+
+
+
+
diff --git a/rt/html/Ticket/Elements/ShowTransaction b/rt/html/Ticket/Elements/ShowTransaction
new file mode 100644 (file)
index 0000000..f2f89d3
--- /dev/null
@@ -0,0 +1,169 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<TR class="<% $RowNum%2 ? 'oddline' : 'evenline'%>" >
+<TD bgcolor="<%$bgcolor%>"><A NAME="txn-<%$Transaction->Id%>" href="#txn-<%$Transaction->Id%>">#</A>&nbsp;</TD>
+<TD>&nbsp&nbsp;</TD>
+<TD><font size=-2><% $transdate|n %></font>&nbsp;</TD>
+% my $desc = $Transaction->BriefDescription;
+% $m->comp('/Elements/Callback', _CallbackName => 'ModifyDisplay', text => \$desc, Transaction => $Transaction, %ARGS);
+<TD ALIGN="LEFT"><b><%$Transaction->CreatorObj->Name%> - <%$TicketString%> <%$desc%>
+
+</b></TD>
+<TD><%$TimeTaken%>&nbsp;</TD>
+<TD ALIGN="RIGHT"><font size=-1><%$titlebar_commands|n%></font></TD>
+</TR>
+<%PERL>
+
+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)) {
+         $headers = $message->Headers;
+      } else {
+         $headers = $message->NiceHeaders;
+      }
+      chomp $headers;
+      if ($headers) {
+          # localize the common headers (like 'Subject:'), too.
+          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;
+     if ($message->ContentType =~ m{^(text/plain|message|text$)}i && 
+                                   $message->ContentLength < $MAX_INLINE_BODY ) {
+         require Text::Quoted;
+        $quoted = Text::Quoted::extract($message->Content); 
+     }
+        
+</%PERL>
+<TR class="<% $RowNum%2 ? 'oddline' : 'evenline'%>" >                                
+      <TD BGCOLOR="<%$bgcolor%>">&nbsp;&nbsp;</TD>
+      <TD>&nbsp;&nbsp;</TD>
+      <TD COLSPAN=3 VALIGN=TOP>
+<span class="message">
+       <PRE>
+<& ShowMessageHeaders, Headers => $headers, Transaction => $Transaction &>
+</PRE>
+<& ShowMessageStanza, Depth => 0, Message => $quoted, Transaction => $Transaction &>
+</span>
+      </TD>
+      <TD VALIGN=TOP ALIGN=RIGHT>
+       
+% if ($message->Parent == 0  ) {
+<BR>
+% }
+<%PERL>
+my $size = $message->ContentLength;
+
+if ($size) {
+    if ($size > 1024) {
+       $size = loc("[_1]k", int($size/102.4)/10);
+    }
+    else {
+       $size = loc("[_1]b", $size);
+    }
+</%PERL>
+<font size=-1><A HREF="<%$RT::WebPath%>/Ticket/Attachment/<%$Transaction->Id%>/<%$message->Id%>/<%$message->Filename%>"><&|/l&>Download</&> <% $message->Filename|| loc('(untitled)') %></a> <% $size %></font>
+% }
+</TD>
+</TR>
+% }
+% }
+
+
+
+<%ARGS>
+$Ticket => undef
+$Transaction => undef
+$ShowHeaders => 0
+$Collapsed => undef
+$ShowTitleBarCommands => 1
+$RowNum => 1
+</%ARGS>
+
+<%INIT>
+
+
+my ($TimeTaken, $TicketString, $bgcolor);
+
+my $transdate = $Transaction->CreatedAsString();
+$transdate =~ s/\s/&nbsp;/g;
+
+if ($Transaction->Type =~ /^(Create|Correspond|Comment$)/) {
+       if ($Transaction->IsInbound) {
+               $bgcolor="#336699";
+       }
+       else {
+               $bgcolor="#339999";
+       }
+} elsif (($Transaction->Field =~ /^Owner$/) or 
+        ($Transaction->Type =~ /^(AddWatcher|DelWatcher)$/)) {
+       $bgcolor="#333399";
+
+} elsif ($Transaction->Type =~ /^(AddLink|DeleteLink)$/) {
+       $bgcolor="#336633";
+} elsif ($Transaction->Type =~ /^(Status|Set|Told)$/) {
+       if ($Transaction->Field =~ /^(Told|Starts|Started|Due)$/) {
+               $bgcolor="#663366";     
+       }
+       else {
+               $bgcolor="#993333";
+       }
+}
+else {
+       $bgcolor="#cccccc";
+}
+
+if ($Ticket->Id != $Transaction->Ticket) {
+       $TicketString = "Ticket ".$Transaction->Ticket .": ";
+}
+
+if ($Transaction->TimeTaken > 0) {
+       $TimeTaken = $Transaction->TimeTaken." min"
+}
+my $attachments = $Transaction->Attachments;
+
+my $titlebar_commands='&nbsp;';
+
+# If the transaction has anything attached to it at all
+if ($Transaction->Attachments->First && $ShowTitleBarCommands) {
+       if ($Transaction->TicketObj->CurrentUserHasRight('ReplyToTicket')) {
+               $titlebar_commands .= 
+                 "[<a href=\"Update.html?id=".
+                 $Transaction->Ticket . "&QuoteTransaction=".$Transaction->Id.
+                 "&Action=Respond\">". loc('Reply') ."</a>]&nbsp;";
+       }
+       if ($Transaction->TicketObj->CurrentUserHasRight('CommentOnTicket')) {
+            $titlebar_commands .= 
+            "[<a href=\"Update.html?id=".$Transaction->Ticket. 
+            "&QuoteTransaction=".$Transaction->Id.
+            "&Action=Comment\">". loc('Comment') ."</a>]";
+       }
+}
+
+</%INIT>
diff --git a/rt/html/Ticket/Elements/Tabs b/rt/html/Ticket/Elements/Tabs
new file mode 100644 (file)
index 0000000..81c92e8
--- /dev/null
@@ -0,0 +1,170 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Callback, Ticket => $Ticket, actions=> $actions, tabs => $tabs, %ARGS &>
+<& /Elements/Tabs, 
+    tabs => $tabs, 
+    actions => $actions, 
+    current_tab => $current_tab, 
+    current_toptab => $current_toptab,
+    Title => $Title &> 
+<%INIT>
+
+my $tabs = {};
+my $current_toptab = "Search/Listing.html",
+    my $searchtabs = { new => { title => loc('New Search'),
+                                path => 'Search/Listing.html?ClearRestrictions=1'}
+                        
+
+} ;
+my $actions;
+
+if ( $Ticket) {
+       
+my $id   = $Ticket->id();
+
+if ( defined $session{'tickets'} ) {
+
+
+my $item_map = $session{'tickets'}->ItemMap;
+
+            # Don't $current_toptab = display prev links if we're on the first ticket
+
+        if ($item_map->{$Ticket->Id}->{prev}) {
+                $searchtabs->{'_a'} = {
+                            class => "nav",
+                            path => "Ticket/Display.html?id=" . $item_map->{first},
+                            title => '<< ' . loc('First') };
+                $searchtabs->{"_b"} = { class => "nav",
+                            path => "Ticket/Display.html?id=" . $item_map->{$Ticket->Id}->{prev},
+                                  title => '< ' . loc('Prev') };
+       } 
+
+
+        # Don't display next links if we're on the last ticket
+        if ($item_map->{$Ticket->Id}->{next}) {
+            $searchtabs->{'d'} = { class => "nav",
+                            path => "Ticket/Display.html?id=" . $item_map->{$Ticket->Id}->{next},
+                             title => loc('Next') . ' >' };
+            $searchtabs->{'e'} = {
+                           class => "nav",
+                           path => "Ticket/Display.html?id=" . $item_map->{last},
+                           title => loc('Last') . ' >>' };
+        }
+}
+
+
+
+$tabs->{"this"} = { class => "currentnav",
+                    path  => "Ticket/Display.html?id=" . $Ticket->id,
+                    title => "#" . $id,
+                    current_subtab => $current_subtab };
+
+my $ticket_page_tabs = {
+    _A => { title => loc('Display'),
+            path  => "Ticket/Display.html?id=" . $id, },
+
+    _Ab => { title => loc('History'),
+             path  => "Ticket/History.html?id=" . $id, },
+    _B => { title => loc('Basics'),
+            path  => "Ticket/Modify.html?id=" . $id, },
+
+    _C => { title => loc('Dates'),
+            path  => "Ticket/ModifyDates.html?id=" . $id, },
+    _D =>
+      { title => loc('People'), path => "Ticket/ModifyPeople.html?id=" . $id, },
+    _E => { title => loc('Links'),
+            path  => "Ticket/ModifyLinks.html?id=" . $id, },
+    _F => { title => loc('Jumbo'),
+            path  => "Ticket/ModifyAll.html?id=" . $id,
+            seperator => 1
+ },
+
+};
+
+foreach my $tab ( sort keys %{$ticket_page_tabs} ) {
+    if ( $ticket_page_tabs->{$tab}->{'path'} eq $current_tab ) {
+        $ticket_page_tabs->{$tab}->{"subtabs"}        = $subtabs;
+        $tabs->{'this'}->{"current_subtab"}        = 
+        $ticket_page_tabs->{$tab}->{"path"};
+    }
+}
+$tabs->{'this'}->{"subtabs"} = $ticket_page_tabs;
+$current_tab = "Ticket/Display.html?id=" . $id;
+
+
+
+
+
+if (    $Ticket->CurrentUserHasRight('ModifyTicket')
+     or $Ticket->CurrentUserHasRight('ReplyToTicket') ) {
+    $actions->{'A'} = { title => loc('Reply'),
+                        path  => "Ticket/Update.html?Action=Respond&id=" . $id,
+    };
+}
+
+if ( $Ticket->CurrentUserHasRight('ModifyTicket') ) {
+    if ( $Ticket->Status ne 'resolved' ) {
+        $actions->{'B'} = {
+
+            path => "Ticket/Update.html?Action=Comment&DefaultStatus=resolved&id=" . $id,
+            title => loc('Resolve') };
+    }
+    if ( $Ticket->Status ne 'open' ) {
+        $actions->{'C'} = { path => "Ticket/Display.html?Status=open&id=" . $id,
+                            title => loc('Open it') };
+    }
+}
+
+if ( $Ticket->CurrentUserHasRight('OwnTicket') ) {
+    if ( $Ticket->OwnerObj->id == $RT::Nobody->id ) {
+        $actions->{'D'} = { path => "Ticket/Display.html?Action=Take&id=" . $id,
+                            title => loc('Take') };
+    }
+    elsif ( $Ticket->OwnerObj->id != $session{CurrentUser}->id ) {
+        $actions->{'E'} = {path => "Ticket/Display.html?Action=Steal&id=" . $id,
+                           title => loc('Steal') };
+    }
+}
+
+if (    $Ticket->CurrentUserHasRight('ModifyTicket')
+     or $Ticket->CurrentUserHasRight('CommentOnTicket') ) {
+    $actions->{'F'} = { title => loc('Comment'),
+                        path  => "Ticket/Update.html?Action=Comment&id=" . $id,
+    };
+}
+}
+$tabs->{"g"} = { path      => 'Search/Listing.html',
+                 title     => loc('Search'),
+                 separator => 1,
+                 subtabs   => $searchtabs };
+</%INIT>
+
+  
+<%ARGS>
+$Ticket => undef
+$subtabs => undef
+$current_tab => undef
+$current_subtab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/Ticket/History.html b/rt/html/Ticket/History.html
new file mode 100644 (file)
index 0000000..cb02f1c
--- /dev/null
@@ -0,0 +1,52 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("Ticket History # [_1] [_2]", $Ticket->Id, $Ticket->Subject) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $Ticket, current_tab => 'Ticket/History.html?id='.$Ticket->id, 
+    Title => loc("Ticket History # [_1] [_2]", $Ticket->Id, $Ticket->Subject) &>
+
+<BR>
+      
+<& /Ticket/Elements/ShowHistory , Ticket => $Ticket, ShowHeaders => $ARGS{'ShowHeaders'}, URIFile => 'History.html' &> 
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
+
+<%INIT>
+
+  
+
+my $Ticket = LoadTicket ($id);
+
+unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+       Abort("No permission to view ticket");
+}
+
+</%INIT>
+
+
+
+
diff --git a/rt/html/Ticket/Modify.html b/rt/html/Ticket/Modify.html
new file mode 100644 (file)
index 0000000..c97fd09
--- /dev/null
@@ -0,0 +1,63 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc('Modify ticket #[_1]', $TicketObj->Id) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $TicketObj, current_subtab => "Ticket/Modify.html?id=".$TicketObj->Id, 
+    Title => loc('Modify ticket #[_1]', $TicketObj->Id) &>
+
+<& /Elements/ListActions, actions => \@results &>
+<FORM METHOD=POST ACTION="Modify.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$TicketObj->Id%>">
+
+<& /Elements/TitleBoxStart, title => loc('Modify ticket #[_1]',$TicketObj->Id),   color=> "#993333", width => "100%" &>
+<& Elements/EditBasics, TicketObj => $TicketObj &>
+<& Elements/EditCustomFields, TicketObj => $TicketObj &>
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/Submit, Label => loc('Save Changes'), Caption => loc("If you've updated anything above, be sure to"), color => "#993333" &>
+</form>
+<%INIT>
+  
+my $TicketObj = LoadTicket($id);
+my $CustomFields = $TicketObj->QueueObj->CustomFields();
+
+# Now let callbacks have a chance at editing %ARGS
+$m->comp('/Elements/Callback', TicketObj => $TicketObj, CustomFields => $CustomFields, %ARGS);
+
+my @results = ProcessTicketBasics(TicketObj => $TicketObj, ARGSRef => \%ARGS);
+my @cf_results = ProcessTicketCustomFieldUpdates(ARGSRef => \%ARGS);
+push (@results, @cf_results);
+
+# TODO: display the results, even if we can't display the ticket
+
+unless ($TicketObj->CurrentUserHasRight('ShowTicket')) {
+    Abort("No permission to view ticket");
+} 
+
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Ticket/ModifyAll.html b/rt/html/Ticket/ModifyAll.html
new file mode 100644 (file)
index 0000000..a506893
--- /dev/null
@@ -0,0 +1,158 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("Ticket #[_1] Jumbo update: [_2]", $Ticket->Id, $Ticket->Subject) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $Ticket, 
+    current_tab => "Ticket/ModifyAll.html?id=".$Ticket->Id, 
+    Title => loc("Ticket #[_1] Jumbo update: [_2]", $Ticket->Id, $Ticket->Subject) &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="ModifyAll.html" ENCTYPE="multipart/form-data">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>">
+
+
+<& /Elements/TitleBoxStart, title => loc('Modify ticket # [_1]', $Ticket->Id),   color=> "#993333", width => "100%" &>
+<& Elements/EditBasics, TicketObj => $Ticket &>
+<& Elements/EditCustomFields, TicketObj => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => loc('Dates'),  width => "100%", color => "#663366"  &>
+<& Elements/EditDates, TicketObj => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+
+<& /Elements/TitleBoxStart, title => loc('People'),width => "100%", color=> "#333399" &>
+<& Elements/EditPeople, Ticket => $Ticket, UserField => $UserField, UserString => $UserString, UserOp => $UserOp &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => loc('Relationships'), color => "#336633"&>
+<& Elements/EditLinks, Ticket => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => loc('Update ticket') &>
+<table>
+  <tr>
+    <td class="label"><&|/l&>Update Type</&>:</td>
+    <td class="entry">
+      <select name="UpdateType">
+% if ($CanComment) {
+        <option value="private" ><&|/l&>Comments (Not sent to requestors)</&></option>
+% }
+% if ($CanRespond) {
+        <option value="response"><&|/l&>Response to requestors</&></option>
+% }
+      </select> 
+    </td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Subject</&>:</td>
+    <td class="entry"><input name="UpdateSubject" size=60 value=""></td>
+  </tr>
+  <tr>
+    <td class="label"><&|/l&>Attach</&>:</td>
+    <td class="entry"><input name="UpdateAttachment" type=file></td>
+  </tr>
+  <tr>
+    <td class="labeltop"><&|/l&>Content</&>:</td>
+    <td class="entry"><& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &></td>
+  </tr>
+</table>
+<& /Elements/TitleBoxEnd &>
+  
+
+<& /Elements/Submit, Label => loc('Save Changes'), Caption => loc("If you've updated anything above, be sure to"), color => "#333399" &>
+</form>
+
+<%INIT>
+
+
+
+my $Ticket = LoadTicket($id);
+
+my $CanRespond = 0;
+my $CanComment = 0;
+
+
+$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or
+                     $Ticket->CurrentUserHasRight('ModifyTicket') ); 
+
+$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or
+                     $Ticket->CurrentUserHasRight('ModifyTicket') );
+
+
+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);
+    @dresults = ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS);
+    @lresults = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
+
+    $ARGS{'UpdateContent'} =~ s/\r\n/\n/g;
+
+    if ($ARGS{'UpdateContent'} && 
+       $ARGS{'UpdateContent'} ne '' && 
+       $ARGS{'UpdateContent'} ne  "-- \n" . 
+                               $session{'CurrentUser'}->UserObj->Signature
+       ) {
+        ProcessUpdateMessage(TicketObj => $Ticket, 
+                             ARGSRef=>\%ARGS, 
+                              Actions=>\@results);
+       }
+}
+push @results, @wresults;
+push @results, @dresults;
+push @results, @lresults;
+push @results, @cf_results;
+
+# If they've gone and moved the ticket to somewhere they can't see, etc...
+# TODO: display the results, even if we can't display the ticket.
+
+unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+   Abort("No permission to view ticket");
+}
+
+
+</%INIT>
+
+
+
+<%ARGS>
+$OnlySearchForPeople => undef
+$UserField => undef
+$UserOp => undef
+$UserString => undef
+$id => undef
+</%ARGS>
+
diff --git a/rt/html/Ticket/ModifyDates.html b/rt/html/Ticket/ModifyDates.html
new file mode 100644 (file)
index 0000000..3ccae44
--- /dev/null
@@ -0,0 +1,52 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc('Modify dates for #[_1]', $TicketObj->Id) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $TicketObj, 
+    current_tab => "Ticket/ModifyDates.html?id=".$TicketObj->Id, 
+    Title => loc('Modify dates for #[_1]', $TicketObj->Id) &> 
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="ModifyDates.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$TicketObj->Id%>">
+<& /Elements/TitleBoxStart, title => loc('Modify dates for ticket # [_1]', $TicketObj->Id),  width => "100%", color => "#663366"  &>
+
+<& Elements/EditDates, TicketObj => $TicketObj &>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, color => "#663366" &>
+</form>
+
+
+<%INIT>
+
+my $TicketObj = LoadTicket($id);
+my @results = ProcessTicketDates( TicketObj => $TicketObj, ARGSRef => \%ARGS);
+
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Ticket/ModifyLinks.html b/rt/html/Ticket/ModifyLinks.html
new file mode 100644 (file)
index 0000000..1d05008
--- /dev/null
@@ -0,0 +1,54 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("Link ticket #[_1]", $Ticket->Id) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $Ticket, 
+    current_tab => "Ticket/ModifyLinks.html?id=".$Ticket->Id, 
+    Title => loc("Link ticket #[_1]", $Ticket->Id) &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<form action="ModifyLinks.html" method="post">
+<input type="hidden" name="id" value="<%$Ticket->id%>">
+
+<& /Elements/TitleBoxStart, title => loc('Edit Relationships'), color => "#336633"&>
+<& Elements/EditLinks, Ticket => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, color => "#336633", Caption=> loc('Save Changes') &>
+</form>
+
+
+
+
+<%INIT>
+  
+my $Ticket = LoadTicket($id);
+my @results = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
+    
+</%INIT>
+      
+      
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/html/Ticket/ModifyPeople.html b/rt/html/Ticket/ModifyPeople.html
new file mode 100644 (file)
index 0000000..2e41664
--- /dev/null
@@ -0,0 +1,67 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc('Modify people related to ticket #[_1]', $Ticket->id) &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $Ticket, 
+    current_tab => "Ticket/ModifyPeople.html?id=".$Ticket->Id, 
+    Title => loc('Modify people related to ticket #[_1]', $Ticket->id) &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="ModifyPeople.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>">
+<& /Elements/TitleBoxStart, title => loc('Modify people related to ticket #[_1]', $Ticket->Id),   width => "100%", color=> "#333399" &>
+<& Elements/EditPeople, Ticket => $Ticket, UserField => $UserField, UserString => $UserString, UserOp => $UserOp, GroupString => $GroupString, GroupOp => $GroupOp, GroupField => $GroupField &> 
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, Label => loc('Save Changes'), Caption => loc("If you've updated anything above, be sure to"), color => "#333399" &>
+</form>
+
+<%INIT>
+
+my (@results, @wresults);
+
+my $Ticket = LoadTicket($id);
+
+# if we're trying to search for watchers and nothing else
+unless ($OnlySearchForPeople) {
+    @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS);
+    @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS);
+}
+
+push @results, @wresults;
+</%INIT>
+
+
+
+<%ARGS>
+$OnlySearchForPeople => undef
+$UserField => undef
+$UserOp => undef
+$UserString => undef
+$GroupField => undef
+$GroupOp => undef
+$GroupString => undef
+$id => undef
+</%ARGS>
+
diff --git a/rt/html/Ticket/Update.html b/rt/html/Ticket/Update.html
new file mode 100644 (file)
index 0000000..e19aacf
--- /dev/null
@@ -0,0 +1,205 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => $title &>
+<& /Ticket/Elements/Tabs, 
+    Ticket => $Ticket , 
+    Title=> $title &>
+
+<FORM ACTION="Update.html" NAME="TicketUpdate" 
+       METHOD=POST enctype="multipart/form-data">
+<input type="hidden" name="QuoteTransaction" value="<% $ARGS{QuoteTransaction} %>">
+<input type="hidden" name="DefaultStatus" value="<% $DefaultStatus %>">
+<input type="hidden" name="Action" value="<% $ARGS{Action} %>">
+<font size=-1>
+
+<TABLE>
+<TR><TD>
+<a href="ModifyPeople.html?id=<%$Ticket->Id%>"><&|/l&>Ticket watchers</&></A></TD><TD align=right>
+<&|/l&>Requestor</&>:
+</TD><TD>
+<b><% $Ticket->RequestorAddresses %></b>
+</TD></TR>
+<TR><TD>&nbsp;</TD><TD align=right>
+<&|/l&>Cc</&>:
+</TD><TD>
+<b><% $Ticket->CcAddresses %></b>
+</TD></TR>
+<TR><TD>&nbsp;</TD><TD align=right>
+<&|/l&>AdminCc</&>:
+</TD><TD>
+<b><% $Ticket->AdminCcAddresses %></b>
+</TD></TR>
+</TR>
+</TABLE>
+<hr>
+
+<TABLE BORDER=0>
+
+<tr><td align=right><&|/l&>Status</&>:</td>
+<td>
+<& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &>
+<&|/l&>Owner</&>:  
+<& /Elements/SelectOwner, Name=>"Owner", Default => ($ARGS{'Owner'} || $Ticket->OwnerObj->Id()), QueueObj => $Ticket->QueueObj, TicketObj => $Ticket &>
+<&|/l&>Worked</&>: <input size=4 name="UpdateTimeWorked" value="<% $ARGS{UpdateTimeWorked}%>"> <&|/l&>minutes</&></td></tr>
+<tr><td align=right><&|/l&>Update Type</&>:</td>
+<td><select name="UpdateType">
+% if ($CanComment) {
+  <option value="private" <%$CommentDefault%>><&|/l&>Comments (Not sent to requestors)</&></option>
+% }
+% if ($CanRespond) {
+   <option value="response" <%$ResponseDefault%>><&|/l&>Response to requestors</&></option>
+% }
+</select> 
+</td></tr>
+<tr><td align=right><&|/l&>Subject</&>:</td><td> <input name="UpdateSubject" size=60 value="<% ($ARGS{UpdateSubject}) ? $ARGS{UpdateSubject} : $Ticket->Subject()%>"></td></tr>
+<tr><td align=right><&|/l&>Cc</&>:</td><td> <input name="UpdateCc" size=60
+value=<% $ARGS{UpdateCc} %>><BR>
+<i><font size=-2>
+<&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)</&></font></i>
+</td></tr>
+<tr><td align=right><&|/l&>Bcc</&>:</td><td> <input name="UpdateBcc" size=60 VALUE="<%$ARGS{UpdateBcc}%>"><BR>
+<i><font size=-2>
+<&|/l&>(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)</&></font></i>
+</td></tr>
+% if (exists $session{'Attachments'}) {
+<TD>
+<&|/l&>Attached file</&>:
+</TD>
+<TD COLSPAN=5>
+<&|/l&>Check box to delete</&><BR>
+% foreach my $attach_name (keys %{$session{'Attachments'}}) {
+<input type="checkbox" name="DeleteAttach-<%$attach_name%>"><%$attach_name%><BR>
+% } # end of foreach
+</TD>
+</TR>
+<TR>
+% } # end of if
+<tr><td align=right><&|/l&>Attach</&>:</td><td><input name="Attach" type="file"><INPUT TYPE=SUBMIT NAME="AddMoreAttach" VALUE="<&|/l&>Add More Files</&>"><input type="hidden" name="UpdateAttach" value="1">
+</td></tr>
+<tr><td align="right" valign="top"><&|/l&>Message</&>:</td><td>
+<& /Elements/Callback, _CallbackName => 'BeforeMessageBox', %ARGS &>
+% if (exists $ARGS{UpdateContent}) {
+% delete $ARGS{'QuoteTransaction'};
+<& /Elements/MessageBox, Name=>"UpdateContent", Default=>$ARGS{UpdateContent}, %ARGS&>
+% } else {
+<& /Elements/MessageBox, Name=>"UpdateContent", %ARGS &>
+% }
+</td></tr>
+               <INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"><br>
+</table>
+
+
+
+
+<& /Elements/Submit, Name => 'SubmitTicket' &>
+  </FORM>
+
+
+
+<%INIT>
+
+my $CanRespond = 0;
+my $CanComment = 0;
+my $title;
+
+my $Ticket = LoadTicket($id);
+
+unless($DefaultStatus){
+    $DefaultStatus=($ARGS{'Status'} ||$Ticket->Status());
+}
+
+if ($DefaultStatus =~ '^new$'){
+        $DefaultStatus='open';
+}
+
+if ($DefaultStatus eq 'resolved') {
+    $title = loc("Resolve ticket #[_1] ([_2])", $Ticket->id, $Ticket->Subject);
+} else {
+    $title = loc("Update ticket #[_1] ([_2])", $Ticket->id, $Ticket->Subject);
+}
+
+# Things needed in the template - we'll do the processing here, just
+# for the convenience:
+
+my ($CommentDefault, $ResponseDefault);
+if (($Action eq 'Comment') or ($ARGS{'UpdateType'} eq 'private')) {
+   $CommentDefault = "SELECTED"; 
+} else {
+    $ResponseDefault = "SELECTED";
+}
+
+
+$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or
+                     $Ticket->CurrentUserHasRight('ModifyTicket') ); 
+
+$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or
+                     $Ticket->CurrentUserHasRight('ModifyTicket') ); 
+
+
+# {{{ deal with deleting uploaded attachments
+foreach my $key (keys %ARGS) {
+    if ($key =~ m/^DeleteAttach-(.+)$/) {
+       delete $session{'Attachments'}{$1};
+    }
+    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
+}
+
+# {{{ 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 };
+}
+# }}}
+
+# delete temporary storage entry to make WebUI clean
+unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) {
+    delete $session{'Attachments'};
+}
+# }}}
+
+if ( exists $ARGS{SubmitTicket} ) {
+    $m->comp('Display.html', %ARGS);
+    return;
+}
+</%INIT>
+
+<%ARGS>
+$id => undef
+$Action => undef
+$DefaultStatus => undef
+</%ARGS>
diff --git a/rt/html/User/Delegation.html b/rt/html/User/Delegation.html
new file mode 100644 (file)
index 0000000..c036f78
--- /dev/null
@@ -0,0 +1,83 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => loc("Delegate rights") &>
+<& /User/Elements/Tabs, 
+    current_tab => 'User/Delegation.html', 
+    Title => loc("Delegate rights") &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<form method="post">
+<& Elements/DelegateRights, personalgroups => $personalgroups, objects => $objects, ObjectType => 'RT::System' &>
+<& Elements/DelegateRights, personalgroups => $personalgroups, objects => $objects, ObjectType => 'RT::Queue' &>
+<& Elements/DelegateRights, personalgroups => $personalgroups, objects => $objects, ObjectType => 'RT::Group' &>
+
+<& /Elements/Submit &>
+</form>
+<%INIT>
+
+my (@results, $arg);
+foreach $arg (keys %ARGS) {
+    next unless ($arg =~ /^Delegate-Existing-ACE-(\d+)-to-(\d+)-as-(\d+)$/);
+       my $parent = $1;
+       my $principal = $2;
+       my $delegation = $3;
+       unless ($ARGS{"Delegate-ACE-$1-to-$2"}) {
+            my $ace_to_del = RT::ACE->new($session{'CurrentUser'});
+            $ace_to_del->Load($delegation);
+            my ($delval, $delmsg) = $ace_to_del->Delete();
+            push (@results, $delmsg);
+       }
+}
+
+foreach $arg (keys %ARGS) { 
+    next unless ($arg =~ /^Delegate-ACE-(\d+)-to-(\d+)$/);
+    my $parent = $1;
+    my $principal = $2;
+    # if we already delegate it, we just don't care
+    next if (grep /^Delegate-Existing-ACE-$parent-to-$principal-/, keys %ARGS);
+    my $ace = RT::ACE->new($session{'CurrentUser'});
+    $ace->Load($1);
+    unless ($ace->Id) {
+        push (@results, loc('Right not found'));
+        next;
+    }
+    my ($delid, $delmsg) = $ace->Delegate(PrincipalId => $principal);
+    push (@results, $delmsg);
+}
+
+my $personalgroups = RT::Groups->new($session{'CurrentUser'});
+$personalgroups->LimitToPersonalGroupsFor($session{'CurrentUser'}->PrincipalId);
+
+my $objects;
+my $acl = RT::ACL->new ($session{'CurrentUser'});
+$acl->ExcludeDelegatedRights();
+$acl->LimitToPrincipal(Id => $session{'CurrentUser'}->PrincipalId, 
+                       IncludeGroupMembership => 1
+                       );
+
+while(my $right = $acl->Next) {
+       push @{$objects->{$right->ObjectType}{$right->ObjectId}},$right;
+}
+</%INIT>
diff --git a/rt/html/User/Elements/DelegateRights b/rt/html/User/Elements/DelegateRights
new file mode 100644 (file)
index 0000000..7ff8328
--- /dev/null
@@ -0,0 +1,85 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<h2><%$sectionheading%></h2>
+<%perl>
+
+foreach my $object (keys %{$objects->{$ObjectType}}) {
+unless ($ObjectType eq 'RT::System') {
+my $object_obj = @{$objects->{$ObjectType}{$object}}[0]->Object;
+
+</%perl>
+<h3><% $object_obj->Name %></h3>
+% }
+<table width="100%" border="0" cellspacing="0" cellpadding="3">
+<tr>
+        <th width=15%><&|/l&>Personal groups:</&></th>
+% while (my $pg = $personalgroups->Next) {
+<th><%$pg->Name%></th>
+% }
+</tr>
+<%perl>
+my $i;
+foreach my $right (@{$objects->{$ObjectType}{$object}}) {
+my $delegations = RT::ACL->new($session{'CurrentUser'});
+$delegations->DelegatedBy( Id => $session{'CurrentUser'}->PrincipalId);
+$delegations->DelegatedFrom ( Id => $right->Id);
+
+my $del_hash = {};
+while ( my $delegation = $delegations->Next) {
+        $del_hash->{$delegation->PrincipalId} = $delegation;
+}
+</%perl>
+% $i++;
+%
+<tr class="<%($i%2) && 'oddline'%>">
+<td>
+<% loc($right->RightName) %><br>
+<div align=right><font size="-2" color="#999999"><&|/l, $right->PrincipalObj->Object->SelfDescription &>as granted to [_1]</&></font></div>
+       </td>
+% while (my $pg = $personalgroups->Next) {
+<td align=center>
+        <input name="Delegate-ACE-<% $right->Id %>-to-<% $pg->PrincipalId%>" type=checkbox <%$ del_hash->{$pg->PrincipalId} && 'CHECKED' %>>
+% if ( $del_hash->{$pg->PrincipalId}) {
+<input type=hidden name="Delegate-Existing-ACE-<% $right->Id %>-to-<% $pg->PrincipalId%>-as-<%$del_hash->{$pg->PrincipalId}->Id%>">
+% }
+</td>
+% }
+<td>&nbsp;</td>
+</tr>
+%}
+</table> 
+% }
+<%init>
+
+my $sectionheading = loc("[_1] rights", loc($ObjectType =~ /^RT::(.*)$/));
+# 'System' # loc
+# 'Group'  # loc
+# 'Queue'  # loc
+
+</%init>
+<%args>
+$ObjectType => undef
+$objects => undef
+$personalgroups => undef
+</%args>
diff --git a/rt/html/User/Elements/GroupTabs b/rt/html/User/Elements/GroupTabs
new file mode 100644 (file)
index 0000000..89d7125
--- /dev/null
@@ -0,0 +1,60 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /User/Elements/Tabs, 
+    subtabs => $tabs, 
+    current_tab => 'User/Groups/', 
+    current_subtab => $current_subtab, 
+    Title => $Title &>
+
+<%INIT>
+my $tabs;
+if ( $GroupObj and $GroupObj->id ) {
+    $tabs->{"this"} = {
+        title   => $GroupObj->Name,
+        path    => "User/Groups/Modify.html?id=" . $GroupObj->id,
+        subtabs => {
+            Basics => { title => loc('Basics'),
+                        path  => "User/Groups/Modify.html?id=" . $GroupObj->id
+            },
+
+            Members => { title => loc('Members'),
+                         path  => "User/Groups/Members.html?id=" . $GroupObj->id
+            },
+
+        } };
+        $tabs->{'this'}->{'current_subtab'} = $current_subtab;
+         $current_subtab = "User/Groups/Modify.html?id=" . $GroupObj->id,
+}
+$tabs->{"A"} = { title => loc('Select group'),
+                 path  => "User/Groups/index.html" };
+$tabs->{"B"} = { title     => loc('New group'),
+                 path      => "User/Groups/Modify.html?Create=1",
+                 separator => 1 };
+
+</%INIT>
+<%ARGS>
+$GroupObj => undef
+$current_subtab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/User/Elements/Tabs b/rt/html/User/Elements/Tabs
new file mode 100644 (file)
index 0000000..195cf1c
--- /dev/null
@@ -0,0 +1,56 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Tabs, 
+    tabs => $tabs, 
+    current_toptab => 'User/Prefs.html', 
+    current_tab => $current_tab, 
+    Title => $Title &>
+
+<%INIT>
+  my $tabs = { a => { title => loc('About me'),
+                         path => 'User/Prefs.html',
+                       },
+              g => { title => loc('Personal Groups'),
+                          path => 'User/Groups/',
+                        },
+              h => { title => loc('Delegation'),
+                          path => 'User/Delegation.html',
+                        },
+            };
+
+  foreach my $tab (sort keys %{$tabs}) {
+    if ($tabs->{$tab}->{'path'} eq $current_tab) {
+      $tabs->{$tab}->{"subtabs"} = $subtabs;
+      $tabs->{$tab}->{"current_subtab"} = $current_subtab;
+    }
+  }
+</%INIT>
+
+
+<%ARGS>
+$subtabs => undef
+$current_tab => undef
+$current_subtab => undef
+$Title => undef
+</%ARGS>
diff --git a/rt/html/User/Groups/Members.html b/rt/html/User/Groups/Members.html
new file mode 100644 (file)
index 0000000..db83b8c
--- /dev/null
@@ -0,0 +1,136 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => $title &>
+<& /User/Elements/GroupTabs, 
+    GroupObj => $Group, 
+    current_subtab => "User/Groups/Members.html?id=".$Group->id, 
+    Title => $title &>
+<& /Elements/ListActions, actions => \@results &>
+
+
+
+<FORM ACTION="<%$RT::WebPath%>/User/Groups/Members.html" METHOD="POST">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Group->Id%>">
+<TABLE WIDTH="100%">
+<TR>
+<TD>
+<&|/l&>Add members</&>
+</TD>
+<TD>
+<&|/l&>Current members</&>
+</TD>
+</TR>
+
+<TR>
+<TD VALIGN=TOP>
+<& /Admin/Elements/SelectNewGroupMembers, Name => "AddMembers", Group => $Group &>
+</TD>
+<TD VALIGN=TOP>
+
+% if ($Group->MembersObj->Count == 0 ) {
+<i><&|/l&>(No members)</&></i>
+% } else {
+<i><&|/l&>(Check box to delete)</&></i>
+<br>
+<br>
+<&|/l&>Users</&>
+% my $UserMembers = $Group->MembersObj;
+% $UserMembers->LimitToUsers();
+<UL>
+% while (my $member = $UserMembers->Next()) {
+<LI><INPUT TYPE=CHECKBOX Name="DeleteMember-<%$member->MemberId%>">
+<%$member->MemberObj->Object->Name%> (<%$member->MemberObj->Object->RealName%>)
+% }
+</ul>
+<&|/l&>Groups</&>
+<ul>
+% my $GroupMembers = $Group->MembersObj;
+% $GroupMembers->LimitToGroups();
+% while (my $member = $GroupMembers->Next()) {
+<LI><INPUT TYPE=CHECKBOX Name="DeleteMember-<%$member->MemberId%>">
+<%$member->MemberObj->Object->Name%>
+% }
+% }
+</UL>
+</TD>
+</TR>
+</TABLE>
+<& /Elements/Submit &>
+</form>
+
+
+<%INIT>
+
+my $Group = new RT::Group($session{'CurrentUser'});
+$Group->Load($id) ;
+
+unless ($Group->id) {
+    Abort(loc('Could not load group'));
+}
+
+my (@results);
+
+foreach my $key (keys %ARGS) {
+
+if ($key =~ /^DeleteMember-(\d+)$/) {
+    my $mem_id = $1; 
+    my ($val,$msg) = $Group->DeleteMember($mem_id);
+    push (@results, $msg);
+}
+}
+
+# Make sure AddMembers is always an array
+my @AddMembersUsers = (ref $AddMembersUsers eq 'ARRAY') ? @{$AddMembersUsers} : ($AddMembersUsers);
+my @AddMembersGroups = (ref $AddMembersGroups eq 'ARRAY') ? @{$AddMembersGroups} : ($AddMembersGroups);
+
+foreach my $member (@AddMembersUsers, @AddMembersGroups) {
+    next unless ($member);
+
+    my $principal;
+
+    if ($member =~ /^Group-(\d+)$/) {
+        $principal = RT::Group->new($session{'CurrentUser'});
+        $principal->Load($1);
+    } elsif ($member =~ /^User-(\d+)$/) {
+        $principal = RT::User->new($session{'CurrentUser'});
+        $principal->Load($1);
+    } else {
+        next;
+    }
+
+
+    my ($val, $msg) = $Group->AddMember($principal->PrincipalId);
+    push (@results, $msg);
+}
+
+
+my $title = loc('Editing membership for personal group [_1]', $Group->Name);
+
+</%INIT>
+
+<%ARGS>
+$AddMembersUsers => undef
+$AddMembersGroups => undef
+$id => undef
+</%ARGS>
diff --git a/rt/html/User/Groups/Modify.html b/rt/html/User/Groups/Modify.html
new file mode 100644 (file)
index 0000000..f731e1a
--- /dev/null
@@ -0,0 +1,133 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => $title &>
+
+<& /User/Elements/GroupTabs, 
+    GroupObj => $Group, 
+    current_subtab => $current_tab, 
+    Title => $title &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+
+<FORM ACTION="<%$RT::WebPath%>/User/Groups/Modify.html" METHOD=POST>
+
+%unless ($Group->Id) {
+<INPUT TYPE=HIDDEN NAME=id VALUE="new">
+% } else {
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Group->Id%>">
+% }
+<TABLE>
+<TR><TD ALIGN=RIGHT>
+<&|/l&>Name</&>:
+</TD>
+<TD><INPUT name="Name" value="<%$Group->Name%>"></TD>
+</TR><TR>
+<TD ALIGN=RIGHT>
+<&|/l&>Description</&>:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$Group->Description%>" size=60></TD>
+</TR><TR>
+<TD COLSPAN=2>
+<INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1">
+<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>> <&|/l&>Enabled (Unchecking this box disables this group)</&><BR>
+</TR>
+</TABLE>
+<& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
+</form>
+<%INIT>
+
+my $current_tab;
+my  ($title, @results, $Disabled, $EnabledChecked);
+
+my $Group = RT::Group->new($session{'CurrentUser'});
+
+if ($Create) {
+    $current_tab = 'User/Groups/Modify.html?Create=1';
+    $title = loc("Create a new personal group");
+} 
+else {
+    if ( $id eq 'new' ) {
+
+        my ( $id, $msg ) = $Group->CreatePersonalGroup(
+                             Name        => "$Name",
+                             PrincipalId => $session{'CurrentUser'}->PrincipalId
+        );
+        unless ($id) {
+            Abort( loc("Could not create group") );
+        }
+        $id = $Group->Id;
+    }
+    else {
+        $Group->Load($id) || Abort( loc('Could not load group') );
+    }
+
+    if ($id) {
+        $title = loc( "Modify the group [_1]", $Group->Name );
+
+    }
+
+    # If the create failed
+    else {
+        $title  = loc("Create a new personal group");
+        $Create = 1;
+    }
+
+    $current_tab = 'User/Groups/Modify.html?id=' . $Group->Id;
+}
+
+if ($id) {
+    
+    my @fields = qw(Description Name );
+    my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields,
+                                           Object => $Group,
+                                           ARGSRef => \%ARGS );
+    push (@results,@fieldresults);
+}
+
+#we're asking about enabled on the web page but really care about disabled.
+if ($Enabled == 1) {
+    $Disabled = 0;
+}      
+else {
+    $Disabled = 1;
+}
+if  ( ($SetEnabled) and ( $Disabled != $Group->Disabled) ) { 
+    my  ($code, $msg) = $Group->SetDisabled($Disabled);
+    push @results, loc('Enabled status [_1]', loc_fuzzy($msg));
+}
+
+unless ($Group->Disabled()) {
+    $EnabledChecked ="CHECKED";
+}
+
+</%INIT>
+
+
+<%ARGS>
+$Create => undef
+$Name => undef
+$Description => undef
+$SetEnabled => undef
+$Enabled => undef
+$id => undef
+</%ARGS>
diff --git a/rt/html/User/Groups/index.html b/rt/html/User/Groups/index.html
new file mode 100644 (file)
index 0000000..12b43b4
--- /dev/null
@@ -0,0 +1,43 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title => $title &>
+<& /User/Elements/GroupTabs, 
+    current_subtab => 'User/Groups/index.html', 
+    Title => $title &>
+
+<&|/l&>Personal groups</&>:<BR>
+<UL>
+%while ( my $Group = $Groups->Next) {
+<LI><A HREF="Modify.html?id=<%$Group->id%>"><%$Group->Name || loc('(empty)')%></a><BR>
+%}
+</UL>
+
+<%INIT>
+my $Groups = RT::Groups->new($session{'CurrentUser'});
+$Groups->LimitToPersonalGroupsFor($session{'CurrentUser'}->PrincipalId());
+my $title = loc('Personal groups');
+
+</%INIT>
+<%ARGS>
+</%ARGS>
diff --git a/rt/html/User/Prefs.html b/rt/html/User/Prefs.html
new file mode 100644 (file)
index 0000000..b89fc40
--- /dev/null
@@ -0,0 +1,218 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title=>loc("Preferences") &>
+<& /User/Elements/Tabs, 
+    current_tab => 'User/Prefs.html', 
+    Title=>loc("Preferences") &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM ACTION="<%$RT::WebPath%>/User/Prefs.html" METHOD=POST>
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>">
+
+<TABLE WIDTH=100% BORDER=0>
+<TR>
+
+<TD VALIGN=TOP ROWSPAN=2>
+<& /Elements/TitleBoxStart, title => loc('Identity') &>
+
+<input type=hidden name="Name" value="<%$UserObj->Name%>">
+<&|/l&>Email</&>: <input name="EmailAddress" value="<%$UserObj->EmailAddress%>">
+<BR>
+<&|/l&>Real Name</&>: <input name="RealName" value="<%$UserObj->RealName%>"> 
+<BR>
+<&|/l&>Nickname</&>: <input name="NickName" value="<%$UserObj->NickName%>">
+<& /Elements/TitleBoxEnd &>
+<br>
+<& /Elements/TitleBoxStart, title => loc('Phone numbers') &>
+<&|/l&>Residence</&>: <input name="HomePhone" value="<%$UserObj->HomePhone%>" size=13>
+<BR>
+<&|/l&>Work</&>: <input name="WorkPhone" value="<%$UserObj->WorkPhone%>" size=13>
+<BR>
+<&|/l&>Mobile</&>: <input name="MobilePhone" value="<%$UserObj->MobilePhone%>" size=13>
+<BR>
+<&|/l&>Pager</&>: <input name="PagerPhone" value="<%$UserObj->PagerPhone%>" size=13>
+<& /Elements/TitleBoxEnd &>
+</TD>
+<TD VALIGN=TOP>
+% unless ($RT::WebExternalAuth and !$RT::WebFallbackToInternalAuth) {
+<& /Elements/TitleBoxStart, title => loc('Password') &>
+<TABLE>
+<TR>
+<TD ALIGN=RIGHT>
+<&|/l&>New Password</&>:
+</TD>
+<TD ALIGN=LEFT>
+<input type=password name="Pass1">
+</TD>
+</TR>
+<TR><TD ALIGN=RIGHT>
+<&|/l&>Retype Password</&>:
+</TD>
+<TD>
+<input type=password name="Pass2">
+</TD>
+</TR>
+</TABLE>
+% }
+<& /Elements/TitleBoxEnd &>
+</TD>
+<TR>
+
+<TD VALIGN=TOP>
+<& /Elements/TitleBoxStart, title => loc('Location') &>
+<&|/l&>Organization</&>: <input name="Organization" value="<%$UserObj->Organization%>">
+<BR>
+<&|/l&>Address1</&>: <input name="Address1" value="<%$UserObj->Address1%>">
+<BR>
+<&|/l&>Address2</&>: <input name="Address2" value="<%$UserObj->Address2%>">
+<BR>
+<&|/l&>City</&>: <input name="City" value="<%$UserObj->City%>" size=14>
+
+<&|/l&>State</&>: <input name="State" value="<%$UserObj->State%>" size=3>
+
+<&|/l&>Zip</&>: <input name="Zip" value="<%$UserObj->Zip%>" size=9>
+<BR>
+<&|/l&>Country</&>: <input name="Country" value="<%$UserObj->Country%>">
+<BR>
+
+
+<& /Elements/TitleBoxEnd &>
+</TD>
+</TR>
+<TR>
+
+
+
+<TD COLSPAN=2 VALIGN=TOP>
+%if ($UserObj->Privileged) {
+<BR>
+<& /Elements/TitleBoxStart, title => loc('Signature') &>
+<TEXTAREA COLS=80 ROWS=5 name="Signature" WRAP=HARD>
+<%$UserObj->Signature%></TEXTAREA>
+<& /Elements/TitleBoxEnd &>
+% }
+
+</TD>
+
+</TR>
+</TABLE>
+
+
+<& /Elements/Submit &>
+</form>
+
+
+<%INIT>
+
+my $UserObj = new RT::User($session{'CurrentUser'});
+my ($title, $PrivilegedChecked, $EnabledChecked, $Disabled, $result, @results);
+
+my ($val, $msg);
+
+
+       $UserObj->Load($id) || $UserObj->Load($Name) || Abort("Couldn't load user '$Name'");
+       $val = $UserObj->Id();
+    
+
+
+
+
+
+# If we have a user to modify, lets try. 
+if ($UserObj->Id) {
+    
+    my @fields = qw(Name Comments Signature EmailAddress FreeformContactInfo 
+                   Organization RealName NickName Lang EmailEncoding WebEncoding 
+                   ExternalContactInfoId ContactInfoSystem Gecos ExternalAuthId 
+                   AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1
+               Address2 City State Zip Country 
+                  );
+    
+    my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields,
+                                           Object => $UserObj,
+                                           ARGSRef => \%ARGS );
+    push (@results,@fieldresults);
+
+
+# {{{ Deal with special fields: Privileged, Enabled and Password
+if  ( ($SetPrivileged) and ( $Privileged != $UserObj->Privileged) ) {
+my  ($code, $msg) = $UserObj->SetPrivileged($Privileged);
+     push @results, loc('Privileged status: [_1]', loc_fuzzy($msg));
+}
+
+
+
+#TODO: make this report errors properly
+if ((defined $Pass1) and ($Pass1 ne '') and ($Pass1 eq $Pass2) and (!$UserObj->IsPassword($Pass1))) {
+    my ($code, $msg);
+    ($code, $msg) = $UserObj->SetPassword($Pass1);
+    push @results, loc('Password: [_1]', loc_fuzzy($msg));
+} elsif ( $Pass1 && ($Pass1 ne $Pass2)) {
+    push @results, loc("Passwords do not match. Your password has not been changed");
+}
+
+# }}}
+}
+
+
+</%INIT>
+
+
+<%ARGS>
+$id => $session{'CurrentUser'}->Id
+$Name  => undef
+$Comments  => undef
+$Signature  => undef
+$EmailAddress  => undef
+$FreeformContactInfo => undef
+$Organization  => undef
+$RealName  => undef
+$NickName  => undef
+$Privileged => undef
+$SetPrivileged => undef
+$Enabled => undef
+$SetEnabled => undef
+$Lang  => undef
+$EmailEncoding  => undef
+$WebEncoding => undef
+$ExternalContactInfoId  => undef
+$ContactInfoSystem  => undef
+$Gecos => undef
+$ExternalAuthId  => undef
+$AuthSystem  => undef
+$HomePhone => undef
+$WorkPhone  => undef
+$MobilePhone  => undef
+$PagerPhone  => undef
+$Address1 => undef
+$Address2  => undef
+$City  => undef
+$State  => undef
+$Zip  => undef
+$Country => undef
+$Pass1 => undef
+$Pass2=> undef
+$Create=> undef
+</%ARGS>
diff --git a/rt/html/autohandler b/rt/html/autohandler
new file mode 100644 (file)
index 0000000..ce8b756
--- /dev/null
@@ -0,0 +1,178 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<%INIT>
+
+# Roll back any dangling transactions from a previous failed connection
+$RT::Handle->ForceRollback() if $RT::Handle->TransactionDepth;
+
+
+local *session;
+%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
+    my $type = ref($_);
+    (!$type)
+       ? Encode::decode(utf8 => $_, Encode::FB_PERLQQ) :
+    ($type eq 'ARRAY')
+       ? [ map { ref($_) ? $_ : Encode::decode(utf8 => $_, Encode::FB_PERLQQ) } @$_ ] :
+    ($type eq 'HASH')
+       ? { map { ref($_) ? $_ : Encode::decode(utf8 => $_, Encode::FB_PERLQQ) } %$_ } : $_
+} %ARGS;
+
+if ($ARGS{'Debug'}) {
+        require Time::HiRes;
+        $m->{'rt_base_time'} = [Time::HiRes::gettimeofday()];
+        
+}
+else {
+        $m->{'rt_base_time'} = time;
+}
+$m->comp('/Elements/SetupSessionCookie', %ARGS);
+
+unless ($session{'CurrentUser'} && $session{'CurrentUser'}->Id) {
+    $session{'CurrentUser'} = RT::CurrentUser->new();
+}
+
+# Set the proper encoding for the current language handle
+$r->content_type("text/html; charset=utf-8");
+
+# If it's a noauth file, don't ask for auth.
+if ($m->base_comp->path =~ '^/+NoAuth/' ||
+    $m->base_comp->path =~ '^/+REST/\d+\.\d+/NoAuth/')
+{
+    $m->call_next(%ARGS);
+    $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;
+           }
+           elsif ($^O eq 'MSWin32' and eval 'use Net::AdminMisc; 1') {
+               # Populate fields with information from NT domain controller
+           }
+
+           $session{'CurrentUser'}->Load($user);
+       }
+       else {
+           delete $session{'CurrentUser'};
+           $m->abort() unless $RT::WebFallbackToInternalAuth;
+           $m->comp('/Elements/Login', %ARGS, Error=> loc('Cannot create user: [_1]', $msg));
+       }
+    }
+
+    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();
+       }
+    }
+}
+
+delete $session{'CurrentUser'}
+    unless $session{'CurrentUser'} and defined $session{'CurrentUser'}->Id;
+
+# Process per-page authentication callbacks
+$m->comp('/Elements/Callback', %ARGS, _CallbackName => 'Auth');
+
+# If the user is logging in, let's authenticate
+if (!$session{'CurrentUser'} && defined ($user) && defined ($pass) ){
+    $session{'CurrentUser'} = RT::CurrentUser->new();
+    $session{'CurrentUser'}->Load($user);
+
+    if (!$session{'CurrentUser'}->id() ||
+        !$session{'CurrentUser'}->IsPassword($pass))
+    {
+        delete $session{'CurrentUser'};
+        $m->comp('/Elements/Login', %ARGS,
+                 Error => loc('Your username or password is incorrect'));
+        $m->abort();
+    }
+}
+  
+# If we've got credentials, let's serve the file up.
+if ( (defined $session{'CurrentUser'}) and 
+     ( $session{'CurrentUser'}->Id) ) {
+    
+    # Process per-page global callbacks
+    $m->comp('/Elements/Callback', %ARGS);
+
+    # If the user isn't privileged, they can only see SelfService
+    if ((! $session{'CurrentUser'}->Privileged) and
+       ($m->base_comp->path !~ '^(/+)SelfService/') ) {
+       $m->comp('/SelfService/index.html');
+       $m->abort();
+    }
+    else {
+       $m->call_next(%ARGS);
+    }
+}
+
+# If we have no credentials
+else {
+    $m->comp('/Elements/Login', %ARGS);
+    $m->abort();
+}
+</%INIT>
+<& /Elements/Footer, %ARGS &>
+<%ARGS>
+$user => undef
+$pass => undef
+$menu => undef
+</%ARGS>
diff --git a/rt/html/index.html b/rt/html/index.html
new file mode 100644 (file)
index 0000000..39eac8d
--- /dev/null
@@ -0,0 +1,84 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+<& /Elements/Header, Title=>loc("RT at a glance"), Refresh => $session{'home_refresh_interval'} &>
+<& /Elements/Tabs, 
+    current_toptab => '', 
+    Title=>loc("RT at a glance") &>
+<TABLE BORDER=0 WIDTH=100%>
+<TR VALIGN=TOP>
+<TD WIDTH=70%>
+<& /Elements/MyTickets &>
+<BR>
+<& /Elements/MyRequests &>
+</TD>
+<TD>
+<& /Elements/Quicksearch &>
+<BR>
+<form method=get action="index.html">
+<& /Elements/Refresh, Name => 'HomeRefreshInterval', Default => $session {'home_refresh_interval'} &>
+<div align=right><input type=submit value="<&|/l&>Go!</&>"></div>
+</form>
+</TD>
+</TR>
+</TABLE>
+<%init>
+if ( $ARGS{'q'} ) {
+    my $query = $ARGS{'q'};
+
+    if ( $query =~ m/^\s*(\d+)\s*$/ ) {
+        $m->redirect("$RT::WebPath/Ticket/Display.html?id=$1");
+    }
+
+    $session{'tickets'} = RT::Tickets->new( $session{'CurrentUser'} );
+
+    if ( $query =~ m/\@/ ) {
+        $session{'tickets'}->LimitRequestor( VALUE    => $query,
+                                             OPERATOR => '=', );
+        $m->redirect("$RT::WebPath/Search/Listing.html");
+    }
+
+    #
+    # Any search on queue name or subject will be for new/open tickets
+    # only.
+    #
+    $session{'tickets'}->LimitStatus( VALUE    => $_,
+                                      OPERATOR => '=', ) for qw(open new);
+
+    my $queue = RT::Queue->new( $session{'CurrentUser'} );
+    if ( $queue->Load($query) && $queue->Id ) {
+        $session{'tickets'}->LimitQueue( VALUE    => $queue->Id,
+                                         OPERATOR => '=', );
+        $m->redirect("$RT::WebPath/Search/Listing.html");
+    }
+    $session{'tickets'}->LimitSubject( VALUE    =>  $query,
+                                       OPERATOR => 'LIKE' );
+
+    $m->redirect("$RT::WebPath/Search/Listing.html");
+}
+
+if ($ARGS{'HomeRefreshInterval'}) {
+       $session{'home_refresh_interval'} = $ARGS{'HomeRefreshInterval'};
+}
+
+</%init>
diff --git a/rt/html/l b/rt/html/l
new file mode 100644 (file)
index 0000000..712e38d
--- /dev/null
+++ b/rt/html/l
@@ -0,0 +1,26 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (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
+% my $hand = ($session{'CurrentUser'} ||= RT::CurrentUser->new)->LanguageHandle;
+% $m->print($hand->maketext($m->content,@_));
+% return(1);
diff --git a/rt/install-sh b/rt/install-sh
new file mode 100644 (file)
index 0000000..11870f1
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       :
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=$mkdirprog
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f "$src" ] || [ -d "$src" ]
+       then
+               :
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               :
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               :
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+       '
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               :
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               :
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/rt/lib/RT.pm.in b/rt/lib/RT.pm.in
new file mode 100644 (file)
index 0000000..065734e
--- /dev/null
@@ -0,0 +1,304 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2002 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+use strict;
+use RT::I18N;
+use RT::CurrentUser;
+use RT::System;
+
+use vars qw($VERSION $System $SystemUser $Nobody $Handle $Logger
+        $CORE_CONFIG_FILE
+        $SITE_CONFIG_FILE
+        $VENDOR_CONFIG_FILE
+        $BasePath
+        $EtcPath
+        $VarPath
+        $LocalPath
+        $LocalEtcPath
+        $LocalLexiconPath
+        $LogDir
+        $MasonComponentRoot
+        $MasonLocalComponentRoot
+        $MasonDataDir
+        $MasonSessionDir
+);
+
+$VERSION = '@RT_VERSION_MAJOR@.@RT_VERSION_MINOR@.@RT_VERSION_PATCH@';
+$CORE_CONFIG_FILE = "@CONFIG_FILE_PATH@/RT_Config.pm";
+$SITE_CONFIG_FILE = "@CONFIG_FILE_PATH@/RT_SiteConfig.pm";
+
+$BasePath = '@RT_PATH@';
+
+$EtcPath = '@RT_ETC_PATH@';
+$VarPath = '@RT_VAR_PATH@';
+$LocalPath = '@RT_LOCAL_PATH@';
+$LocalEtcPath = '@LOCAL_ETC_PATH@';
+$LocalLexiconPath = '@LOCAL_LEXICON_PATH@';
+
+# $MasonComponentRoot is where your rt instance keeps its mason html files
+
+$MasonComponentRoot = '@MASON_HTML_PATH@';
+
+# $MasonLocalComponentRoot is where your rt instance keeps its site-local
+# mason html files.
+
+$MasonLocalComponentRoot = '@MASON_LOCAL_HTML_PATH@';
+
+# $MasonDataDir Where mason keeps its datafiles
+
+$MasonDataDir = '@MASON_DATA_PATH@';
+
+# RT needs to put session data (for preserving state between connections
+# via the web interface)
+$MasonSessionDir = '@MASON_SESSION_PATH@';
+
+
+
+=head1 NAME
+
+       RT - Request Tracker
+
+=head1 SYNOPSIS
+
+       A fully featured request tracker package
+
+=head1 DESCRIPTION
+
+
+=cut
+
+=item LoadConfig
+
+Load RT's config file. First, go after the core config file. 
+After that, try to load the vendor config.
+After that, go after the site config.
+
+=cut
+
+sub LoadConfig {
+     local *Set = sub { $_[0] = $_[1] unless defined $_[0] }; 
+    if ( -f "$SITE_CONFIG_FILE" ) {
+        require $SITE_CONFIG_FILE
+          || die ("Couldn't load RT config file  '$SITE_CONFIG_FILE'\n$@");
+    }
+    require $CORE_CONFIG_FILE
+      || die ("Couldn't load RT config file '$CORE_CONFIG_FILE'\n$@");
+    RT::I18N->Init;
+}
+
+=item Init
+
+    Conenct to the database, set up logging.
+    
+=cut
+
+sub Init {
+    require RT::Handle;
+    #Get a database connection
+        unless ($Handle && $Handle->dbh->ping) {
+    $Handle = RT::Handle->new();
+        } 
+    $Handle->Connect();
+    
+    #RT's system user is a genuine database user. its id lives here
+    $SystemUser = new RT::CurrentUser();
+    $SystemUser->LoadByName('RT_System');
+    
+    #RT's "nobody user" is a genuine database user. its ID lives here.
+    $Nobody = new RT::CurrentUser();
+    $Nobody->LoadByName('Nobody');
+  
+    $System = RT::System->new();
+
+   InitLogging(); 
+}
+
+=head2 InitLogging
+
+Create the RT::Logger object. 
+
+=cut
+sub InitLogging {
+
+    # We have to set the record seperator ($, man perlvar)
+    # or Log::Dispatch starts getting
+    # really pissy, as some other module we use unsets it.
+
+    $, = '';
+    use Log::Dispatch 1.6;
+
+    unless ($RT::Logger) {
+
+    $RT::Logger=Log::Dispatch->new();
+    
+    if ($RT::LogToFile) {
+
+    unless (-d $RT::LogDir && -w $RT::LogDir) {
+        # localizing here would be hard when we don't have a current user yet
+        # die $self->loc("Log directory [_1] not found or couldn't be written.\n RT can't run.", $RT::LogDir);
+        die ("Log directory $RT::LogDir not found or couldn't be written.\n RT can't run.");
+    }
+
+       my $filename;
+       if ($RT::LogToFileNamed =~ m![/\\]!) {
+           # looks like an absolute path.
+           $filename = $RT::LogToFileNamed;
+       }
+       else {
+           $filename = "$RT::LogDir/$RT::LogToFileNamed";
+       }
+    require Log::Dispatch::File;
+
+
+         $RT::Logger->add(Log::Dispatch::File->new
+                      ( name=>'rtlog',
+                        min_level=> $RT::LogToFile,
+                        filename=> $filename,
+                        mode=>'append',
+                        callbacks => sub { my %p = @_;
+                                my ($package, $filename, $line) = caller(5);
+                                return "[".gmtime(time)."] [".$p{level}."]: $p{message} ($filename:$line)\n"}
+             
+             
+             
+                      ));
+    }
+    if ($RT::LogToScreen) {
+       require Log::Dispatch::Screen;
+       $RT::Logger->add(Log::Dispatch::Screen->new
+                    ( name => 'screen',
+                      min_level => $RT::LogToScreen,
+                        callbacks => sub { my %p = @_;
+                                my ($package, $filename, $line) = caller(5);
+                                return "[".gmtime(time)."] [".$p{level}."]: $p{message} ($filename:$line)\n"
+                               },
+             
+                      stderr => 1
+                    ));
+    }
+    if ($RT::LogToSyslog) {
+       require Log::Dispatch::Syslog;
+       $RT::Logger->add(Log::Dispatch::Syslog->new
+                    ( name => 'syslog',
+                       ident => 'RT',
+                      min_level => $RT::LogToSyslog,
+                        callbacks => sub { my %p = @_;
+                                my ($package, $filename, $line) = caller(5);
+
+                               # syswrite() cannot take utf8; turn it off here.
+                               Encode::_utf8_off($p{message});
+
+                               if ($p{level} eq 'debug') {
+
+                                return "$p{message}\n" }
+                               else {
+                                return "$p{message} ($filename:$line)\n"}
+                               },
+             
+                      stderr => 1
+                    ));
+    }
+
+    }
+
+# {{{ Signal handlers
+
+## This is the default handling of warnings and die'ings in the code
+## (including other used modules - maybe except for errors catched by
+## Mason).  It will log all problems through the standard logging
+## mechanism (see above).
+
+$SIG{__WARN__} = sub {$RT::Logger->warning($_[0])};
+
+#When we call die, trap it and log->crit with the value of the die.
+
+$SIG{__DIE__}  = sub {
+    unless ($^S || !defined $^S ) {
+        $RT::Handle->Rollback();
+        $RT::Logger->crit("$_[0]");
+        exit(-1);
+    }
+    else {
+        #Get out of here if we're in an eval
+        die $_[0];
+    }
+};
+
+# }}}
+
+}
+
+# }}}
+
+
+sub SystemUser {
+    return($SystemUser);
+}      
+
+sub Nobody {
+    return ($Nobody);
+}
+
+
+=head2 DropSetGIDPermissions
+
+Drops setgid permissions.
+
+=cut
+
+sub DropSetGIDPermissions {
+    # Now that we got the config read in, we have the database 
+    # password and don't need to be setgid
+    # make the effective group the real group
+    $) = $(;
+}
+
+
+=head1 SYNOPSIS
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+
+=begin testing
+
+
+ok ($RT::Nobody->Name() eq 'Nobody', "Nobody is nobody");
+ok ($RT::Nobody->Name() ne 'root', "Nobody isn't named root");
+ok ($RT::SystemUser->Name() eq 'RT_System', "The system user is RT_System");
+ok ($RT::SystemUser->Name() ne 'noname', "The system user isn't noname");
+
+
+=end testing
+
+=cut
+
+eval "require RT_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT_Local.pm});
+
+1;
diff --git a/rt/lib/RT/ACE_Overlay.pm b/rt/lib/RT/ACE_Overlay.pm
new file mode 100644 (file)
index 0000000..65e5a9c
--- /dev/null
@@ -0,0 +1,907 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 SYNOPSIS
+
+  use RT::ACE;
+  my $ace = new RT::ACE($CurrentUser);
+
+
+=head1 DESCRIPTION
+
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::ACE);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+use RT::Principals;
+use RT::Queues;
+use RT::Groups;
+
+use vars qw (
+  %LOWERCASERIGHTNAMES
+  %OBJECT_TYPES
+  %TICKET_METAPRINCIPALS
+);
+
+
+# {{{ Descriptions of rights
+
+=head1 Rights
+
+# Queue rights are the sort of queue rights that can only be granted
+# to real people or groups
+
+
+=begin testing
+
+my $Queue = RT::Queue->new($RT::SystemUser);
+
+is ($Queue->AvailableRights->{'DeleteTicket'} , 'Delete tickets', "Found the delete ticket right");
+is ($RT::System->AvailableRights->{'SuperUser'},  'Do anything and everything', "Found the superuser right");
+
+
+=end testing
+
+=cut
+
+
+
+
+# }}}
+
+# {{{ Descriptions of principals
+
+%TICKET_METAPRINCIPALS = (
+    Owner     => 'The owner of a ticket',                             # loc_pair
+    Requestor => 'The requestor of a ticket',                         # loc_pair
+    Cc        => 'The CC of a ticket',                                # loc_pair
+    AdminCc   => 'The administrative CC of a ticket',                 # loc_pair
+);
+
+# }}}
+
+
+# {{{ sub LoadByValues
+
+=head2 LoadByValues PARAMHASH
+
+Load an ACE by specifying a paramhash with the following fields:
+
+              PrincipalId => undef,
+              PrincipalType => undef,
+             RightName => undef,
+
+        And either:
+
+             Object => undef,
+
+            OR
+
+        ObjectType => undef,
+        ObjectId => undef
+
+=cut
+
+sub LoadByValues {
+    my $self = shift;
+    my %args = ( PrincipalId   => undef,
+                 PrincipalType => undef,
+                 RightName     => undef,
+                 Object    => undef,
+                 ObjectId    => undef,
+                 ObjectType    => undef,
+                 @_ );
+
+    my $princ_obj;
+    ( $princ_obj, $args{'PrincipalType'} ) =
+      $self->_CanonicalizePrincipal( $args{'PrincipalId'},
+                                     $args{'PrincipalType'} );
+
+    unless ( $princ_obj->id ) {
+        return ( 0,
+                 $self->loc( 'Principal [_1] not found.', $args{'PrincipalId'} )
+        );
+    }
+
+    my ($object_type, $object_id);
+    
+    if ($args{'Object'} && UNIVERSAL::can($args{'Object'},'id')) {
+        $object_type = ref($args{'Object'});
+        $object_id = $args{'Object'}->id;
+    } elsif ($args{'ObjectId'} || $args{'ObjectType'}) {
+        $object_type = $args{'ObjectType'};
+        $object_id = $args{'ObjectId'};
+    } else {
+            return ( 0, $self->loc("System error. Right not granted.") );
+    }
+
+    $self->LoadByCols( PrincipalId   => $princ_obj->Id,
+                       PrincipalType => $args{'PrincipalType'},
+                       RightName     => $args{'RightName'},
+                       ObjectType    => $object_type,
+                       ObjectId      => $object_id);
+
+    #If we couldn't load it.
+    unless ( $self->Id ) {
+        return ( 0, $self->loc("ACE not found") );
+    }
+
+    # if we could
+    return ( $self->Id, $self->loc("Right Loaded") );
+
+}
+
+# }}}
+
+# {{{ sub Create
+
+=head2 Create <PARAMS>
+
+PARAMS is a parameter hash with the following elements:
+
+   PrincipalId => The id of an RT::Principal object
+   PrincipalType => "User" "Group" or any Role type
+   RightName => the name of a right. in any case
+   DelegatedBy => The Principal->Id of the user delegating the right
+   DelegatedFrom => The id of the ACE which this new ACE is delegated from
+
+
+    Either:
+
+   Object => An object to create rights for. ususally, an RT::Queue or RT::Group
+             This should always be a DBIx::SearchBuilder::Record subclass
+
+        OR
+
+   ObjectType => the type of the object in question (ref ($object))
+   ObjectId => the id of the object in question $object->Id
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = ( PrincipalId   => undef,
+                 PrincipalType => undef,
+                 RightName     => undef,
+                 Object    => $RT::System,
+                 @_ );
+
+    # {{{ Validate the principal
+    my $princ_obj;
+    ( $princ_obj, $args{'PrincipalType'} ) =
+      $self->_CanonicalizePrincipal( $args{'PrincipalId'},
+                                     $args{'PrincipalType'} );
+
+    unless ( $princ_obj->id ) {
+        return ( 0,
+                 $self->loc( 'Principal [_1] not found.', $args{'PrincipalId'} )
+        );
+    }
+
+    # }}}
+
+
+    if ($args{'Object'} && ($args{'ObjectId'} || $args{'ObjectType'})) {
+        use Carp;
+        $RT::Logger->crit(Carp::cluck("ACE::Create called with an ObjectType or an ObjectId"));
+    }
+
+
+    
+    unless ($args{'Object'} && UNIVERSAL::can($args{'Object'},'id')) {
+            return ( 0, $self->loc("System error. Right not granted.") );
+    }
+    # {{{ Check the ACL
+
+    if (ref( $args{'Object'}) eq 'RT::Group' ) {
+        unless ( $self->CurrentUser->HasRight( Object => $args{'Object'},
+                                                  Right => 'AdminGroup' )
+          ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+    }
+
+    else {
+        unless ( $self->CurrentUser->HasRight( Object => $args{'Object'}, Right => 'ModifyACL' )) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+    }
+    # }}}
+
+    # {{{ Canonicalize and check the right name
+    unless ( $args{'RightName'} ) {
+        return ( 0, $self->loc('Invalid right') );
+    }
+
+    $args{'RightName'} = $self->CanonicalizeRightName( $args{'RightName'} );
+
+    #check if it's a valid RightName
+    if ( ref ($args{'Object'} eq 'RT::Queue'  )) {
+        unless ( exists $args{'Object'}->AvailableRights->{ $args{'RightName'} } ) {
+            $RT::Logger->warning("Couldn't validate right name". $args{'RightName'});
+            return ( 0, $self->loc('Invalid right') );
+        }
+    }
+    elsif ( ref ($args{'Object'} eq 'RT::Group'  )) {
+        unless ( exists $args{'Object'}->AvailableRights->{ $args{'RightName'} } ) {
+            $RT::Logger->warning("Couldn't validate group right name". $args{'RightName'});
+            return ( 0, $self->loc('Invalid right') );
+        }
+    }
+    elsif ( ref ($args{'Object'} eq 'RT::System'  )) {
+        my $q = RT::Queue->new($self->CurrentUser);
+        my $g = RT::Group->new($self->CurrentUser);
+
+        unless (( exists $g->AvailableRights->{ $args{'RightName'} } )
+        || ( exists $g->AvailableRights->{ $args{'RightName'} } )
+        || ( exists $RT::System->AvailableRights->{ $args{'RightName'} } ) ) {
+            $RT::Logger->warning("Couldn't validate system right name - ". $args{'RightName'});
+            return ( 0, $self->loc('Invalid right') );
+        }
+    }
+
+    unless ( $args{'RightName'} ) {
+        return ( 0, $self->loc('Invalid right') );
+    }
+    # }}}
+
+    # Make sure the right doesn't already exist.
+    $self->LoadByCols( PrincipalId   => $princ_obj->id,
+                       PrincipalType => $args{'PrincipalType'},
+                       RightName     => $args{'RightName'},
+                       ObjectType    => ref($args{'Object'}),
+                       ObjectId      => $args{'Object'}->id,
+                       DelegatedBy   => 0,
+                       DelegatedFrom => 0 );
+    if ( $self->Id ) {
+        return ( 0, $self->loc('That principal already has that right') );
+    }
+
+    my $id = $self->SUPER::Create( PrincipalId   => $princ_obj->id,
+                                   PrincipalType => $args{'PrincipalType'},
+                                   RightName     => $args{'RightName'},
+                                   ObjectType    => ref( $args{'Object'} ),
+                                   ObjectId      => $args{'Object'}->id,
+                                   DelegatedBy   => 0,
+                                   DelegatedFrom => 0 );
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    RT::Principal->_InvalidateACLCache();
+
+    if ( $id > 0 ) {
+        return ( $id, $self->loc('Right Granted') );
+    }
+    else {
+        return ( 0, $self->loc('System error. Right not granted.') );
+    }
+}
+
+# }}}
+
+# {{{ sub Delegate
+
+=head2 Delegate <PARAMS>
+
+This routine delegates the current ACE to a principal specified by the
+B<PrincipalId>  parameter.
+
+Returns an error if the current user doesn't have the right to be delegated
+or doesn't have the right to delegate rights.
+
+Always returns a tuple of (ReturnValue, Message)
+
+=begin testing
+
+use_ok(RT::User);
+my $user_a = RT::User->new($RT::SystemUser);
+$user_a->Create( Name => 'DelegationA', Privileged => 1);
+ok ($user_a->Id, "Created delegation user a");
+
+my $user_b = RT::User->new($RT::SystemUser);
+$user_b->Create( Name => 'DelegationB', Privileged => 1);
+ok ($user_b->Id, "Created delegation user b");
+
+
+use_ok(RT::Queue);
+my $q = RT::Queue->new($RT::SystemUser);
+$q->Create(Name =>'DelegationTest');
+ok ($q->Id, "Created a delegation test queue");
+
+
+#------ First, we test whether a user can delegate a right that's been granted to him personally 
+my ($val, $msg) = $user_a->PrincipalObj->GrantRight(Object => $RT::System, Right => 'AdminOwnPersonalGroups');
+ok($val, $msg);
+
+($val, $msg) = $user_a->PrincipalObj->GrantRight(Object =>$q, Right => 'OwnTicket');
+ok($val, $msg);
+
+ok($user_a->HasRight( Object => $RT::System, Right => 'AdminOwnPersonalGroups')    ,"user a has the right 'AdminOwnPersonalGroups' directly");
+
+my $a_delegates = RT::Group->new($user_a);
+$a_delegates->CreatePersonalGroup(Name => 'Delegates');
+ok( $a_delegates->Id   ,"user a creates a personal group 'Delegates'");
+ok( $a_delegates->AddMember($user_b->PrincipalId)   ,"user a adds user b to personal group 'delegates'");
+
+ok( !$user_b->HasRight(Right => 'OwnTicket', Object => $q)    ,"user b does not have the right to OwnTicket' in queue 'DelegationTest'");
+ok(  $user_a->HasRight(Right => 'OwnTicket', Object => $q)  ,"user a has the right to 'OwnTicket' in queue 'DelegationTest'");
+ok(!$user_a->HasRight( Object => $RT::System, Right => 'DelegateRights')    ,"user a does not have the right 'delegate rights'");
+
+
+my $own_ticket_ace = RT::ACE->new($user_a);
+my $user_a_equiv_group = RT::Group->new($user_a);
+$user_a_equiv_group->LoadACLEquivalenceGroup($user_a->PrincipalObj);
+ok ($user_a_equiv_group->Id, "Loaded the user A acl equivalence group");
+my $user_b_equiv_group = RT::Group->new($user_b);
+$user_b_equiv_group->LoadACLEquivalenceGroup($user_b->PrincipalObj);
+ok ($user_b_equiv_group->Id, "Loaded the user B acl equivalence group");
+$own_ticket_ace->LoadByValues( PrincipalType => 'Group', PrincipalId => $user_a_equiv_group->PrincipalId, Object=>$q, RightName => 'OwnTicket');
+
+ok ($own_ticket_ace->Id, "Found the ACE we want to test with for now");
+
+
+($val, $msg) = $own_ticket_ace->Delegate(PrincipalId => $a_delegates->PrincipalId)  ;
+ok( !$val ,"user a tries and fails to delegate the right 'ownticket' in queue 'DelegationTest' to personal group 'delegates' - $msg");
+
+
+($val, $msg) = $user_a->PrincipalObj->GrantRight( Right => 'DelegateRights');
+ok($val, "user a is granted the right to 'delegate rights' - $msg");
+
+ok($user_a->HasRight( Object => $RT::System, Right => 'DelegateRights')    ,"user a has the right 'AdminOwnPersonalGroups' directly");
+
+($val, $msg) = $own_ticket_ace->Delegate(PrincipalId => $a_delegates->PrincipalId) ;
+
+ok( $val    ,"user a tries and succeeds to delegate the right 'ownticket' in queue 'DelegationTest' to personal group 'delegates' - $msg");
+ok(  $user_b->HasRight(Right => 'OwnTicket', Object => $q)  ,"user b has the right to own tickets in queue 'DelegationTest'");
+my $delegated_ace = RT::ACE->new($user_a);
+$delegated_ace->LoadByValues ( Object => $q, RightName => 'OwnTicket', PrincipalType => 'Group',
+PrincipalId => $a_delegates->PrincipalId, DelegatedBy => $user_a->PrincipalId, DelegatedFrom => $own_ticket_ace->Id);
+ok ($delegated_ace->Id, "Found the delegated ACE");
+
+ok(    $a_delegates->DeleteMember($user_b->PrincipalId)  ,"user a removes b from pg 'delegates'");
+ok(  !$user_b->HasRight(Right => 'OwnTicket', Object => $q)  ,"user b does not have the right to own tickets in queue 'DelegationTest'");
+ok(  $a_delegates->AddMember($user_b->PrincipalId)    ,"user a adds user b to personal group 'delegates'");
+ok(   $user_b->HasRight(Right => 'OwnTicket', Object=> $q) ,"user b has the right to own tickets in queue 'DelegationTest'");
+ok(   $delegated_ace->Delete ,"user a revokes pg 'delegates' right to 'OwnTickets' in queue 'DelegationTest'");
+ok( ! $user_b->HasRight(Right => 'OwnTicket', Object => $q)   ,"user b does not have the right to own tickets in queue 'DelegationTest'");
+
+($val, $msg) = $own_ticket_ace->Delegate(PrincipalId => $a_delegates->PrincipalId)  ;
+ok(  $val  ,"user a delegates pg 'delegates' right to 'OwnTickets' in queue 'DelegationTest' - $msg");
+
+ok( $user_a->HasRight(Right => 'OwnTicket', Object => $q)    ,"user a does not have the right to own tickets in queue 'DelegationTest'");
+
+($val, $msg) = $user_a->PrincipalObj->RevokeRight(Object=>$q, Right => 'OwnTicket');
+ok($val, "Revoked user a's right to own tickets in queue 'DelegationTest". $msg);
+
+ok( !$user_a->HasRight(Right => 'OwnTicket', Object => $q)    ,"user a does not have the right to own tickets in queue 'DelegationTest'");
+
+ ok( !$user_b->HasRight(Right => 'OwnTicket', Object => $q)   ,"user b does not have the right to own tickets in queue 'DelegationTest'");
+
+($val, $msg) = $user_a->PrincipalObj->GrantRight(Object=>$q, Right => 'OwnTicket');
+ok($val, $msg);
+
+ ok( $user_a->HasRight(Right => 'OwnTicket', Object => $q)   ,"user a has the right to own tickets in queue 'DelegationTest'");
+
+ ok(  !$user_b->HasRight(Right => 'OwnTicket', Object => $q)  ,"user b does not have the right to own tickets in queue 'DelegationTest'");
+
+# {{{ get back to a known clean state 
+($val, $msg) = $user_a->PrincipalObj->RevokeRight( Object => $q, Right => 'OwnTicket');
+ok($val, "Revoked user a's right to own tickets in queue 'DelegationTest -". $msg);
+ok( !$user_a->HasRight(Right => 'OwnTicket', Object => $q)    ,"make sure that user a can't own tickets in queue 'DelegationTest'");
+# }}}
+
+
+# {{{ Set up some groups and membership
+my $del1 = RT::Group->new($RT::SystemUser);
+($val, $msg) = $del1->CreateUserDefinedGroup(Name => 'Del1');
+ok( $val   ,"create a group del1 - $msg");
+
+my $del2 = RT::Group->new($RT::SystemUser);
+($val, $msg) = $del2->CreateUserDefinedGroup(Name => 'Del2');
+ok( $val   ,"create a group del2 - $msg");
+($val, $msg) = $del1->AddMember($del2->PrincipalId);
+ok( $val,"make del2 a member of del1 - $msg");
+
+my $del2a = RT::Group->new($RT::SystemUser);
+($val, $msg) = $del2a->CreateUserDefinedGroup(Name => 'Del2a');
+ok( $val   ,"create a group del2a - $msg");
+($val, $msg) = $del2->AddMember($del2a->PrincipalId);  
+ok($val    ,"make del2a a member of del2 - $msg");
+
+my $del2b = RT::Group->new($RT::SystemUser);
+($val, $msg) = $del2b->CreateUserDefinedGroup(Name => 'Del2b');
+ok( $val   ,"create a group del2b - $msg");
+($val, $msg) = $del2->AddMember($del2b->PrincipalId);  
+ok($val    ,"make del2b a member of del2 - $msg");
+
+($val, $msg) = $del2->AddMember($user_a->PrincipalId) ;
+ok($val,"make 'user a' a member of del2 - $msg");
+
+($val, $msg) = $del2b->AddMember($user_a->PrincipalId) ;
+ok($val,"make 'user a' a member of del2b - $msg");
+
+# }}}
+
+# {{{ Grant a right to a group and make sure that a submember can delegate the right and that it does not get yanked
+# when a user is removed as a submember, when they're a sumember through another path 
+($val, $msg) = $del1->PrincipalObj->GrantRight( Object=> $q, Right => 'OwnTicket');
+ok( $val   ,"grant del1  the right to 'OwnTicket' in queue 'DelegationTest' - $msg");
+
+ok(  $user_a->HasRight(Right => 'OwnTicket', Object => $q)  ,"make sure that user a can own tickets in queue 'DelegationTest'");
+
+my $group_ace= RT::ACE->new($user_a);
+$group_ace->LoadByValues( PrincipalType => 'Group', PrincipalId => $del1->PrincipalId, Object => $q, RightName => 'OwnTicket');
+
+ok ($group_ace->Id, "Found the ACE we want to test with for now");
+
+($val, $msg) = $group_ace->Delegate(PrincipalId => $a_delegates->PrincipalId);
+
+ok( $val   ,"user a tries and succeeds to delegate the right 'ownticket' in queue 'DelegationTest' to personal group 'delegates' - $msg");
+ok(  $user_b->HasRight(Right => 'OwnTicket', Object => $q)  ,"user b has the right to own tickets in queue 'DelegationTest'");
+
+
+($val, $msg) = $del2b->DeleteMember($user_a->PrincipalId);
+ok( $val   ,"remove user a from group del2b - $msg");
+ok(  $user_a->HasRight(Right => 'OwnTicket', Object => $q)  ,"user a has the right to own tickets in queue 'DelegationTest'");
+ok( $user_b->HasRight(Right => 'OwnTicket', Object => $q)    ,"user b has the right to own tickets in queue 'DelegationTest'");
+
+# }}}
+
+# {{{ When a  user is removed froom a group by the only path they're in there by, make sure the delegations go away
+($val, $msg) = $del2->DeleteMember($user_a->PrincipalId);
+ok( $val   ,"remove user a from group del2 - $msg");
+ok(  !$user_a->HasRight(Right => 'OwnTicket', Object => $q)  ,"user a does not have the right to own tickets in queue 'DelegationTest' ");
+ok(  !$user_b->HasRight(Right => 'OwnTicket', Object => $q)  ,"user b does not have the right to own tickets in queue 'DelegationTest' ");
+# }}}
+
+($val, $msg) = $del2->AddMember($user_a->PrincipalId);
+ok( $val   ,"make user a a member of group del2 - $msg");
+
+($val, $msg) = $del2->PrincipalObj->GrantRight(Object=>$q, Right => 'OwnTicket');
+ok($val, "grant the right 'own tickets' in queue 'DelegationTest' to group del2 - $msg");
+
+my $del2_right = RT::ACE->new($user_a);
+$del2_right->LoadByValues( PrincipalId => $del2->PrincipalId, PrincipalType => 'Group', Object => $q, RightName => 'OwnTicket');
+ok ($del2_right->Id, "Found the right");
+
+($val, $msg) = $del2_right->Delegate(PrincipalId => $a_delegates->PrincipalId);
+ok( $val   ,"user a tries and succeeds to delegate the right 'ownticket' in queue 'DelegationTest' gotten via del2 to personal group 'delegates' - $msg");
+
+# They have it via del1 and del2
+ok( $user_a->HasRight(Right => 'OwnTicket', Object => $q)   ,"user b has the right to own tickets in queue 'DelegationTest'");
+
+
+($val, $msg) = $del2->PrincipalObj->RevokeRight(Object=>$q, Right => 'OwnTicket');
+ok($val, "revoke the right 'own tickets' in queue 'DelegationTest' to group del2 - $msg");
+ok(  $user_a->HasRight(Right => 'OwnTicket', Object => $q)  ,"user a does has the right to own tickets in queue 'DelegationTest' via del1");
+ok(  !$user_b->HasRight(Right => 'OwnTicket', Object => $q)   ,"user b does not have the right to own tickets in queue 'DelegationTest'");
+
+($val, $msg) = $del2->PrincipalObj->GrantRight(Object=>$q, Right => 'OwnTicket');
+ok($val, "grant the right 'own tickets' in queue 'DelegationTest' to group del2 - $msg");
+
+
+$group_ace= RT::ACE->new($user_a);
+$group_ace->LoadByValues( PrincipalType => 'Group', PrincipalId => $del1->PrincipalId, Object=>$q, RightName => 'OwnTicket');
+
+ok ($group_ace->Id, "Found the ACE we want to test with for now");
+
+($val, $msg) = $group_ace->Delegate(PrincipalId => $a_delegates->PrincipalId);
+
+ok( $val   ,"user a tries and succeeds to delegate the right 'ownticket' in queue 'DelegationTest' to personal group 'delegates' - $msg");
+
+ok( $user_b->HasRight(Right => 'OwnTicket', Object => $q)    ,"user b has the right to own tickets in queue 'DelegationTest'");
+
+($val, $msg) = $del2->DeleteMember($user_a->PrincipalId);
+ok( $val   ,"remove user a from group del2 - $msg");
+
+ok(  !$user_a->HasRight(Right => 'OwnTicket', Object => $q)  ,"user a does not have the right to own tickets in queue 'DelegationTest'");
+
+ok(  !$user_b->HasRight(Right => 'OwnTicket', Object => $q)   ,"user b does not have the right to own tickets in queue 'DelegationTest'");
+
+
+
+=end testing
+
+=cut
+
+sub Delegate {
+    my $self = shift;
+    my %args = ( PrincipalId => undef,
+                 @_ );
+
+    unless ( $self->Id ) {
+        return ( 0, $self->loc("Right not loaded.") );
+    }
+    my $princ_obj;
+    ( $princ_obj, $args{'PrincipalType'} ) =
+      $self->_CanonicalizePrincipal( $args{'PrincipalId'},
+                                     $args{'PrincipalType'} );
+
+    unless ( $princ_obj->id ) {
+        return ( 0,
+                 $self->loc( 'Principal [_1] not found.', $args{'PrincipalId'} )
+        );
+    }
+
+    # }}}
+
+    # {{{ Check the ACL
+
+    # First, we check to se if the user is delegating rights and
+    # they have the permission to
+    unless ( $self->CurrentUser->HasRight(Right => 'DelegateRights', Object => $self->Object) ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    unless ( $self->PrincipalObj->IsGroup ) {
+        return ( 0, $self->loc("System Error") );
+    }
+    unless ( $self->PrincipalObj->Object->HasMemberRecursively(
+                                                $self->CurrentUser->PrincipalObj
+             )
+      ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    # }}}
+
+    my $concurrency_check = RT::ACE->new($RT::SystemUser);
+    $concurrency_check->Load( $self->Id );
+    unless ( $concurrency_check->Id ) {
+        $RT::Logger->crit(
+                   "Trying to delegate a right which had already been deleted");
+        return ( 0, $self->loc('Permission Denied') );
+    }
+
+    my $delegated_ace = RT::ACE->new( $self->CurrentUser );
+
+    # Make sure the right doesn't already exist.
+    $delegated_ace->LoadByCols( PrincipalId   => $princ_obj->Id,
+                                PrincipalType => 'Group',
+                                RightName     => $self->__Value('RightName'),
+                                ObjectType    => $self->__Value('ObjectType'),
+                                ObjectId      => $self->__Value('ObjectId'),
+                                DelegatedBy => $self->CurrentUser->PrincipalId,
+                                DelegatedFrom => $self->id );
+    if ( $delegated_ace->Id ) {
+        return ( 0, $self->loc('That principal already has that right') );
+    }
+    my $id = $delegated_ace->SUPER::Create(
+        PrincipalId   => $princ_obj->Id,
+        PrincipalType => 'Group',          # do we want to hardcode this?
+        RightName     => $self->__Value('RightName'),
+        ObjectType    => $self->__Value('ObjectType'),
+        ObjectId      => $self->__Value('ObjectId'),
+        DelegatedBy   => $self->CurrentUser->PrincipalId,
+        DelegatedFrom => $self->id );
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    # TODO what about the groups key cache?
+    RT::Principal->_InvalidateACLCache();
+
+    if ( $id > 0 ) {
+        return ( $id, $self->loc('Right Delegated') );
+    }
+    else {
+        return ( 0, $self->loc('System error. Right not delegated.') );
+    }
+}
+
+# }}}
+
+# {{{ sub Delete 
+
+=head2 Delete { InsideTransaction => undef}
+
+Delete this object. This method should ONLY ever be called from RT::User or RT::Group (or from itself)
+If this is being called from within a transaction, specify a true value for the parameter InsideTransaction.
+Really, DBIx::SearchBuilder should use and/or fake subtransactions
+
+This routine will also recurse and delete any delegations of this right
+
+=cut
+
+sub Delete {
+    my $self = shift;
+
+    unless ( $self->Id ) {
+        return ( 0, $self->loc('Right not loaded.') );
+    }
+
+    # A user can delete an ACE if the current user has the right to modify it and it's not a delegated ACE
+    # or if it's a delegated ACE and it was delegated by the current user
+    unless (
+         (    $self->CurrentUser->HasRight(Right => 'ModifyACL', Object => $self->Object)
+           && $self->__Value('DelegatedBy') == 0 )
+         || ( $self->__Value('DelegatedBy') == $self->CurrentUser->PrincipalId )
+      ) {
+        return ( 0, $self->loc('Permission Denied') );
+    }
+    $self->_Delete(@_);
+}
+
+# Helper for Delete with no ACL check
+sub _Delete {
+    my $self = shift;
+    my %args = ( InsideTransaction => undef,
+                 @_ );
+
+    my $InsideTransaction = $args{'InsideTransaction'};
+
+    $RT::Handle->BeginTransaction() unless $InsideTransaction;
+
+    my $delegated_from_this = RT::ACL->new($RT::SystemUser);
+    $delegated_from_this->Limit( FIELD    => 'DelegatedFrom',
+                                 OPERATOR => '=',
+                                 VALUE    => $self->Id );
+
+    my $delete_succeeded = 1;
+    my $submsg;
+    while ( my $delegated_ace = $delegated_from_this->Next ) {
+        ( $delete_succeeded, $submsg ) =
+          $delegated_ace->_Delete( InsideTransaction => 1 );
+        last if ($delete_succeeded);
+    }
+
+    unless ($delete_succeeded) {
+        $RT::Handle->Rollback() unless $InsideTransaction;
+        return ( 0, $self->loc('Right could not be revoked') );
+    }
+
+    my ( $val, $msg ) = $self->SUPER::Delete(@_);
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    # TODO what about the groups key cache?
+    RT::Principal->_InvalidateACLCache();
+
+    if ($val) {
+        $RT::Handle->Commit() unless $InsideTransaction;
+        return ( $val, $self->loc('Right revoked') );
+    }
+    else {
+        $RT::Handle->Rollback() unless $InsideTransaction;
+        return ( 0, $self->loc('Right could not be revoked') );
+    }
+}
+
+# }}}
+
+# {{{ sub _BootstrapCreate 
+
+=head2 _BootstrapCreate
+
+Grant a right with no error checking and no ACL. this is _only_ for 
+installation. If you use this routine without the author's explicit 
+written approval, he will hunt you down and make you spend eternity
+translating mozilla's code into FORTRAN or intercal.
+
+If you think you need this routine, you've mistaken. 
+
+=cut
+
+sub _BootstrapCreate {
+    my $self = shift;
+    my %args = (@_);
+
+    # When bootstrapping, make sure we get the _right_ users
+    if ( $args{'UserId'} ) {
+        my $user = RT::User->new( $self->CurrentUser );
+        $user->Load( $args{'UserId'} );
+        delete $args{'UserId'};
+        $args{'PrincipalId'}   = $user->PrincipalId;
+        $args{'PrincipalType'} = 'User';
+    }
+
+    my $id = $self->SUPER::Create(%args);
+
+    if ( $id > 0 ) {
+        return ($id);
+    }
+    else {
+        $RT::Logger->err('System error. right not granted.');
+        return (undef);
+    }
+
+}
+
+# }}}
+
+# {{{ sub CanonicalizeRightName
+
+=head2 CanonicalizeRightName <RIGHT>
+
+Takes a queue or system right name in any case and returns it in
+the correct case. If it's not found, will return undef.
+
+=cut
+
+sub CanonicalizeRightName {
+    my $self  = shift;
+    my $right = shift;
+    $right = lc $right;
+    if ( exists $LOWERCASERIGHTNAMES{"$right"} ) {
+        return ( $LOWERCASERIGHTNAMES{"$right"} );
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+
+# {{{ sub Object
+
+=head2 Object
+
+If the object this ACE applies to is a queue, returns the queue object. 
+If the object this ACE applies to is a group, returns the group object. 
+If it's the system object, returns undef. 
+
+If the user has no rights, returns undef.
+
+=cut
+
+
+
+
+sub Object {
+    my $self = shift;
+
+    my $appliesto_obj;
+
+    if ($self->__Value('ObjectType') && $OBJECT_TYPES{$self->__Value('ObjectType')} ) {
+        $appliesto_obj =  $self->__Value('ObjectType')->new($self->CurrentUser);
+        unless (ref( $appliesto_obj) eq $self->__Value('ObjectType')) {
+            return undef;
+        }
+        $appliesto_obj->Load( $self->__Value('ObjectId') );
+        return ($appliesto_obj);
+     }
+    else {
+        $RT::Logger->warning( "$self -> Object called for an object "
+                              . "of an unknown type:"
+                              . $self->ObjectType );
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ sub PrincipalObj
+
+=head2 PrincipalObj
+
+Returns the RT::Principal object for this ACE. 
+
+=cut
+
+sub PrincipalObj {
+    my $self = shift;
+
+    my $princ_obj = RT::Principal->new( $self->CurrentUser );
+    $princ_obj->Load( $self->__Value('PrincipalId') );
+
+    unless ( $princ_obj->Id ) {
+        $RT::Logger->err(
+                   "ACE " . $self->Id . " couldn't load its principal object" );
+    }
+    return ($princ_obj);
+
+}
+
+# }}}
+
+# {{{ ACL related methods
+
+# {{{ sub _Set
+
+sub _Set {
+    my $self = shift;
+    return ( 0, $self->loc("ACEs can only be created and deleted.") );
+}
+
+# }}}
+
+# {{{ sub _Value
+
+sub _Value {
+    my $self = shift;
+
+    if ( $self->__Value('DelegatedBy') eq $self->CurrentUser->PrincipalId ) {
+        return ( $self->__Value(@_) );
+    }
+    elsif ( $self->PrincipalObj->IsGroup
+            && $self->PrincipalObj->Object->HasMemberRecursively(
+                                                $self->CurrentUser->PrincipalObj
+            )
+      ) {
+        return ( $self->__Value(@_) );
+    }
+    elsif ( $self->CurrentUser->HasRight(Right => 'ShowACL', Object => $self->Object) ) {
+        return ( $self->__Value(@_) );
+    }
+    else {
+        return undef;
+    }
+}
+
+# }}}
+
+
+# }}}
+
+# {{{ _CanonicalizePrincipal 
+
+=head2 _CanonicalizePrincipal (PrincipalId, PrincipalType)
+
+Takes a principal id and a principal type.
+
+If the principal is a user, resolves it to the proper acl equivalence group.
+Returns a tuple of  (RT::Principal, PrincipalType)  for the principal we really want to work with
+
+=cut
+
+sub _CanonicalizePrincipal {
+    my $self       = shift;
+    my $princ_id   = shift;
+    my $princ_type = shift;
+
+    my $princ_obj = RT::Principal->new($RT::SystemUser);
+    $princ_obj->Load($princ_id);
+
+    unless ( $princ_obj->Id ) {
+        use Carp;
+        $RT::Logger->crit(Carp::cluck);
+        $RT::Logger->crit("Can't load a principal for id $princ_id");
+        return ( $princ_obj, undef );
+    }
+
+    # Rights never get granted to users. they get granted to their 
+    # ACL equivalence groups
+    if ( $princ_type eq 'User' ) {
+        my $equiv_group = RT::Group->new( $self->CurrentUser );
+        $equiv_group->LoadACLEquivalenceGroup($princ_obj);
+        unless ( $equiv_group->Id ) {
+            $RT::Logger->crit(
+                 "No ACL equiv group for princ " . $self->__Value('ObjectId') );
+            return ( 0, $self->loc('System error. Right not granted.') );
+        }
+        $princ_obj  = $equiv_group->PrincipalObj();
+        $princ_type = 'Group';
+
+    }
+    return ( $princ_obj, $princ_type );
+}
+
+# }}}
+1;
diff --git a/rt/lib/RT/ACL_Overlay.pm b/rt/lib/RT/ACL_Overlay.pm
new file mode 100644 (file)
index 0000000..9775776
--- /dev/null
@@ -0,0 +1,295 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::ACL - collection of RT ACE objects
+
+=head1 SYNOPSIS
+
+  use RT::ACL;
+my $ACL = new RT::ACL($CurrentUser);
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::ACL);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+=head2 Next
+
+Hand out the next ACE that was found
+
+=cut
+
+
+# {{{ LimitToObject 
+
+=head2 LimitToObject $object
+
+Limit the ACL to rights for the object $object. It needs to be an RT::Record class.
+
+=cut
+
+sub LimitToObject {
+    my $self = shift;
+    my $obj = shift;
+    unless (defined($obj) && ref($obj) && UNIVERSAL::can($obj, 'id')) {
+    return undef;
+    }
+    $self->Limit(FIELD => 'ObjectType', OPERATOR=> '=', VALUE => ref($obj), ENTRYAGGREGATOR => 'OR');
+    $self->Limit(FIELD => 'ObjectId', OPERATOR=> '=', VALUE => $obj->id, ENTRYAGGREGATOR => 'OR', QUOTEVALUE => 0);
+
+}
+
+# }}}
+
+# {{{ LimitToPrincipal 
+
+=head2 LimitToPrincipal { Type => undef, Id => undef, IncludeGroupMembership => undef }
+
+Limit the ACL to the principal with PrincipalId Id and PrincipalType Type
+
+Id is not optional.
+Type is.
+
+if IncludeGroupMembership => 1 is specified, ACEs which apply to the principal due to group membership will be included in the resultset.
+
+
+=cut
+
+sub LimitToPrincipal {
+    my $self = shift;
+    my %args = ( Type                               => undef,
+                 Id                                 => undef,
+                 IncludeGroupMembership => undef,
+                 @_ );
+    if ( $args{'IncludeGroupMembership'} ) {
+        my $cgm = $self->NewAlias('CachedGroupMembers');
+        $self->Join( ALIAS1 => 'main',
+                     FIELD1 => 'PrincipalId',
+                     ALIAS2 => $cgm,
+                     FIELD2 => 'GroupId' );
+        $self->Limit( ALIAS           => $cgm,
+                      FIELD           => 'MemberId',
+                      OPERATOR        => '=',
+                      VALUE           => $args{'Id'},
+                      ENTRYAGGREGATOR => 'OR' );
+    }
+    else {
+        if ( defined $args{'Type'} ) {
+            $self->Limit( FIELD           => 'PrincipalType',
+                          OPERATOR        => '=',
+                          VALUE           => $args{'Type'},
+                          ENTRYAGGREGATOR => 'OR' );
+        }
+    # if the principal id points to a user, we really want to point
+    # to their ACL equivalence group. The machinations we're going through
+    # lead me to start to suspect that we really want users and groups
+    # to just be the same table. or _maybe_ that we want an object db.
+    my $princ = RT::Principal->new($RT::SystemUser);
+    $princ->Load($args{'PrincipalId'});
+    if ($princ->PrincipalType eq 'User') {
+    my $group = RT::Group->new($RT::SystemUser);
+        $group->LoadACLEquivalenceGroup($princ);
+        $args{'PrincipalId'} = $group->PrincipalId;
+    }
+        $self->Limit( FIELD           => 'PrincipalId',
+                      OPERATOR        => '=',
+                      VALUE           => $args{'Id'},
+                      ENTRYAGGREGATOR => 'OR' );
+    }
+}
+
+# }}}
+
+
+
+# {{{ ExcludeDelegatedRights
+
+=head2 ExcludeDelegatedRights 
+
+Don't list rights which have been delegated.
+
+=cut
+
+sub ExcludeDelegatedRights {
+    my $self = shift;
+    $self->DelegatedBy(Id => 0);
+    $self->DelegatedFrom(Id => 0);
+}
+# }}}
+
+# {{{ DelegatedBy 
+
+=head2 DelegatedBy { Id => undef }
+
+Limit the ACL to rights delegated by the principal whose Principal Id is
+B<Id>
+
+Id is not optional.
+
+=cut
+
+sub DelegatedBy {
+    my $self = shift;
+    my %args = (
+        Id => undef,
+        @_
+    );
+    $self->Limit(
+        FIELD           => 'DelegatedBy',
+        OPERATOR        => '=',
+        VALUE           => $args{'Id'},
+        ENTRYAGGREGATOR => 'OR'
+    );
+
+}
+
+# }}}
+
+# {{{ DelegatedFrom 
+
+=head2 DelegatedFrom { Id => undef }
+
+Limit the ACL to rights delegate from the ACE which has the Id specified 
+by the Id parameter.
+
+Id is not optional.
+
+=cut
+
+sub DelegatedFrom {
+    my $self = shift;
+    my %args = (
+                 Id => undef,
+                 @_);
+    $self->Limit(FIELD => 'DelegatedFrom', OPERATOR=> '=', VALUE => $args{'Id'}, ENTRYAGGREGATOR => 'OR');
+
+}
+
+# }}}
+
+
+# {{{ sub Next 
+sub Next {
+    my $self = shift;
+
+    my $ACE = $self->SUPER::Next();
+    if ( ( defined($ACE) ) and ( ref($ACE) ) ) {
+
+        if ( $self->CurrentUser->HasRight( Right  => 'ShowACL',
+                                           Object => $ACE->Object )
+             or $self->CurrentUser->HasRight( Right  => 'ModifyACL',
+                                              Object => $ACE->Object )
+          ) {
+            return ($ACE);
+        }
+
+        #If the user doesn't have the right to show this ACE
+        else {
+            return ( $self->Next() );
+        }
+    }
+
+    #if there never was any ACE
+    else {
+        return (undef);
+    }
+
+}
+
+# }}}
+
+
+
+#wrap around _DoSearch  so that we can build the hash of returned
+#values 
+sub _DoSearch {
+    my $self = shift;
+   # $RT::Logger->debug("Now in ".$self."->_DoSearch");
+    my $return = $self->SUPER::_DoSearch(@_);
+  #  $RT::Logger->debug("In $self ->_DoSearch. return from SUPER::_DoSearch was $return\n");
+    $self->_BuildHash();
+    return ($return);
+}
+
+
+#Build a hash of this ACL's entries.
+sub _BuildHash {
+    my $self = shift;
+
+    while (my $entry = $self->Next) {
+       my $hashkey = $entry->ObjectType . "-" .  $entry->ObjectId . "-" .  $entry->RightName . "-" .  $entry->PrincipalId . "-" .  $entry->PrincipalType;
+
+        $self->{'as_hash'}->{"$hashkey"} =1;
+
+    }
+}
+
+
+# {{{ HasEntry
+
+=head2 HasEntry
+
+=cut
+
+sub HasEntry {
+
+    my $self = shift;
+    my %args = ( RightScope => undef,
+                 RightAppliesTo => undef,
+                 RightName => undef,
+                 PrincipalId => undef,
+                 PrincipalType => undef,
+                 @_ );
+
+    #if we haven't done the search yet, do it now.
+    $self->_DoSearch();
+
+    if ($self->{'as_hash'}->{ $args{'RightScope'} . "-" .
+                             $args{'RightAppliesTo'} . "-" . 
+                             $args{'RightName'} . "-" .
+                             $args{'PrincipalId'} . "-" .
+                             $args{'PrincipalType'}
+                            } == 1) {
+       return(1);
+    }
+    else {
+       return(undef);
+    }
+}
+
+# }}}
+1;
diff --git a/rt/lib/RT/Action/AutoOpen.pm b/rt/lib/RT/Action/AutoOpen.pm
new file mode 100644 (file)
index 0000000..ea6da19
--- /dev/null
@@ -0,0 +1,86 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# This Action will open the BASE if a dependent is resolved.
+
+package RT::Action::AutoOpen;
+require RT::Action::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA=qw(RT::Action::Generic);
+
+#Do what we need to do and send it out.
+
+#What does this type of Action does
+
+# {{{ sub Describe 
+sub Describe  {
+  my $self = shift;
+  return (ref $self );
+}
+# }}}
+
+
+# {{{ sub Prepare 
+sub Prepare {
+    my $self = shift;
+
+    # if the ticket is already open or the ticket is new and the message is more mail from the
+    # requestor, don't reopen it.
+
+    if ( ( $self->TicketObj->Status eq 'open' )
+         || ( ( $self->TicketObj->Status eq 'new' )
+              && $self->TransactionObj->IsInbound )
+      ) {
+
+        return undef;
+    }
+    else {
+        return (1);
+    }
+}
+# }}}
+
+sub Commit {
+    my $self = shift;
+      my $oldstatus = $self->TicketObj->Status();
+        $self->TicketObj->__Set( Field => 'Status', Value => 'open' );
+        $self->TicketObj->_NewTransaction(
+                         Type     => 'Set',
+                         Field    => 'Status',
+                         OldValue => $oldstatus,
+                         NewValue => 'open',
+                         Data => 'Ticket auto-opened on incoming correspondence'
+        );
+
+
+    return(1);
+}
+
+eval "require RT::Action::AutoOpen_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/AutoOpen_Vendor.pm});
+eval "require RT::Action::AutoOpen_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/AutoOpen_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Action/CreateTickets.pm b/rt/lib/RT/Action/CreateTickets.pm
new file mode 100644 (file)
index 0000000..0ab2067
--- /dev/null
@@ -0,0 +1,564 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Action::CreateTickets;
+require RT::Action::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Action::Generic);
+
+use MIME::Entity;
+
+=head1 NAME
+
+ RT::Action::CreateTickets
+
+Create one or more tickets according to an externally supplied template.
+
+
+=head1 SYNOPSIS
+
+ ===Create-Ticket: codereview
+ Subject: Code review for {$Tickets{'TOP'}->Subject}
+ Depended-On-By: {$Tickets{'TOP'}->Id}
+ Content: Someone has created a ticket. you should review and approve it,
+ so they can finish their work
+ ENDOFCONTENT
+
+=head1 DESCRIPTION
+
+
+Using the "CreateTickets" ScripAction and mandatory dependencies, RT now has 
+the ability to model complex workflow. When a ticket is created in a queue
+that has a "CreateTickets" scripaction, that ScripAction parses its "Template"
+
+
+
+=head2 FORMAT
+
+CreateTickets uses the template as a template for an ordered set of tickets 
+to create. The basic format is as follows:
+
+
+ ===Create-Ticket: identifier
+ Param: Value
+ Param2: Value
+ Param3: Value
+ Content: Blah
+ blah
+ blah
+ ENDOFCONTENT
+ ===Create-Ticket: id2
+ Param: Value
+ Content: Blah
+ ENDOFCONTENT
+
+
+Each ===Create-Ticket: section is evaluated as its own 
+Text::Template object, which means that you can embed snippets
+of perl inside the Text::Template using {} delimiters, but that 
+such sections absolutely can not span a ===Create-Ticket boundary.
+
+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.
+
+A simple example:
+
+ ===Create-Ticket: codereview
+ Subject: Code review for {$Tickets{'TOP'}->Subject}
+ Depended-On-By: {$Tickets{'TOP'}->Id}
+ Content: Someone has created a ticket. you should review and approve it,
+ so they can finish their work
+ ENDOFCONTENT
+
+
+
+A convoluted example
+
+ ===Create-Ticket: approval
+ { # Find out who the administrators of the group called "HR" 
+   # of which the creator of this ticket is a member
+    my $name = "HR";
+   
+    my $groups = RT::Groups->new($RT::SystemUser);
+    $groups->LimitToUserDefinedGroups();
+    $groups->Limit(FIELD => "Name", OPERATOR => "=", VALUE => "$name");
+    $groups->WithMember($TransactionObj->CreatorObj->Id);
+    my $groupid = $groups->First->Id;
+    my $adminccs = RT::Users->new($RT::SystemUser);
+    $adminccs->WhoHaveRight(
+       Right => "AdminGroup",
+       Object =>$groups->First,
+       IncludeSystemRights => undef,
+       IncludeSuperusers => 0,
+       IncludeSubgroupMembers => 0,
+    );
+     my @admins;
+     while (my $admin = $adminccs->Next) {
+         push (@admins, $admin->EmailAddress); 
+     }
+ }
+ Queue: Approvals
+ Type: Approval
+ AdminCc: {join ("\nAdminCc: ",@admins) }
+ Depended-On-By: {$Tickets{"TOP"}->Id}
+ Refers-To: {$Tickets{"TOP"}->Id}
+ Subject: Approval for ticket: {$Tickets{"TOP"}->Id} - {$Tickets{"TOP"}->Subject}
+ Due: {time + 86400}
+ Content-Type: text/plain
+ Content: Your approval is requested for the ticket {$Tickets{"TOP"}->Id}: {$Tickets{"TOP"}->Subject}
+ Blah
+ Blah
+ ENDOFCONTENT
+ ===Create-Ticket: two
+ Subject: Manager approval
+ Depended-On-By: {$Tickets{"TOP"}->Id}
+ Refers-On: {$Tickets{"approval"}->Id}
+ Queue: Approvals
+ Content-Type: text/plain
+ Content: 
+ Your approval is requred for this ticket, too.
+ ENDOFCONTENT
+=head2 Acceptable fields
+
+A complete list of acceptable fields for this beastie:
+
+
+    *  Queue           => Name or id# of a queue
+       Subject         => A text string
+     ! Status          => A valid status. defaults to 'new'
+       Due             => Dates can be specified in seconds since the epoch
+                          to be handled literally or in a semi-free textual
+                          format which RT will attempt to parse.
+                        
+                          
+                          
+       Starts          => 
+       Started         => 
+       Resolved        => 
+       Owner           => Username or id of an RT user who can and should own 
+                          this ticket
+   +   Requestor       => Email address
+   +   Cc              => Email address 
+   +   AdminCc         => Email address 
+       TimeWorked      => 
+       TimeEstimated   => 
+       TimeLeft        => 
+       InitialPriority => 
+       FinalPriority   => 
+       Type            => 
+    +! DependsOn       => 
+    +! DependedOnBy    =>
+    +! RefersTo        =>
+    +! ReferredToBy    => 
+    +! Members         =>
+    +! MemberOf        => 
+       Content         => content. Can extend to multiple lines. Everything
+                          within a template after a Content: header is treated
+                          as content until we hit a line containing only 
+                          ENDOFCONTENT
+       ContentType     => the content-type of the Content field
+       CustomField-<id#> => custom field value
+
+Fields marked with an * are required.
+
+Fields marked with a + man have multiple values, simply
+by repeating the fieldname on a new line with an additional value.
+
+Fields marked with a ! are postponed to be processed after all
+tickets in the same actions are created.  Except for 'Status', those
+field can also take a ticket name within the same action (i.e.
+the identifiers after ==Create-Ticket), instead of raw Ticket ID
+numbers.
+
+When parsed, field names are converted to lowercase and have -s stripped.
+Refers-To, RefersTo, refersto, refers-to and r-e-f-er-s-tO will all 
+be treated as the same thing.
+
+
+=begin testing
+
+ok (require RT::Action::CreateTickets);
+use_ok(RT::Scrip);
+use_ok(RT::Template);
+use_ok(RT::ScripAction);
+use_ok(RT::ScripCondition);
+use_ok(RT::Ticket);
+
+my $approvalsq = RT::Queue->new($RT::SystemUser);
+$approvalsq->Create(Name => 'Approvals');
+ok ($approvalsq->Id, "Created Approvals test queue");
+
+
+my $approvals = 
+'===Create-Ticket: approval
+{  my $name = "HR";
+     my $groups = RT::Groups->new($RT::SystemUser);
+   $groups->LimitToUserDefinedGroups();
+   $groups->Limit(FIELD => "Name", OPERATOR => "=", VALUE => "$name");
+   $groups->WithMember($Transaction->CreatorObj->Id);
+
+   my $groupid = $groups->First->Id;
+
+   my $adminccs = RT::Users->new($RT::SystemUser);
+   $adminccs->WhoHaveRight(Right => "AdminGroup", IncludeSystemRights => undef, IncludeSuperusers => 0, IncludeSubgroupMembers => 0, Object => $groups->First);
+
+    my @admins;
+    while (my $admin = $adminccs->Next) {
+        push (@admins, $admin->EmailAddress); 
+    }
+}
+Queue: Approvals
+Type: Approval
+AdminCc: {join ("\nAdminCc: ",@admins) }
+Depended-On-By: {$Tickets{"TOP"}->Id}
+Refers-To: {$Tickets{"TOP"}->Id}
+Subject: Approval for ticket: {$Tickets{"TOP"}->Id} - {$Tickets{"TOP"}->Subject}
+Due: {time + 86400}
+Content-Type: text/plain
+Content: Your approval is requested for the ticket {$Tickets{"TOP"}->Id}: {$Tickets{"TOP"}->Subject}
+Blah
+Blah
+ENDOFCONTENT
+===Create-Ticket: two
+Subject: Manager approval.
+Depends-On: {$Tickets{"approval"}->Id}
+Queue: Approvals
+Content-Type: text/plain
+Content: 
+Your minion approved this ticket. you ok with that?
+ENDOFCONTENT
+';
+
+ok ($approvals =~ /Content/, "Read in the approvals template");
+
+my $apptemp = RT::Template->new($RT::SystemUser);
+$apptemp->Create( Content => $approvals, Name => "Approvals", Queue => "0");
+
+ok ($apptemp->Id);
+
+my $q = RT::Queue->new($RT::SystemUser);
+$q->Create(Name => 'WorkflowTest');
+ok ($q->Id, "Created workflow test queue");
+
+my $scrip = RT::Scrip->new($RT::SystemUser);
+my ($sval, $smsg) =$scrip->Create( ScripCondition => 'On Transaction',
+                ScripAction => 'Create Tickets',
+                Template => 'Approvals',
+                Queue => $q->Id);
+ok ($sval, $smsg);
+ok ($scrip->Id, "Created the scrip");
+ok ($scrip->TemplateObj->Id, "Created the scrip template");
+ok ($scrip->ConditionObj->Id, "Created the scrip condition");
+ok ($scrip->ActionObj->Id, "Created the scrip action");
+
+my $t = RT::Ticket->new($RT::SystemUser);
+$t->Create(Subject => "Sample workflow test",
+           Owner => "root",
+           Queue => $q->Id);
+
+
+=end testing
+
+
+=head1 AUTHOR
+
+Jesse Vincent <jesse@bestpractical.com> 
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
+my %LINKTYPEMAP = (
+    MemberOf => { Type => 'MemberOf',
+                  Mode => 'Target', },
+    Members => { Type => 'MemberOf',
+                 Mode => 'Base', },
+    HasMember => { Type => 'MemberOf',
+                   Mode => 'Base', },
+    RefersTo => { Type => 'RefersTo',
+                  Mode => 'Target', },
+    ReferredToBy => { Type => 'RefersTo',
+                      Mode => 'Base', },
+    DependsOn => { Type => 'DependsOn',
+                   Mode => 'Target', },
+    DependedOnBy => { Type => 'DependsOn',
+                      Mode => 'Base', },
+
+);
+
+# {{{ Scrip methods (Commit, Prepare)
+
+# {{{ sub Commit 
+#Do what we need to do and send it out.
+sub Commit {
+    my $self = shift;
+    my (@links, @postponed);
+
+    # XXX: cargo cult programming that works. i'll be back.
+    use bytes;
+
+    # Create all the tickets we care about
+    return(1) unless $self->TicketObj->Type eq 'ticket';
+
+    %T::Tickets = ();
+
+    foreach my $template_id ( @{ $self->{'template_order'} } ) {
+       $T::Tickets{'TOP'} = $T::TOP = $self->TicketObj;
+       $RT::Logger->debug("Workflow: processing $template_id of $T::TOP");
+
+       $T::ID = $template_id;
+       @T::AllID = @{ $self->{'template_order'} };
+
+        my $template = Text::Template->new(
+             TYPE   => 'STRING',
+             SOURCE => $self->{'templates'}->{$template_id}
+        );
+
+       $RT::Logger->debug("Workflow: evaluating\n$self->{templates}{$template_id}");
+
+       my $err;
+        my $filled_in = $template->fill_in( PACKAGE => 'T', BROKEN => sub {
+           $err = { @_ }->{error};
+       } );
+
+       $RT::Logger->debug("Workflow: yielding\n$filled_in");
+
+       if ($err) {
+           $RT::Logger->error("Ticket creation failed for ".$self->TicketObj->Id." ".$err);
+           while (my ($k, $v) = each %T::X) {
+               $RT::Logger->debug("Eliminating $template_id from ${k}'s parents.");
+               delete $v->{$template_id};
+           }
+           next;
+       }
+
+        my %args;
+        my @lines = ( split ( /\n/, $filled_in ) );
+        while ( defined(my $line = shift @lines) ) {
+            if ( $line =~ /^(.*?):(?:\s+(.*))?$/ ) {
+                my $value = $2;
+                my $tag = lc ($1);
+                $tag =~ s/-//g;
+
+               if (ref($args{$tag})) { #If it's an array, we want to push the value
+                   push @{$args{$tag}}, $value;
+               }
+               elsif (defined ($args{$tag})) { #if we're about to get a second value, make it an array
+                   $args{$tag} = [$args{$tag}, $value];
+               }
+               else { #if there's nothing there, just set the value
+                   $args{ $tag } = $value;
+               }
+
+                if ( $tag eq 'content' ) { #just build up the content
+                        # convert it to an array
+                        $args{$tag} = defined($value) ? [ $value."\n" ] : [];
+                      while ( defined(my $l = shift @lines) ) {
+                        last if ($l =~  /^ENDOFCONTENT\s*$/) ;
+                        push @{$args{'content'}}, $l."\n";
+                        }
+                }
+            }
+       }
+
+       foreach my $date qw(due starts started resolved) {
+           my $dateobj = RT::Date->new($RT::SystemUser);
+           next unless $args{$date};
+           if ($args{$date} =~ /^\d+$/) {
+               $dateobj->Set(Format => 'unix', Value => $args{$date});
+           } else {
+               $dateobj->Set(Format => 'unknown', Value => $args{$date});
+           }
+           $args{$date} = $dateobj->ISO;
+       }
+       my $mimeobj = MIME::Entity->new();
+       $mimeobj->build(Type => $args{'contenttype'},
+                       Data => $args{'content'});
+       # Now we have a %args to work with. 
+       # Make sure we have at least the minimum set of 
+       # reasonable data and do our thang
+       $T::Tickets{$template_id} ||= RT::Ticket->new($RT::SystemUser);
+
+       # Deferred processing   
+       push @links, (
+           $T::Tickets{$template_id}, {
+               DependsOn               => $args{'dependson'},
+               DependedOnBy    => $args{'dependedonby'},
+               RefersTo                => $args{'refersto'},
+               ReferredToBy    => $args{'referredtoby'},
+               Members         => $args{'members'},
+               MemberOf                => $args{'memberof'},
+           }
+       );
+
+       push @postponed, (
+           # Status is postponed so we don't violate dependencies
+           $T::Tickets{$template_id}, {
+               Status          => $args{'status'},
+           }
+       );
+
+       $args{'requestor'} ||= $self->TicketObj->Requestors->MemberEmailAddresses;
+
+       my %ticketargs = ( Queue => $args{'queue'},
+                     Subject=> $args{'subject'},
+                   Status => 'new',
+                   Due => $args{'due'},
+                   Starts => $args{'starts'},
+                   Started => $args{'started'},
+                   Resolved => $args{'resolved'},
+                   Owner => $args{'owner'},
+                   Requestor => $args{'requestor'},
+                   Cc => $args{'cc'},
+                   AdminCc=> $args{'admincc'},
+                   TimeWorked =>$args{'timeworked'},
+                   TimeEstimated =>$args{'timeestimated'},
+                   TimeLeft =>$args{'timeleft'},
+                   InitialPriority => $args{'initialpriority'},
+                   FinalPriority => $args{'finalpriority'},
+                   Type => $args{'type'}, 
+                   MIMEObj => $mimeobj);
+
+
+       foreach my $key (keys(%args)) {
+           $key =~ /^customfield-(\d+)$/ or next;
+           $ticketargs{ "CustomField-" . $1 } = $args{$key};
+       }
+
+       my ($id, $transid, $msg) = $T::Tickets{$template_id}->Create(%ticketargs);
+       if (!$id) {
+           $RT::Logger->error(
+               "Couldn't create related ticket $template_id for ".
+               $self->TicketObj->Id." ".$msg
+           );
+           next;
+       }
+
+       $RT::Logger->debug("Assigned $template_id with $id");
+       $T::Tickets{$template_id}->SetOriginObj($self->TicketObj)
+           if $T::Tickets{$template_id}->can('SetOriginObj');
+    }
+
+    # postprocessing: add links
+
+    while (my $ticket = shift(@links)) {
+       $RT::Logger->debug("Handling links for " . $ticket->Id);
+       my %args = %{shift(@links)};
+
+       foreach my $type ( keys %LINKTYPEMAP ) {
+           next unless (defined $args{$type});
+           foreach my $link (
+               ref( $args{$type} ) ? @{ $args{$type} } : ( $args{$type} ) )
+           {
+               if (!exists $T::Tickets{$link}) {
+                   $RT::Logger->debug("Skipping $type link for $link (non-existent)");
+                   next;
+               }
+               $RT::Logger->debug("Building $type link for $link: " . $T::Tickets{$link}->Id);
+               $link = $T::Tickets{$link}->Id;
+
+               my ( $wval, $wmsg ) = $ticket->AddLink(
+                   Type                          => $LINKTYPEMAP{$type}->{'Type'},
+                   $LINKTYPEMAP{$type}->{'Mode'} => $link,
+                   Silent                        => 1
+               );
+
+               $RT::Logger->warning("AddLink thru $link failed: $wmsg") unless $wval;
+               # push @non_fatal_errors, $wmsg unless ($wval);
+           }
+
+       }
+    }
+
+    # postponed actions -- Status only, currently
+    while (my $ticket = shift(@postponed)) {
+       $RT::Logger->debug("Handling postponed actions for $ticket");
+       my %args = %{shift(@postponed)};
+
+       $ticket->SetStatus($args{Status}) if defined $args{Status};
+    }
+
+    return(1);
+}
+# }}}
+
+# {{{ sub Prepare 
+
+sub Prepare  {
+  my $self = shift;
+  
+  unless ($self->TemplateObj) {
+    $RT::Logger->warning("No template object handed to $self\n");
+  }
+  
+  unless ($self->TransactionObj) {
+    $RT::Logger->warning("No transaction object handed to $self\n");
+    
+  }
+  
+  unless ($self->TicketObj) {
+    $RT::Logger->warning("No ticket object handed to $self\n");
+      
+  }
+
+    
+
+my $template_id;
+foreach my $line (split(/\n/,$self->TemplateObj->Content)) {
+        if ($line =~ /^===Create-Ticket: (.*)$/) {
+                $template_id = $1;
+                push @{$self->{'template_order'}},$template_id;
+        } else {
+                $self->{'templates'}->{$template_id} .= $line."\n";
+        }       
+        
+        
+}
+  
+  return 1;
+  
+}
+
+# }}}
+
+# }}}
+
+eval "require RT::Action::CreateTickets_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/CreateTickets_Vendor.pm});
+eval "require RT::Action::CreateTickets_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/CreateTickets_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/Action/EscalatePriority.pm b/rt/lib/RT/Action/EscalatePriority.pm
new file mode 100644 (file)
index 0000000..7ed63ae
--- /dev/null
@@ -0,0 +1,142 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Action::EscalatePriority
+
+=head1 DESCRIPTION
+
+EscalatePriority is a ScripAction which is NOT intended to be called per 
+transaction. It's intended to be called by an RT escalation daemon.
+(The daemon is called escalator).
+
+EsclatePriority uses the following formula to change a ticket's priority:
+
+    Priority = Priority +  (( FinalPriority - Priority ) / ( DueDate-Today))
+
+Unless the duedate is past, in which case priority gets bumped straight
+to final priority.
+
+In this way, priority is either increased or decreased toward the final priority
+as the ticket heads toward its due date.
+
+
+=cut
+
+
+package RT::Action::EscalatePriority;
+require RT::Action::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA=qw(RT::Action::Generic);
+
+#Do what we need to do and send it out.
+
+#What does this type of Action does
+
+# {{{ sub Describe 
+sub Describe  {
+  my $self = shift;
+  return (ref $self . " will move a ticket's priority toward its final priority.");
+}
+# }}}
+       
+
+# {{{ sub Prepare 
+sub Prepare  {
+    my $self = shift;
+    
+    if ($self->TicketObj->Priority() == $self->TicketObj->FinalPriority()) {
+       # no update necessary.
+       return 0;
+    }
+   
+    #compute the number of days until the ticket is due
+    my $due = $self->TicketObj->DueObj();
+    
+
+    # If we don't have a due date, adjust the priority by one
+    # until we hit the final priority
+    if ($due->Unix() < 1) {
+       if ( $self->TicketObj->Priority > $self->TicketObj->FinalPriority ){
+           $self->{'prio'} = ($self->TicketObj->Priority - 1);
+           return 1;
+       }
+       elsif ( $self->TicketObj->Priority < $self->TicketObj->FinalPriority ){
+           $self->{'prio'} = ($self->TicketObj->Priority + 1);
+           return 1;
+       }
+       # otherwise the priority is at the final priority. we don't need to
+       # Continue
+       else {
+           return 0;
+       }
+    }
+
+    # we've got a due date. now there are other things we should do
+    else { 
+       my $diff_in_seconds = $due->Diff(time());    
+       my $diff_in_days = int( $diff_in_seconds / 86400);    
+       
+       #if we haven't hit the due date yet
+       if ($diff_in_days > 0 ) {       
+           
+           # compute the difference between the current priority and the
+           # final priority
+           
+           my $prio_delta = 
+             $self->TicketObj->FinalPriority() - $self->TicketObj->Priority;
+           
+           my $inc_priority_by = int( $prio_delta / $diff_in_days );
+           
+           #set the ticket's priority to that amount
+           $self->{'prio'} = $self->TicketObj->Priority + $inc_priority_by;
+           
+       }
+       #if $days is less than 1, set priority to final_priority
+       else {  
+           $self->{'prio'} = $self->TicketObj->FinalPriority();
+       }
+
+    }
+    return 1;
+}
+# }}}
+
+sub Commit {
+    my $self = shift;
+   my ($val, $msg) = $self->TicketObj->SetPriority($self->{'prio'});
+
+   unless ($val) {
+       $RT::Logger->debug($self . " $msg\n"); 
+   }
+}
+
+eval "require RT::Action::EscalatePriority_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/EscalatePriority_Vendor.pm});
+eval "require RT::Action::EscalatePriority_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/EscalatePriority_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Action/SetPriority.pm b/rt/lib/RT/Action/SetPriority.pm
new file mode 100644 (file)
index 0000000..515eeb5
--- /dev/null
@@ -0,0 +1,61 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Action::SetPriority;
+require RT::Action::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA=qw(RT::Action::Generic);
+
+#Do what we need to do and send it out.
+
+#What does this type of Action does
+
+# {{{ sub Describe 
+sub Describe  {
+  my $self = shift;
+  return (ref $self . " will set a ticket's priority to the argument provided.");
+}
+# }}}
+
+
+# {{{ sub Prepare 
+sub Prepare  {
+    # nothing to prepare
+    return 1;
+}
+# }}}
+
+sub Commit {
+    my $self = shift;
+    $self->TicketObj->SetPriority($self->Argument);
+
+}
+
+eval "require RT::Action::SetPriority_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/SetPriority_Vendor.pm});
+eval "require RT::Action::SetPriority_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/SetPriority_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Action/UserDefined.pm b/rt/lib/RT/Action/UserDefined.pm
new file mode 100644 (file)
index 0000000..e2e3d72
--- /dev/null
@@ -0,0 +1,71 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Action::UserDefined;
+use RT::Action::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Action::Generic);
+
+=head2 Prepare
+
+This happens on every transaction. it's always applicable
+
+=cut
+
+sub Prepare {
+    my $self = shift;
+    my $retval = eval $self->ScripObj->CustomPrepareCode;
+    if ($@) {
+        $RT::Logger->error("Scrip ".$self->ScripObj->Id. " Prepare failed: ".$@);
+        return (undef);
+    }
+    return ($retval);
+}
+
+=head2 Commit
+
+This happens on every transaction. it's always applicable
+
+=cut
+
+sub Commit {
+    my $self = shift;
+    my $retval = eval $self->ScripObj->CustomCommitCode;
+    if ($@) {
+        $RT::Logger->error("Scrip ".$self->ScripObj->Id. " Commit failed: ".$@);
+        return (undef);
+    }
+    return ($retval);
+}
+
+eval "require RT::Action::UserDefined_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/UserDefined_Vendor.pm});
+eval "require RT::Action::UserDefined_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/UserDefined_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/Attachment_Overlay.pm b/rt/lib/RT/Attachment_Overlay.pm
new file mode 100644 (file)
index 0000000..d31aa75
--- /dev/null
@@ -0,0 +1,571 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 SYNOPSIS
+
+  use RT::Attachment;
+
+
+=head1 DESCRIPTION
+
+This module should never be instantiated directly by client code. it's an internal 
+module which should only be instantiated through exported APIs in Ticket, Queue and other 
+similar objects.
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Attachment);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use MIME::Base64;
+use MIME::QuotedPrint;
+
+# {{{ sub _ClassAccessible 
+sub _ClassAccessible {
+    {
+    TransactionId   => { 'read'=>1, 'public'=>1, },
+    MessageId       => { 'read'=>1, },
+    Parent          => { 'read'=>1, },
+    ContentType     => { 'read'=>1, },
+    Subject         => { 'read'=>1, },
+    Content         => { 'read'=>1, },
+    ContentEncoding => { 'read'=>1, },
+    Headers         => { 'read'=>1, },
+    Filename        => { 'read'=>1, },
+    Creator         => { 'read'=>1, 'auto'=>1, },
+    Created         => { 'read'=>1, 'auto'=>1, },
+  };
+}
+# }}}
+
+# {{{ sub TransactionObj 
+
+=head2 TransactionObj
+
+Returns the transaction object asscoiated with this attachment.
+
+=cut
+
+sub TransactionObj {
+    require RT::Transaction;
+    my $self=shift;
+    unless (exists $self->{_TransactionObj}) {
+       $self->{_TransactionObj}=RT::Transaction->new($self->CurrentUser);
+       $self->{_TransactionObj}->Load($self->TransactionId);
+    }
+    return $self->{_TransactionObj};
+}
+
+# }}}
+
+# {{{ sub Create 
+
+=head2 Create
+
+Create a new attachment. Takes a paramhash:
+    
+    'Attachment' Should be a single MIME body with optional subparts
+    'Parent' is an optional Parent RT::Attachment object
+    'TransactionId' is the mandatory id of the Transaction this attachment is associated with.;
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my ($id);
+    my %args = ( id            => 0,
+                 TransactionId => 0,
+                 Parent        => 0,
+                 Attachment    => undef,
+                 @_ );
+
+    #For ease of reference
+    my $Attachment = $args{'Attachment'};
+
+    #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);
+
+    }
+
+    #If we possibly can, collapse it to a singlepart
+    $Attachment->make_singlepart;
+
+    #Get the subject
+    my $Subject = $Attachment->head->get( 'subject', 0 );
+    defined($Subject) or $Subject = '';
+    chomp($Subject);
+
+    #Get the filename
+    my $Filename = $Attachment->head->recommended_filename || eval {
+       ${ $Attachment->head->{mail_hdr_hash}{'Content-Disposition'}[0] }
+           =~ /^.*\bfilename="(.*)"$/ ? $1 : ''
+    };
+
+    if ( $Attachment->parts ) {
+        $id = $self->SUPER::Create(
+            TransactionId => $args{'TransactionId'},
+            Parent        => 0,
+            ContentType   => $Attachment->mime_type,
+            Headers => $Attachment->head->as_string,
+            Subject => $Subject);
+
+        foreach my $part ( $Attachment->parts ) {
+            my $SubAttachment = new RT::Attachment( $self->CurrentUser );
+            $SubAttachment->Create(
+                TransactionId => $args{'TransactionId'},
+                Parent        => $id,
+                Attachment    => $part,
+                ContentType   => $Attachment->mime_type,
+                Headers       => $Attachment->head->as_string(),
+
+            );
+        }
+        return ($id);
+    }
+
+    #If it's not multipart
+    else {
+
+        my $ContentEncoding = 'none';
+
+        my $Body = $Attachment->bodyhandle->as_string;
+
+        #get the max attachment length from RT
+        my $MaxSize = $RT::MaxAttachmentSize;
+
+        #if the current attachment contains nulls and the 
+        #database doesn't support embedded nulls
+
+        if ( $RT::AlwaysUseBase64 or
+            ( !$RT::Handle->BinarySafeBLOBs ) && ( $Body =~ /\x00/ ) ) {
+
+            # set a flag telling us to mimencode the attachment
+            $ContentEncoding = 'base64';
+
+            #cut the max attchment size by 25% (for mime-encoding overhead.
+            $RT::Logger->debug("Max size is $MaxSize\n");
+            $MaxSize = $MaxSize * 3 / 4;
+        # Some databases (postgres) can't handle non-utf8 data 
+        } elsif (    !$RT::Handle->BinarySafeBLOBs
+                  && $Attachment->mime_type !~ /text\/plain/gi
+                  && !Encode::is_utf8( $Body, 1 ) ) {
+              $ContentEncoding = 'quoted-printable';
+        }
+
+        #if the attachment is larger than the maximum size
+        if ( ($MaxSize) and ( $MaxSize < length($Body) ) ) {
+
+            # if we're supposed to truncate large attachments
+            if ($RT::TruncateLongAttachments) {
+
+                # truncate the attachment to that length.
+                $Body = substr( $Body, 0, $MaxSize );
+
+            }
+
+            # elsif we're supposed to drop large attachments on the floor,
+            elsif ($RT::DropLongAttachments) {
+
+                # drop the attachment on the floor
+                $RT::Logger->info( "$self: Dropped an attachment of size " . length($Body) . "\n" . "It started: " . substr( $Body, 0, 60 ) . "\n" );
+                return (undef);
+            }
+        }
+
+        # if we need to mimencode the attachment
+        if ( $ContentEncoding eq 'base64' ) {
+
+            # base64 encode the attachment
+            Encode::_utf8_off($Body);
+            $Body = MIME::Base64::encode_base64($Body);
+
+        } elsif ($ContentEncoding eq 'quoted-printable') {
+                   Encode::_utf8_off($Body);
+            $Body = MIME::QuotedPrint::encode($Body);
+        }
+
+
+        my $id = $self->SUPER::Create( TransactionId => $args{'TransactionId'},
+                                       ContentType   => $Attachment->mime_type,
+                                       ContentEncoding => $ContentEncoding,
+                                       Parent          => $args{'Parent'},
+                                       Headers       =>  $Attachment->head->as_string, 
+                                       Subject       =>  $Subject,
+                                       Content         => $Body,
+                                       Filename => $Filename, );
+        return ($id);
+    }
+}
+
+# }}}
+
+
+=head2 Import
+
+Create an attachment exactly as specified in the named parameters.
+
+=cut
+
+
+sub Import {
+    my $self = shift;
+    return($self->SUPER::Create(@_));
+}
+
+# {{{ sub Content
+
+=head2 Content
+
+Returns the attachment's content. if it's base64 encoded, decode it 
+before returning it.
+
+=cut
+
+sub Content {
+  my $self = shift;
+  my $decode_utf8 = (($self->ContentType eq 'text/plain') ? 1 : 0);
+
+  if ( $self->ContentEncoding eq 'none' || ! $self->ContentEncoding ) {
+      return $self->_Value(
+         'Content',
+         decode_utf8 => $decode_utf8,
+      );
+  } elsif ( $self->ContentEncoding eq 'base64' ) {
+      return ( $decode_utf8
+        ? Encode::decode_utf8(MIME::Base64::decode_base64($self->_Value('Content')))
+        : MIME::Base64::decode_base64($self->_Value('Content'))
+      );
+  } elsif ( $self->ContentEncoding eq 'quoted-printable' ) {
+      return ( $decode_utf8
+        ? Encode::decode_utf8(MIME::QuotedPrint::decode($self->_Value('Content')))
+        : MIME::QuotedPrint::decode($self->_Value('Content'))
+      );
+  } else {
+      return( $self->loc("Unknown ContentEncoding [_1]", $self->ContentEncoding));
+  }
+}
+
+
+# }}}
+
+
+# {{{ sub OriginalContent
+
+=head2 OriginalContent
+
+Returns the attachment's content as octets before RT's mangling.
+Currently, this just means restoring text/plain content back to its
+original encoding.
+
+=cut
+
+sub OriginalContent {
+  my $self = shift;
+
+  return $self->Content unless $self->ContentType eq 'text/plain';
+  my $enc = $self->OriginalEncoding;
+
+  my $content;
+  if ( $self->ContentEncoding eq 'none' || ! $self->ContentEncoding ) {
+      $content = $self->_Value('Content', decode_utf8 => 0);
+  } elsif ( $self->ContentEncoding eq 'base64' ) {
+      $content = MIME::Base64::decode_base64($self->_Value('Content', decode_utf8 => 0));
+  } elsif ( $self->ContentEncoding eq 'quoted-printable' ) {
+      return MIME::QuotedPrint::decode($self->_Value('Content', decode_utf8 => 0));
+  } else {
+      return( $self->loc("Unknown ContentEncoding [_1]", $self->ContentEncoding));
+  }
+
+  # Encode::_utf8_on($content);
+  if (!$enc or $enc eq 'utf8' or $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);
+  return $content;
+}
+
+# }}}
+
+
+# {{{ sub OriginalEncoding
+
+=head2 OriginalEncoding
+
+Returns the attachment's original encoding.
+
+=cut
+
+sub OriginalEncoding {
+  my $self = shift;
+  return $self->GetHeader('X-RT-Original-Encoding');
+}
+
+# }}}
+
+# {{{ sub Children
+
+=head2 Children
+
+  Returns an RT::Attachments object which is preloaded with all Attachments objects with this Attachment\'s Id as their 'Parent'
+
+=cut
+
+sub Children {
+    my $self = shift;
+    
+    my $kids = new RT::Attachments($self->CurrentUser);
+    $kids->ChildrenOf($self->Id);
+    return($kids);
+}
+
+# }}}
+
+# {{{ UTILITIES
+
+# {{{ sub Quote 
+
+
+
+sub Quote {
+    my $self=shift;
+    my %args=(Reply=>undef, # Prefilled reply (i.e. from the KB/FAQ system)
+             @_);
+
+    my ($quoted_content, $body, $headers);
+    my $max=0;
+
+    # TODO: Handle Multipart/Mixed (eventually fix the link in the
+    # ShowHistory web template?)
+    if ($self->ContentType =~ m{^(text/plain|message)}i) {
+       $body=$self->Content;
+
+       # Do we need any preformatting (wrapping, that is) of the message?
+
+       # Remove quoted signature.
+       $body =~ s/\n-- \n(.*)$//s;
+
+       # What's the longest line like?
+       foreach (split (/\n/,$body)) {
+           $max=length if ( length > $max);
+       }
+
+       if ($max>76) {
+           require Text::Wrapper;
+           my $wrapper=new Text::Wrapper
+               (
+                columns => 70, 
+                body_start => ($max > 70*3 ? '   ' : ''),
+                par_start => ''
+                );
+           $body=$wrapper->wrap($body);
+       }
+
+       $body =~ s/^/> /gm;
+
+       $body = '[' . $self->TransactionObj->CreatorObj->Name() . ' - ' . $self->TransactionObj->CreatedAsString()
+                   . "]:\n\n"
+               . $body . "\n\n";
+
+    } else {
+       $body = "[Non-text message not quoted]\n\n";
+    }
+    
+    $max=60 if $max<60;
+    $max=70 if $max>78;
+    $max+=2;
+
+    return (\$body, $max);
+}
+# }}}
+
+# {{{ sub NiceHeaders - pulls out only the most relevant headers
+
+=head2 NiceHeaders
+
+Returns the To, From, Cc, Date and Subject headers.
+
+It is a known issue that this breaks if any of these headers are not
+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
+    }
+    return $hdrs;
+}
+# }}}
+
+# {{{ sub Headers
+
+=head2 Headers
+
+Returns this object's headers as a string.  This method specifically
+removes the RT-Send-Bcc: header, so as to never reveal to whom RT sent a Bcc.
+We need to record the RT-Send-Cc and RT-Send-Bcc values so that we can actually send
+out mail. (The mailing rules are seperated from the ticket update code by
+an abstraction barrier that makes it impossible to pass this data directly
+
+=cut
+
+sub Headers {
+    my $self = shift;
+    my $hdrs="";
+    for (split(/\n/,$self->SUPER::Headers)) {
+           $hdrs.="$_\n" unless /^(RT-Send-Bcc): /i
+    }
+    return $hdrs;
+}
+
+
+# }}}
+
+# {{{ sub GetHeader
+
+=head2 GetHeader ( 'Tag')
+
+Returns the value of the header Tag as a string. This bypasses the weeding out
+done in Headers() above.
+
+=cut
+
+sub GetHeader {
+    my $self = shift;
+    my $tag = shift;
+    foreach my $line (split(/\n/,$self->SUPER::Headers)) {
+        if ($line =~ /^\Q$tag\E:\s+(.*)$/i) { #if we find the header, return its value
+            return ($1);
+        }
+    }
+    
+    # we found no header. return an empty string
+    return undef;
+}
+# }}}
+
+# {{{ sub SetHeader
+
+=head2 SetHeader ( 'Tag', 'Value' )
+
+Replace or add a Header to the attachment's headers.
+
+=cut
+
+sub SetHeader {
+    my $self = shift;
+    my $tag = shift;
+    my $newheader = '';
+
+    foreach my $line (split(/\n/,$self->SUPER::Headers)) {
+        if (defined $tag and $line =~ /^\Q$tag\E:\s+(.*)$/i) {
+           $newheader .= "$tag: $_[0]\n";
+           undef $tag;
+        }
+       else {
+           $newheader .= "$line\n";
+       }
+    }
+
+    $newheader .= "$tag: $_[0]\n" if defined $tag;
+    $self->__Set( Field => 'Headers', Value => $newheader);
+}
+# }}}
+
+# {{{ sub _Value 
+
+=head2 _Value
+
+Takes the name of a table column.
+Returns its value as a string, if the user passes an ACL check
+
+=cut
+
+sub _Value  {
+
+    my $self = shift;
+    my $field = shift;
+    
+    
+    #if the field is public, return it.
+    if ($self->_Accessible($field, 'public')) {
+       #$RT::Logger->debug("Skipping ACL check for $field\n");
+       return($self->__Value($field, @_));
+       
+    }
+    
+    #If it's a comment, we need to be extra special careful
+    elsif ( (($self->TransactionObj->CurrentUserHasRight('ShowTicketComments')) and
+            ($self->TransactionObj->Type eq 'Comment') )  or
+           ($self->TransactionObj->CurrentUserHasRight('ShowTicket'))) {
+               return($self->__Value($field, @_));
+    }
+    #if they ain't got rights to see, don't let em
+    else {
+           return(undef);
+       }
+       
+    
+}
+
+# }}}
+
+sub ContentLength {
+    my $self = shift;
+
+    unless ( (($self->TransactionObj->CurrentUserHasRight('ShowTicketComments')) and
+            ($self->TransactionObj->Type eq 'Comment') )  or
+           ($self->TransactionObj->CurrentUserHasRight('ShowTicket'))) {
+       return undef;
+    }
+
+    if (my $len = $self->GetHeader('Content-Length')) {
+       return $len;
+    }
+
+    {
+       use bytes;
+       my $len = length($self->Content);
+       $self->SetHeader('Content-Length' => $len);
+       return $len;
+    }
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/Attachments_Overlay.pm b/rt/lib/RT/Attachments_Overlay.pm
new file mode 100644 (file)
index 0000000..ce94c9d
--- /dev/null
@@ -0,0 +1,116 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Attachments - a collection of RT::Attachment objects
+
+=head1 SYNOPSIS
+
+  use RT::Attachments;
+
+=head1 DESCRIPTION
+
+This module should never be called directly by client code. it's an internal module which
+should only be accessed through exported APIs in Ticket, Queue and other similar objects.
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Attachments);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub _Init  
+sub _Init   {
+  my $self = shift;
+  $self->{'table'} = "Attachments";
+  $self->{'primary_key'} = "id";
+  return ( $self->SUPER::_Init(@_));
+}
+# }}}
+
+
+# {{{ sub ContentType
+
+=head2 ContentType (VALUE => 'text/plain', ENTRYAGGREGATOR => 'OR', OPERATOR => '=' ) 
+
+Limit result set to attachments of ContentType 'TYPE'...
+
+=cut
+
+
+sub ContentType  {
+  my $self = shift;
+  my %args = ( VALUE => 'text/plain',
+              OPERATOR => '=',
+              ENTRYAGGREGATOR => 'OR',
+              @_);
+
+  $self->Limit ( FIELD => 'ContentType',
+                VALUE => $args{'VALUE'},
+                OPERATOR => $args{'OPERATOR'},
+                ENTRYAGGREGATOR => $args{'ENTRYAGGREGATOR'});
+}
+# }}}
+
+# {{{ sub ChildrenOf 
+
+=head2 ChildrenOf ID
+
+Limit result set to children of Attachment ID
+
+=cut
+
+
+sub ChildrenOf  {
+  my $self = shift;
+  my $attachment = shift;
+  $self->Limit ( FIELD => 'Parent',
+                VALUE => $attachment);
+}
+# }}}
+
+# {{{ sub NewItem 
+sub NewItem  {
+  my $self = shift;
+
+  use RT::Attachment;
+  my $item = new RT::Attachment($self->CurrentUser);
+  return($item);
+}
+# }}}
+  1;
+
+
+
+
diff --git a/rt/lib/RT/Base.pm b/rt/lib/RT/Base.pm
new file mode 100644 (file)
index 0000000..3b2dcfd
--- /dev/null
@@ -0,0 +1,97 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Base;
+use Carp;
+
+use strict;
+use vars qw(@EXPORT);
+
+@EXPORT=qw(loc CurrentUser);
+
+=head1 FUNCTIONS
+
+
+
+# {{{ sub CurrentUser 
+
+=head2 CurrentUser
+
+If called with an argument, sets the current user to that user object.
+This will affect ACL decisions, etc.  
+Returns the current user
+
+=cut
+
+sub CurrentUser {
+    my $self = shift;
+
+    if (@_) {
+        $self->{'user'} = shift;
+    }
+
+    unless ( $self->{'user'} ) {
+        $RT::Logger->err(
+                  "$self was created without a CurrentUser\n" . Carp::cluck() );
+        return (0);
+        die;
+    }
+    return ( $self->{'user'} );
+}
+
+# }}}
+
+
+
+=item loc LOC_STRING
+
+l is a method which takes a loc string
+to this object's CurrentUser->LanguageHandle for localization. 
+
+you call it like this:
+
+    $self->loc("I have [quant,_1,concrete mixer].", 6);
+
+In english, this would return:
+    I have 6 concrete mixers.
+
+
+=cut
+
+sub loc {
+    my $self = shift;
+    unless ($self->CurrentUser) {
+        use Carp;
+        Carp::confess("No currentuser");
+        return ("Critical error:$self has no CurrentUser", $self);
+    }
+    return($self->CurrentUser->loc(@_));
+}
+
+eval "require RT::Base_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Base_Vendor.pm});
+eval "require RT::Base_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Base_Local.pm});
+
+
+1;
diff --git a/rt/lib/RT/CachedGroupMember.pm b/rt/lib/RT/CachedGroupMember.pm
new file mode 100644 (file)
index 0000000..fc3e1bf
--- /dev/null
@@ -0,0 +1,258 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+RT::CachedGroupMember
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=cut
+
+package RT::CachedGroupMember;
+use RT::Record; 
+
+
+use vars qw( @ISA );
+@ISA= qw( RT::Record );
+
+sub _Init {
+  my $self = shift; 
+
+  $self->Table('CachedGroupMembers');
+  $self->SUPER::_Init(@_);
+}
+
+
+
+
+
+=item Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  int(11) 'GroupId'.
+  int(11) 'MemberId'.
+  int(11) 'Via'.
+  int(11) 'ImmediateParentId'.
+  smallint(6) 'Disabled'.
+
+=cut
+
+
+
+
+sub Create {
+    my $self = shift;
+    my %args = ( 
+                GroupId => '',
+                MemberId => '',
+                Via => '',
+                ImmediateParentId => '',
+                Disabled => '0',
+
+                 @_);
+    $self->SUPER::Create(
+                         GroupId => $args{'GroupId'},
+                         MemberId => $args{'MemberId'},
+                         Via => $args{'Via'},
+                         ImmediateParentId => $args{'ImmediateParentId'},
+                         Disabled => $args{'Disabled'},
+);
+
+}
+
+
+
+=item id
+
+Returns the current value of id. 
+(In the database, id is stored as int(11).)
+
+
+=cut
+
+
+=item GroupId
+
+Returns the current value of GroupId. 
+(In the database, GroupId is stored as int(11).)
+
+
+
+=item SetGroupId VALUE
+
+
+Set GroupId to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, GroupId will be stored as a int(11).)
+
+
+=cut
+
+
+=item MemberId
+
+Returns the current value of MemberId. 
+(In the database, MemberId is stored as int(11).)
+
+
+
+=item SetMemberId VALUE
+
+
+Set MemberId to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, MemberId will be stored as a int(11).)
+
+
+=cut
+
+
+=item Via
+
+Returns the current value of Via. 
+(In the database, Via is stored as int(11).)
+
+
+
+=item SetVia VALUE
+
+
+Set Via to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Via will be stored as a int(11).)
+
+
+=cut
+
+
+=item ImmediateParentId
+
+Returns the current value of ImmediateParentId. 
+(In the database, ImmediateParentId is stored as int(11).)
+
+
+
+=item SetImmediateParentId VALUE
+
+
+Set ImmediateParentId to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, ImmediateParentId will be stored as a int(11).)
+
+
+=cut
+
+
+=item Disabled
+
+Returns the current value of Disabled. 
+(In the database, Disabled is stored as smallint(6).)
+
+
+
+=item SetDisabled VALUE
+
+
+Set Disabled to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Disabled will be stored as a smallint(6).)
+
+
+=cut
+
+
+
+sub _ClassAccessible {
+    {
+     
+        id =>
+               {read => 1, type => 'int(11)', default => ''},
+        GroupId => 
+               {read => 1, write => 1, type => 'int(11)', default => ''},
+        MemberId => 
+               {read => 1, write => 1, type => 'int(11)', default => ''},
+        Via => 
+               {read => 1, write => 1, type => 'int(11)', default => ''},
+        ImmediateParentId => 
+               {read => 1, write => 1, type => 'int(11)', default => ''},
+        Disabled => 
+               {read => 1, write => 1, type => 'smallint(6)', default => '0'},
+
+ }
+};
+
+
+        eval "require RT::CachedGroupMember_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/CachedGroupMember_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CachedGroupMember_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/CachedGroupMember_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CachedGroupMember_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/CachedGroupMember_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::CachedGroupMember_Overlay, RT::CachedGroupMember_Vendor, RT::CachedGroupMember_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/CachedGroupMember_Overlay.pm b/rt/lib/RT/CachedGroupMember_Overlay.pm
new file mode 100644 (file)
index 0000000..f2dc86f
--- /dev/null
@@ -0,0 +1,323 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+no warnings qw(redefine);
+
+# {{{ Create
+
+=item Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  'Group' is the "top level" group we're building the cache for. This is an 
+  RT::Principal object
+
+  'Member' is the RT::Principal  of the user or group we're adding
+  to the cache.
+
+  'ImmediateParent' is the RT::Principal of the group that this principal
+  belongs to to get here
+
+  int(11) 'Via' is an internal reference to CachedGroupMembers->Id of
+  the "parent" record of this cached group member. It should be empty if this
+  member is a "direct" member of this group. (In that case, it will be set to this 
+  cached group member's id after creation)
+
+  This routine should _only_ be called by GroupMember->Create
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = ( Group           => '',
+                 Member          => '',
+                 ImmediateParent => '',
+                 Via             => '0',
+                 Disabled        => '0',
+                 @_ );
+
+    unless (    $args{'Member'}
+             && UNIVERSAL::isa( $args{'Member'}, 'RT::Principal' )
+             && $args{'Member'}->Id ) {
+        $RT::Logger->debug("$self->Create: bogus Member argument");
+    }
+
+    unless (    $args{'Group'}
+             && UNIVERSAL::isa( $args{'Group'}, 'RT::Principal' )
+             && $args{'Group'}->Id ) {
+        $RT::Logger->debug("$self->Create: bogus Group argument");
+    }
+
+    unless (    $args{'ImmediateParent'}
+             && UNIVERSAL::isa( $args{'ImmediateParent'}, 'RT::Principal' )
+             && $args{'ImmediateParent'}->Id ) {
+        $RT::Logger->debug("$self->Create: bogus ImmediateParent argument");
+    }
+
+    # If the parent group for this group member is disabled, it's disabled too, along with all its children
+    if ( $args{'ImmediateParent'}->Disabled ) {
+        $args{'Disabled'} = $args{'ImmediateParent'}->Disabled;
+    }
+
+    my $id = $self->SUPER::Create(
+                              GroupId           => $args{'Group'}->Id,
+                              MemberId          => $args{'Member'}->Id,
+                              ImmediateParentId => $args{'ImmediateParent'}->Id,
+                              Disabled          => $args{'Disabled'},
+                              Via               => $args{'Via'}, );
+
+    unless ($id) {
+        $RT::Logger->warn( "Couldn't create "
+                           . $args{'Member'}
+                           . " as a cached member of "
+                           . $args{'Group'}->Id . " via "
+                           . $args{'Via'} );
+        return (undef);  #this will percolate up and bail out of the transaction
+    }
+    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 "
+                               . $args{'Member'}
+                               . " as a cached member of "
+                               . $args{'Group'}->Id . " via "
+                               . $args{'Via'} );
+            return (undef)
+              ;          #this will percolate up and bail out of the transaction
+        }
+    }
+
+    if ( $args{'Member'}->IsGroup() ) {
+        my $GroupMembers = $args{'Member'}->Object->MembersObj();
+        while ( my $member = $GroupMembers->Next() ) {
+            my $cached_member =
+              RT::CachedGroupMember->new( $self->CurrentUser );
+            my $c_id = $cached_member->Create(
+                                             Group  => $args{'Group'},
+                                             Member => $member->MemberObj,
+                                             ImmediateParent => $args{'Member'},
+                                             Disabled => $args{'Disabled'},
+                                             Via      => $id );
+            unless ($c_id) {
+                return (undef);    #percolate the error upwards.
+                     # the caller will log an error and abort the transaction
+            }
+
+        }
+    }
+
+    return ($id);
+
+}
+
+# }}}
+
+# {{{ Delete
+
+=head2 Delete
+
+Deletes the current CachedGroupMember from the group it's in and cascades 
+the delete to all submembers. This routine could be completely excised if
+mysql supported foreign keys with cascading deletes.
+
+=cut 
+
+sub Delete {
+    my $self = shift;
+
+    
+    my $member = $self->MemberObj();
+    if ( $member->IsGroup ) {
+        my $deletable = RT::CachedGroupMembers->new( $self->CurrentUser );
+
+        $deletable->Limit( FIELD    => 'id',
+                           OPERATOR => '!=',
+                           VALUE    => $self->id );
+        $deletable->Limit( FIELD    => 'Via',
+                           OPERATOR => '=',
+                           VALUE    => $self->id );
+
+        while ( my $kid = $deletable->Next ) {
+            my $kid_err = $kid->Delete();
+            unless ($kid_err) {
+                $RT::Logger->error(
+                              "Couldn't delete CachedGroupMember " . $kid->Id );
+                return (undef);
+            }
+        }
+    }
+    my $err = $self->SUPER::Delete();
+    unless ($err) {
+        $RT::Logger->error( "Couldn't delete CachedGroupMember " . $self->Id );
+        return (undef);
+    }
+
+    # Unless $self->GroupObj still has the member recursively $self->MemberObj
+    # (Since we deleted the database row above, $self no longer counts)
+    unless ( $self->GroupObj->Object->HasMemberRecursively( $self->MemberObj ) ) {
+
+
+        #   Find all ACEs granted to $self->GroupId
+        my $acl = RT::ACL->new($RT::SystemUser);
+        $acl->LimitToPrincipal( Id => $self->GroupId );
+
+
+        while ( my $this_ace = $acl->Next() ) {
+            #       Find all ACEs which $self-MemberObj has delegated from $this_ace
+            my $delegations = RT::ACL->new($RT::SystemUser);
+            $delegations->DelegatedFrom( Id => $this_ace->Id );
+            $delegations->DelegatedBy( Id => $self->MemberId );
+
+            # For each delegation 
+            while ( my $delegation = $delegations->Next ) {
+                # WHACK IT
+                my $del_ret = $delegation->_Delete(InsideTransaction => 1);
+                unless ($del_ret) {
+                    $RT::Logger->crit("Couldn't delete an ACL delegation that we know exists ". $delegation->Id);
+                    return(undef);
+                }
+            }
+        }
+    }
+    return ($err);
+}
+
+# }}}
+
+# {{{ SetDisabled
+
+=head2 SetDisabled
+
+SetDisableds the current CachedGroupMember from the group it's in and cascades 
+the SetDisabled to all submembers. This routine could be completely excised if
+mysql supported foreign keys with cascading SetDisableds.
+
+=cut 
+
+sub SetDisabled {
+    my $self = shift;
+    my $val = shift;
+    
+    my $err = $self->SUPER::SetDisabled($val);
+    unless ($err) {
+        $RT::Logger->error( "Couldn't SetDisabled CachedGroupMember " . $self->Id );
+        return (undef);
+    }
+    
+    my $member = $self->MemberObj();
+    if ( $member->IsGroup ) {
+        my $deletable = RT::CachedGroupMembers->new( $self->CurrentUser );
+
+        $deletable->Limit( FIELD    => 'Via', OPERATOR => '=', VALUE    => $self->id );
+        $deletable->Limit( FIELD    => 'id', OPERATOR => '!=', VALUE    => $self->id );
+
+        while ( my $kid = $deletable->Next ) {
+            my $kid_err = $kid->SetDisabled($val );
+            unless ($kid_err) {
+                $RT::Logger->error( "Couldn't SetDisabled CachedGroupMember " . $kid->Id );
+                return (undef);
+            }
+        }
+    }
+
+    # Unless $self->GroupObj still has the member recursively $self->MemberObj
+    # (Since we SetDisabledd the database row above, $self no longer counts)
+    unless ( $self->GroupObj->Object->HasMemberRecursively( $self->MemberObj ) ) {
+        #   Find all ACEs granted to $self->GroupId
+        my $acl = RT::ACL->new($RT::SystemUser);
+        $acl->LimitToPrincipal( Id => $self->GroupId );
+
+        while ( my $this_ace = $acl->Next() ) {
+            #       Find all ACEs which $self-MemberObj has delegated from $this_ace
+            my $delegations = RT::ACL->new($RT::SystemUser);
+            $delegations->DelegatedFrom( Id => $this_ace->Id );
+            $delegations->DelegatedBy( Id => $self->MemberId );
+
+            # For each delegation,  blow away the delegation
+            while ( my $delegation = $delegations->Next ) {
+                # WHACK IT
+                my $del_ret = $delegation->_Delete(InsideTransaction => 1);
+                unless ($del_ret) {
+                    $RT::Logger->crit("Couldn't delete an ACL delegation that we know exists ". $delegation->Id);
+                    return(undef);
+                }
+            }
+        }
+    }
+    return ($err);
+}
+
+# }}}
+
+# {{{ GroupObj
+
+=head2 GroupObj  
+
+Returns the RT::Principal object for this group Group
+
+=cut
+
+sub GroupObj {
+    my $self      = shift;
+    my $principal = RT::Principal->new( $self->CurrentUser );
+    $principal->Load( $self->GroupId );
+    return ($principal);
+}
+
+# }}}
+
+# {{{ ImmediateParentObj
+
+=head2 ImmediateParentObj  
+
+Returns the RT::Principal object for this group ImmediateParent
+
+=cut
+
+sub ImmediateParentObj {
+    my $self      = shift;
+    my $principal = RT::Principal->new( $self->CurrentUser );
+    $principal->Load( $self->ImmediateParentId );
+    return ($principal);
+}
+
+# }}}
+
+# {{{ MemberObj
+
+=head2 MemberObj  
+
+Returns the RT::Principal object for this group member
+
+=cut
+
+sub MemberObj {
+    my $self      = shift;
+    my $principal = RT::Principal->new( $self->CurrentUser );
+    $principal->Load( $self->MemberId );
+    return ($principal);
+}
+
+# }}}
+1;
diff --git a/rt/lib/RT/CachedGroupMembers.pm b/rt/lib/RT/CachedGroupMembers.pm
new file mode 100644 (file)
index 0000000..b520f7b
--- /dev/null
@@ -0,0 +1,115 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+  RT::CachedGroupMembers -- Class Description
+=head1 SYNOPSIS
+
+  use RT::CachedGroupMembers
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=cut
+
+package RT::CachedGroupMembers;
+
+use RT::SearchBuilder;
+use RT::CachedGroupMember;
+
+use vars qw( @ISA );
+@ISA= qw(RT::SearchBuilder);
+
+
+sub _Init {
+    my $self = shift;
+    $self->{'table'} = 'CachedGroupMembers';
+    $self->{'primary_key'} = 'id';
+
+
+    return ( $self->SUPER::_Init(@_) );
+}
+
+
+=item NewItem
+
+Returns an empty new RT::CachedGroupMember item
+
+=cut
+
+sub NewItem {
+    my $self = shift;
+    return(RT::CachedGroupMember->new($self->CurrentUser));
+}
+
+        eval "require RT::CachedGroupMembers_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/CachedGroupMembers_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CachedGroupMembers_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/CachedGroupMembers_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CachedGroupMembers_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/CachedGroupMembers_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::CachedGroupMembers_Overlay, RT::CachedGroupMembers_Vendor, RT::CachedGroupMembers_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/CachedGroupMembers_Overlay.pm b/rt/lib/RT/CachedGroupMembers_Overlay.pm
new file mode 100644 (file)
index 0000000..fd0fd90
--- /dev/null
@@ -0,0 +1,148 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::CachedGroupMembers - a collection of RT::GroupMember objects
+
+=head1 SYNOPSIS
+
+  use RT::CachedGroupMembers;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::CachedGroupMembers);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ LimitToUsers
+
+=head2 LimitToUsers
+
+Limits this search object to users who are members of this group
+This is really useful when you want to haave your UI seperate out
+groups from users for display purposes
+
+=cut
+
+sub LimitToUsers {
+    my $self = shift;
+
+    my $principals = $self->NewAlias('Principals');
+    $self->Join( ALIAS1 => 'main', FIELD1 => 'MemberId',
+                 ALIAS2 => $principals, FIELD2 =>'id');
+
+    $self->Limit(       ALIAS => $principals,
+                         FIELD => 'PrincipalType',
+                         VALUE => 'User',
+                         ENTRYAGGREGATOR => 'OR',
+                         );
+}
+
+# }}}
+
+
+# {{{ LimitToGroups
+
+=head2 LimitToGroups
+
+Limits this search object to Groups who are members of this group
+This is really useful when you want to haave your UI seperate out
+groups from users for display purposes
+
+=cut
+
+sub LimitToGroups {
+    my $self = shift;
+
+    my $principals = $self->NewAlias('Principals');
+    $self->Join( ALIAS1 => 'main', FIELD1 => 'MemberId',
+                 ALIAS2 => $principals, FIELD2 =>'id');
+
+    $self->Limit(       ALIAS => $principals,
+                         FIELD => 'PrincipalType',
+                         VALUE => 'Group',
+                         ENTRYAGGREGATOR => 'OR',
+                         );
+}
+
+# }}}
+
+# {{{ sub LimitToMembersOfGroup
+
+=head2 LimitToMembersOfGroup PRINCIPAL_ID
+
+Takes a Principal Id as its only argument. 
+Limits the current search principals which are _directly_ members
+of the group which has PRINCIPAL_ID as its principal id.
+
+=cut
+
+sub LimitToMembersOfGroup {
+    my $self = shift;
+    my $group = shift;
+
+    return ($self->Limit( 
+                         VALUE => $group,
+                         FIELD => 'GroupId',
+                         ENTRYAGGREGATOR => 'OR',
+                         ));
+
+}
+# }}}
+
+# {{{ sub LimitToGroupsWithMember
+
+=head2 LimitToGroupsWithMember PRINCIPAL_ID
+
+Takes a Principal Id as its only argument. 
+Limits the current search to groups which contain PRINCIPAL_ID as a member  or submember.
+This function gets used by GroupMember->Create to populate subgroups
+
+=cut
+
+sub LimitToGroupsWithMember {
+    my $self = shift;
+    my $member = shift;
+
+    return ($self->Limit( 
+                         VALUE => $member,
+                         FIELD => 'MemberId',
+                         ENTRYAGGREGATOR => 'OR',
+                                   QUOTEVALUE => 0
+                         ));
+
+}
+# }}}
+1;
diff --git a/rt/lib/RT/Condition/BeforeDue.pm b/rt/lib/RT/Condition/BeforeDue.pm
new file mode 100644 (file)
index 0000000..7911fd8
--- /dev/null
@@ -0,0 +1,64 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Condition::BeforeDue;
+require RT::Condition::Generic;
+
+use RT::Date;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Condition::Generic);
+
+
+sub IsApplicable {
+    my $self = shift;
+
+    # Parse date string.  Format is "1d2h3m4s" for 1 day and 2 hours
+    # and 3 minutes and 4 seconds.
+    my %e;
+    foreach (qw(d h m s)) {
+       my @vals = $self->Argument =~ m/(\d+)$_/;
+       $e{$_} = pop @vals || 0;
+    }
+    my $elapse = $e{'d'} * 24*60*60 + $e{'h'} * 60*60 + $e{'m'} * 60 + $e{'s'};
+
+    my $cur = new RT::Date( $RT::SystemUser );
+    $cur->SetToNow();
+    my $due = $self->TicketObj->DueObj;
+    return (undef) if $due->Unix <= 0;
+
+    my $diff = $due->Diff($cur);
+    if ( $diff >= 0 and $diff <= $elapse ) {
+        return(1);
+    } else {
+        return(undef);
+    }
+}
+
+eval "require RT::Condition::BeforeDue_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/BeforeDue_Vendor.pm});
+eval "require RT::Condition::BeforeDue_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/BeforeDue_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Condition/Overdue.pm b/rt/lib/RT/Condition/Overdue.pm
new file mode 100644 (file)
index 0000000..3a4efe7
--- /dev/null
@@ -0,0 +1,68 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+
+=head1 NAME
+
+RT::Condition::Overdue
+
+=head1 DESCRIPTION
+
+Returns true if the ticket we're operating on is overdue
+
+=cut
+
+package RT::Condition::Overdue;
+require RT::Condition::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Condition::Generic);
+
+
+=head2 IsApplicable
+
+If the due date is before "now" return true
+
+=cut
+
+sub IsApplicable {
+    my $self = shift;
+    if ($self->TicketObj->DueObj->Unix > 0 and
+       $self->TicketObj->DueObj->Unix < time())  {
+       return(1);
+    } 
+    else {
+       return(undef);
+    }
+}
+
+eval "require RT::Condition::Overdue_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/Overdue_Vendor.pm});
+eval "require RT::Condition::Overdue_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/Overdue_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/Condition/OwnerChange.pm b/rt/lib/RT/Condition/OwnerChange.pm
new file mode 100644 (file)
index 0000000..e17f589
--- /dev/null
@@ -0,0 +1,102 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Condition::OwnerChange;
+require RT::Condition::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Condition::Generic);
+
+
+=head2 IsApplicable
+
+If we're changing the owner return true, otherwise return false
+
+=begin testing
+
+my $q = RT::Queue->new($RT::SystemUser);
+$q->Create(Name =>'ownerChangeTest');
+
+ok($q->Id, "Created a scriptest queue");
+
+my $s1 = RT::Scrip->new($RT::SystemUser);
+my ($val, $msg) =$s1->Create( Queue => $q->Id,
+             ScripAction => 'User Defined',
+             ScripCondition => 'On Owner Change',
+             CustomIsApplicableCode => '',
+             CustomPrepareCode => 'return 1',
+             CustomCommitCode => '
+                   $RT::Logger->crit("Before, prio is ".$self->TicketObj->Priority);
+                    $self->TicketObj->SetPriority($self->TicketObj->Priority+1);
+                   $RT::Logger->crit("After, prio is ".$self->TicketObj->Priority);
+                return(1);
+            ',
+             Template => 'Blank'
+    );
+ok($val,$msg);
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+my ($tv,$ttv,$tm) = $ticket->Create(Queue => $q->Id,
+                                    Subject => "hair on fire",
+                                    InitialPriority => '20'
+                                    );
+ok($tv, $tm);
+ok($ticket->SetOwner('root'));
+is ($ticket->Priority , '21', "Ticket priority is set right");
+ok($ticket->Steal);
+is ($ticket->Priority , '22', "Ticket priority is set right");
+ok($ticket->Untake);
+is ($ticket->Priority , '23', "Ticket priority is set right");
+ok($ticket->Take);
+is ($ticket->Priority , '24', "Ticket priority is set right");
+
+
+
+
+
+=end testing
+
+
+=cut
+
+sub IsApplicable {
+    my $self = shift;
+    if ($self->TransactionObj->Field eq 'Owner') {
+       return(1);
+    } 
+    else {
+       return(undef);
+    }
+}
+
+eval "require RT::Condition::OwnerChange_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/OwnerChange_Vendor.pm});
+eval "require RT::Condition::OwnerChange_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/OwnerChange_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/Condition/PriorityExceeds.pm b/rt/lib/RT/Condition/PriorityExceeds.pm
new file mode 100644 (file)
index 0000000..7737ca5
--- /dev/null
@@ -0,0 +1,57 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Condition::PriorityExceeds;
+require RT::Condition::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Condition::Generic);
+
+
+=head2 IsApplicable
+
+If the priority exceeds the argument value
+
+=cut
+
+sub IsApplicable {
+    my $self = shift;
+    if ($self->TicketObj->Priority > $self->Argument)  {
+       return(1);
+    } 
+    else {
+       return(undef);
+    }
+}
+
+eval "require RT::Condition::PriorityExceeds_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/PriorityExceeds_Vendor.pm});
+eval "require RT::Condition::PriorityExceeds_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/PriorityExceeds_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/Condition/QueueChange.pm b/rt/lib/RT/Condition/QueueChange.pm
new file mode 100644 (file)
index 0000000..f3e646a
--- /dev/null
@@ -0,0 +1,57 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Condition::QueueChange;
+require RT::Condition::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Condition::Generic);
+
+
+=head2 IsApplicable
+
+If the queue has changed.
+
+=cut
+
+sub IsApplicable {
+    my $self = shift;
+    if ($self->TransactionObj->Field eq 'Queue') {
+           return(1);
+    } 
+    else {
+           return(undef);
+    }
+}
+
+eval "require RT::Condition::QueueChange_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/QueueChange_Vendor.pm});
+eval "require RT::Condition::QueueChange_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/QueueChange_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/Condition/UserDefined.pm b/rt/lib/RT/Condition/UserDefined.pm
new file mode 100644 (file)
index 0000000..eb829f0
--- /dev/null
@@ -0,0 +1,57 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Condition::UserDefined;
+
+use RT::Condition::Generic;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Condition::Generic);
+
+
+=head2 IsApplicable
+
+This happens on every transaction. it's always applicable
+
+=cut
+
+sub IsApplicable {
+    my $self = shift;
+    my $retval = eval $self->ScripObj->CustomIsApplicableCode;
+    if ($@) {
+        $RT::Logger->error("Scrip ".$self->ScripObj->Id. " IsApplicable failed: ".$@);
+        return (undef);
+    }
+    return ($retval);
+}
+
+eval "require RT::Condition::UserDefined_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/UserDefined_Vendor.pm});
+eval "require RT::Condition::UserDefined_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Condition/UserDefined_Local.pm});
+
+1;
+
diff --git a/rt/lib/RT/CustomField.pm b/rt/lib/RT/CustomField.pm
new file mode 100644 (file)
index 0000000..cd40a3a
--- /dev/null
@@ -0,0 +1,340 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+RT::CustomField
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=cut
+
+package RT::CustomField;
+use RT::Record; 
+use RT::Queue;
+
+
+use vars qw( @ISA );
+@ISA= qw( RT::Record );
+
+sub _Init {
+  my $self = shift; 
+
+  $self->Table('CustomFields');
+  $self->SUPER::_Init(@_);
+}
+
+
+
+
+
+=item Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  varchar(200) 'Name'.
+  varchar(200) 'Type'.
+  int(11) 'Queue'.
+  varchar(255) 'Description'.
+  int(11) 'SortOrder'.
+  smallint(6) 'Disabled'.
+
+=cut
+
+
+
+
+sub Create {
+    my $self = shift;
+    my %args = ( 
+                Name => '',
+                Type => '',
+                Queue => '0',
+                Description => '',
+                SortOrder => '0',
+                Disabled => '0',
+
+                 @_);
+    $self->SUPER::Create(
+                         Name => $args{'Name'},
+                         Type => $args{'Type'},
+                         Queue => $args{'Queue'},
+                         Description => $args{'Description'},
+                         SortOrder => $args{'SortOrder'},
+                         Disabled => $args{'Disabled'},
+);
+
+}
+
+
+
+=item id
+
+Returns the current value of id. 
+(In the database, id is stored as int(11).)
+
+
+=cut
+
+
+=item Name
+
+Returns the current value of Name. 
+(In the database, Name is stored as varchar(200).)
+
+
+
+=item SetName VALUE
+
+
+Set Name to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Name will be stored as a varchar(200).)
+
+
+=cut
+
+
+=item Type
+
+Returns the current value of Type. 
+(In the database, Type is stored as varchar(200).)
+
+
+
+=item SetType VALUE
+
+
+Set Type to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Type will be stored as a varchar(200).)
+
+
+=cut
+
+
+=item Queue
+
+Returns the current value of Queue. 
+(In the database, Queue is stored as int(11).)
+
+
+
+=item SetQueue VALUE
+
+
+Set Queue to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Queue will be stored as a int(11).)
+
+
+=cut
+
+
+=item QueueObj
+
+Returns the Queue Object which has the id returned by Queue
+
+
+=cut
+
+sub QueueObj {
+       my $self = shift;
+       my $Queue =  RT::Queue->new($self->CurrentUser);
+       $Queue->Load($self->__Value('Queue'));
+       return($Queue);
+}
+
+=item Description
+
+Returns the current value of Description. 
+(In the database, Description is stored as varchar(255).)
+
+
+
+=item SetDescription VALUE
+
+
+Set Description to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Description will be stored as a varchar(255).)
+
+
+=cut
+
+
+=item SortOrder
+
+Returns the current value of SortOrder. 
+(In the database, SortOrder is stored as int(11).)
+
+
+
+=item SetSortOrder VALUE
+
+
+Set SortOrder to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, SortOrder will be stored as a int(11).)
+
+
+=cut
+
+
+=item Creator
+
+Returns the current value of Creator. 
+(In the database, Creator is stored as int(11).)
+
+
+=cut
+
+
+=item Created
+
+Returns the current value of Created. 
+(In the database, Created is stored as datetime.)
+
+
+=cut
+
+
+=item LastUpdatedBy
+
+Returns the current value of LastUpdatedBy. 
+(In the database, LastUpdatedBy is stored as int(11).)
+
+
+=cut
+
+
+=item LastUpdated
+
+Returns the current value of LastUpdated. 
+(In the database, LastUpdated is stored as datetime.)
+
+
+=cut
+
+
+=item Disabled
+
+Returns the current value of Disabled. 
+(In the database, Disabled is stored as smallint(6).)
+
+
+
+=item SetDisabled VALUE
+
+
+Set Disabled to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Disabled will be stored as a smallint(6).)
+
+
+=cut
+
+
+
+sub _ClassAccessible {
+    {
+     
+        id =>
+               {read => 1, type => 'int(11)', default => ''},
+        Name => 
+               {read => 1, write => 1, type => 'varchar(200)', default => ''},
+        Type => 
+               {read => 1, write => 1, type => 'varchar(200)', default => ''},
+        Queue => 
+               {read => 1, write => 1, type => 'int(11)', default => '0'},
+        Description => 
+               {read => 1, write => 1, type => 'varchar(255)', default => ''},
+        SortOrder => 
+               {read => 1, write => 1, type => 'int(11)', default => '0'},
+        Creator => 
+               {read => 1, auto => 1, type => 'int(11)', default => '0'},
+        Created => 
+               {read => 1, auto => 1, type => 'datetime', default => ''},
+        LastUpdatedBy => 
+               {read => 1, auto => 1, type => 'int(11)', default => '0'},
+        LastUpdated => 
+               {read => 1, auto => 1, type => 'datetime', default => ''},
+        Disabled => 
+               {read => 1, write => 1, type => 'smallint(6)', default => '0'},
+
+ }
+};
+
+
+        eval "require RT::CustomField_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomField_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomField_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomField_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomField_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomField_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::CustomField_Overlay, RT::CustomField_Vendor, RT::CustomField_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/CustomFieldValue.pm b/rt/lib/RT/CustomFieldValue.pm
new file mode 100644 (file)
index 0000000..f434b44
--- /dev/null
@@ -0,0 +1,294 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+RT::CustomFieldValue
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=cut
+
+package RT::CustomFieldValue;
+use RT::Record; 
+use RT::CustomField;
+
+
+use vars qw( @ISA );
+@ISA= qw( RT::Record );
+
+sub _Init {
+  my $self = shift; 
+
+  $self->Table('CustomFieldValues');
+  $self->SUPER::_Init(@_);
+}
+
+
+
+
+
+=item Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  int(11) 'CustomField'.
+  varchar(200) 'Name'.
+  varchar(255) 'Description'.
+  int(11) 'SortOrder'.
+
+=cut
+
+
+
+
+sub Create {
+    my $self = shift;
+    my %args = ( 
+                CustomField => '0',
+                Name => '',
+                Description => '',
+                SortOrder => '0',
+
+                 @_);
+    $self->SUPER::Create(
+                         CustomField => $args{'CustomField'},
+                         Name => $args{'Name'},
+                         Description => $args{'Description'},
+                         SortOrder => $args{'SortOrder'},
+);
+
+}
+
+
+
+=item id
+
+Returns the current value of id. 
+(In the database, id is stored as int(11).)
+
+
+=cut
+
+
+=item CustomField
+
+Returns the current value of CustomField. 
+(In the database, CustomField is stored as int(11).)
+
+
+
+=item SetCustomField VALUE
+
+
+Set CustomField to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, CustomField will be stored as a int(11).)
+
+
+=cut
+
+
+=item CustomFieldObj
+
+Returns the CustomField Object which has the id returned by CustomField
+
+
+=cut
+
+sub CustomFieldObj {
+       my $self = shift;
+       my $CustomField =  RT::CustomField->new($self->CurrentUser);
+       $CustomField->Load($self->__Value('CustomField'));
+       return($CustomField);
+}
+
+=item Name
+
+Returns the current value of Name. 
+(In the database, Name is stored as varchar(200).)
+
+
+
+=item SetName VALUE
+
+
+Set Name to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Name will be stored as a varchar(200).)
+
+
+=cut
+
+
+=item Description
+
+Returns the current value of Description. 
+(In the database, Description is stored as varchar(255).)
+
+
+
+=item SetDescription VALUE
+
+
+Set Description to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Description will be stored as a varchar(255).)
+
+
+=cut
+
+
+=item SortOrder
+
+Returns the current value of SortOrder. 
+(In the database, SortOrder is stored as int(11).)
+
+
+
+=item SetSortOrder VALUE
+
+
+Set SortOrder to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, SortOrder will be stored as a int(11).)
+
+
+=cut
+
+
+=item Creator
+
+Returns the current value of Creator. 
+(In the database, Creator is stored as int(11).)
+
+
+=cut
+
+
+=item Created
+
+Returns the current value of Created. 
+(In the database, Created is stored as datetime.)
+
+
+=cut
+
+
+=item LastUpdatedBy
+
+Returns the current value of LastUpdatedBy. 
+(In the database, LastUpdatedBy is stored as int(11).)
+
+
+=cut
+
+
+=item LastUpdated
+
+Returns the current value of LastUpdated. 
+(In the database, LastUpdated is stored as datetime.)
+
+
+=cut
+
+
+
+sub _ClassAccessible {
+    {
+     
+        id =>
+               {read => 1, type => 'int(11)', default => ''},
+        CustomField => 
+               {read => 1, write => 1, type => 'int(11)', default => '0'},
+        Name => 
+               {read => 1, write => 1, type => 'varchar(200)', default => ''},
+        Description => 
+               {read => 1, write => 1, type => 'varchar(255)', default => ''},
+        SortOrder => 
+               {read => 1, write => 1, type => 'int(11)', default => '0'},
+        Creator => 
+               {read => 1, auto => 1, type => 'int(11)', default => '0'},
+        Created => 
+               {read => 1, auto => 1, type => 'datetime', default => ''},
+        LastUpdatedBy => 
+               {read => 1, auto => 1, type => 'int(11)', default => '0'},
+        LastUpdated => 
+               {read => 1, auto => 1, type => 'datetime', default => ''},
+
+ }
+};
+
+
+        eval "require RT::CustomFieldValue_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFieldValue_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomFieldValue_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFieldValue_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomFieldValue_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFieldValue_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::CustomFieldValue_Overlay, RT::CustomFieldValue_Vendor, RT::CustomFieldValue_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/CustomFieldValues.pm b/rt/lib/RT/CustomFieldValues.pm
new file mode 100644 (file)
index 0000000..0e792b1
--- /dev/null
@@ -0,0 +1,121 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+  RT::CustomFieldValues -- Class Description
+=head1 SYNOPSIS
+
+  use RT::CustomFieldValues
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=cut
+
+package RT::CustomFieldValues;
+
+use RT::SearchBuilder;
+use RT::CustomFieldValue;
+
+use vars qw( @ISA );
+@ISA= qw(RT::SearchBuilder);
+
+
+sub _Init {
+    my $self = shift;
+    $self->{'table'} = 'CustomFieldValues';
+    $self->{'primary_key'} = 'id';
+
+
+
+  # By default, order by name
+  $self->OrderBy( ALIAS => 'main',
+                  FIELD => 'SortOrder',
+                  ORDER => 'ASC');
+
+    return ( $self->SUPER::_Init(@_) );
+}
+
+
+=item NewItem
+
+Returns an empty new RT::CustomFieldValue item
+
+=cut
+
+sub NewItem {
+    my $self = shift;
+    return(RT::CustomFieldValue->new($self->CurrentUser));
+}
+
+        eval "require RT::CustomFieldValues_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFieldValues_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomFieldValues_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFieldValues_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomFieldValues_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFieldValues_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::CustomFieldValues_Overlay, RT::CustomFieldValues_Vendor, RT::CustomFieldValues_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/CustomFieldValues_Overlay.pm b/rt/lib/RT/CustomFieldValues_Overlay.pm
new file mode 100644 (file)
index 0000000..0384db9
--- /dev/null
@@ -0,0 +1,47 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+no warnings qw(redefine);
+
+# {{{ sub LimitToCustomField
+
+=head2 LimitToCustomField FIELD
+
+Limits the returned set to values for the custom field with Id FIELD
+
+=cut
+  
+sub LimitToCustomField {
+    my $self = shift;
+    my $cf = shift;
+    return ($self->Limit( FIELD => 'CustomField',
+                         VALUE => $cf,
+                         OPERATOR => '='));
+
+}
+
+# }}}
+
+1;
+
diff --git a/rt/lib/RT/CustomField_Overlay.pm b/rt/lib/RT/CustomField_Overlay.pm
new file mode 100644 (file)
index 0000000..89ef889
--- /dev/null
@@ -0,0 +1,560 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+no warnings qw(redefine);
+
+use vars qw(@TYPES %TYPES);
+
+use RT::CustomFieldValues;
+use RT::TicketCustomFieldValues;
+
+# Enumerate all valid types for this custom field
+@TYPES = (
+    'SelectSingle',    # loc
+    'SelectMultiple',  # loc
+    'FreeformSingle',  # loc
+    'FreeformMultiple', # loc
+);
+
+# Populate a hash of types of easier validation
+for (@TYPES) { $TYPES{$_} = 1};
+
+
+
+
+=head1 NAME
+
+  RT::CustomField_Overlay 
+
+=head1 DESCRIPTION
+
+=head1 'CORE' METHODS
+
+=cut
+
+
+
+=head2 Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  varchar(200) 'Name'.
+  varchar(200) 'Type'.
+  int(11) 'Queue'.
+  varchar(255) 'Description'.
+  int(11) 'SortOrder'.
+  smallint(6) 'Disabled'.
+
+=cut
+
+
+
+
+sub Create {
+    my $self = shift;
+    my %args = ( 
+                Name => '',
+                Type => '',
+                Queue => '0',
+                Description => '',
+                SortOrder => '0',
+                Disabled => '0',
+
+                 @_);
+
+    
+
+    if (  ! $args{'Queue'} ) {
+        unless ( $self->CurrentUser->HasRight( Object => $RT::System, Right => 'AdminCustomFields') ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+    }
+    else {
+        my $queue = RT::Queue->new($self->CurrentUser);
+        $queue->Load($args{'Queue'});
+        unless ($queue->Id) {
+            return (0, $self->loc("Queue not found"));
+        }
+        unless ( $queue->CurrentUserHasRight('AdminCustomFields') ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+    }
+    $self->SUPER::Create(
+                         Name => $args{'Name'},
+                         Type => $args{'Type'},
+                         Queue => $args{'Queue'},
+                         Description => $args{'Description'},
+                         SortOrder => $args{'SortOrder'},
+                         Disabled => $args{'Disabled'},
+);
+
+}
+
+
+# {{{ sub LoadByNameAndQueue
+
+=head2  LoadByNameAndQueue (Queue => QUEUEID, Name => NAME)
+
+Loads the Custom field named NAME for Queue QUEUE. If QUEUE is 0,
+loads a global custom field
+
+=cut
+
+# Compatibility for API change after 3.0 beta 1
+*LoadNameAndQueue = \&LoadByNameAndQueue;
+
+sub LoadByNameAndQueue {
+    my $self = shift;
+    my %args = (
+        Queue => undef,
+        Name  => undef,
+        @_,
+    );
+
+    return ( $self->LoadByCols( Name => $args{'Name'}, Queue => $args{'Queue'} ) );
+
+}
+
+# }}}
+
+# {{{ Dealing with custom field values 
+
+=begin testing
+use_ok(RT::CustomField);
+ok(my $cf = RT::CustomField->new($RT::SystemUser));
+ok(my ($id, $msg)=  $cf->Create( Name => 'TestingCF',
+                                 Queue => '0',
+                                 SortOrder => '1',
+                                 Description => 'A Testing custom field',
+                                 Type=> 'SelectSingle'), 'Created a global CustomField');
+ok($id != 0, 'Global custom field correctly created');
+ok ($cf->SingleValue);
+ok($cf->Type eq 'SelectSingle');
+
+ok($cf->SetType('SelectMultiple'));
+ok($cf->Type eq 'SelectMultiple');
+ok(!$cf->SingleValue );
+ok(my ($bogus_val, $bogus_msg) = $cf->SetType('BogusType') , "Trying to set a custom field's type to a bogus type");
+ok($bogus_val == 0, "Unable to set a custom field's type to a bogus type");
+
+ok(my $bad_cf = RT::CustomField->new($RT::SystemUser));
+ok(my ($bad_id, $bad_msg)=  $cf->Create( Name => 'TestingCF-bad',
+                                 Queue => '0',
+                                 SortOrder => '1',
+                                 Description => 'A Testing custom field with a bogus Type',
+                                 Type=> 'SelectSingleton'), 'Created a global CustomField with a bogus type');
+ok($bad_id == 0, 'Global custom field correctly decided to not create a cf with a bogus type ');
+
+=end testing
+
+=cut
+
+# {{{ AddValue
+
+=head2 AddValue HASH
+
+Create a new value for this CustomField.  Takes a paramhash containing the elements Name, Description and SortOrder
+
+=begin testing
+
+ok(my $cf = RT::CustomField->new($RT::SystemUser));
+$cf->Load(1);
+ok($cf->Id == 1);
+ok(my ($val,$msg)  = $cf->AddValue(Name => 'foo' , Description => 'TestCFValue', SortOrder => '6'));
+ok($val != 0);
+ok (my ($delval, $delmsg) = $cf->DeleteValue($val));
+ok ($delval != 0);
+
+=end testing
+
+=cut
+
+sub AddValue {
+       my $self = shift;
+       my %args = ( Name => undef,
+                    Description => undef,
+                    SortOrder => undef,
+                    @_ );
+
+    unless ($self->CurrentUserHasRight('AdminCustomFields')) {
+        return (0, $self->loc('Permission Denied'));
+    }
+
+    unless ($args{'Name'}) {
+        return(0, $self->loc("Can't add a custom field value without a name"));
+    }
+       my $newval = RT::CustomFieldValue->new($self->CurrentUser);
+       return($newval->Create(
+                    CustomField => $self->Id,
+             Name =>$args{'Name'},
+             Description => ($args{'Description'} || ''),
+             SortOrder => ($args{'SortOrder'} || '0')
+        ));    
+}
+
+
+# }}}
+
+# {{{ DeleteValue
+
+=head2 DeleteValue ID
+
+Deletes a value from this custom field by id. 
+
+Does not remove this value for any article which has had it selected   
+
+=cut
+
+sub DeleteValue {
+       my $self = shift;
+    my $id = shift;
+    unless ($self->CurrentUserHasRight('AdminCustomFields')) {
+        return (0, $self->loc('Permission Denied'));
+    }
+
+       my $val_to_del = RT::CustomFieldValue->new($self->CurrentUser);
+       $val_to_del->Load($id);
+       unless ($val_to_del->Id) {
+               return (0, $self->loc("Couldn't find that value"));
+       }
+       unless ($val_to_del->CustomField == $self->Id) {
+               return (0, $self->loc("That is not a value for this custom field"));
+       }
+
+       my $retval = $val_to_del->Delete();
+    if ($retval) {
+        return ($retval, $self->loc("Custom field value deleted"));
+    } else {
+        return(0, $self->loc("Custom field value could not be deleted"));
+    }
+}
+
+# }}}
+
+# {{{ Values
+
+=head2 Values FIELD
+
+Return a CustomFieldeValues object of all acceptable values for this Custom Field.
+
+
+=cut
+
+sub Values {
+    my $self = shift;
+
+    my $cf_values = RT::CustomFieldValues->new($self->CurrentUser);
+    if ( $self->__Value('Queue') == 0 || $self->CurrentUserHasRight( 'SeeQueue') ) {
+        $cf_values->LimitToCustomField($self->Id);
+    }
+    return ($cf_values);
+}
+
+# }}}
+
+# }}}
+
+# {{{ Ticket related routines
+
+# {{{ ValuesForTicket
+
+=head2 ValuesForTicket TICKET
+
+Returns a RT::TicketCustomFieldValues object of this Field's values for TICKET.
+TICKET is a ticket id.
+
+
+=cut
+
+sub ValuesForTicket {
+       my $self = shift;
+    my $ticket_id = shift;
+
+       my $values = new RT::TicketCustomFieldValues($self->CurrentUser);
+       $values->LimitToCustomField($self->Id);
+    $values->LimitToTicket($ticket_id);
+
+       return ($values);
+}
+
+# }}}
+
+# {{{ AddValueForTicket
+
+=head2 AddValueForTicket HASH
+
+Adds a custom field value for a ticket. Takes a param hash of Ticket and Content
+
+=cut
+
+sub AddValueForTicket {
+       my $self = shift;
+       my %args = ( Ticket => undef,
+                 Content => undef,
+                    @_ );
+
+       my $newval = RT::TicketCustomFieldValue->new($self->CurrentUser);
+       my $val = $newval->Create(Ticket => $args{'Ticket'},
+                            Content => $args{'Content'},
+                            CustomField => $self->Id);
+
+    return($val);
+
+}
+
+
+# }}}
+
+# {{{ DeleteValueForTicket
+
+=head2 DeleteValueForTicket HASH
+
+Adds a custom field value for a ticket. Takes a param hash of Ticket and Content
+
+=cut
+
+sub DeleteValueForTicket {
+       my $self = shift;
+       my %args = ( Ticket => undef,
+                 Content => undef,
+                    @_ );
+
+       my $oldval = RT::TicketCustomFieldValue->new($self->CurrentUser);
+    $oldval->LoadByTicketContentAndCustomField (Ticket => $args{'Ticket'}, 
+                                                Content =>  $args{'Content'}, 
+                                                CustomField => $self->Id );
+    # check ot make sure we found it
+    unless ($oldval->Id) {
+        return(0, $self->loc("Custom field value [_1] could not be found for custom field [_2]", $args{'Content'}, $self->Name));
+    }
+    # delete it
+
+    my $ret = $oldval->Delete();
+    unless ($ret) {
+        return(0, $self->loc("Custom field value could not be found"));
+    }
+    return(1, $self->loc("Custom field value deleted"));
+}
+
+
+# }}}
+# }}}
+
+
+=head2 ValidateQueue Queue
+
+Make sure that the queue specified is a valid queue name
+
+=cut
+
+sub ValidateQueue {
+    my $self = shift;
+    my $id = shift;
+
+    if ($id eq '0') { # 0 means "Global" null would _not_ be ok.
+        return (1); 
+    }
+
+    my $q = RT::Queue->new($RT::SystemUser);
+    $q->Load($id);
+    unless ($q->id) {
+        return undef;
+    }
+    return (1);
+
+
+}
+
+
+# {{{ Types
+
+=head2 Types 
+
+Retuns an array of the types of CustomField that are supported
+
+=cut
+
+sub Types {
+       return (@TYPES);
+}
+
+# }}}
+
+
+=head2 FriendlyType [TYPE]
+
+Returns a localized human-readable version of the custom field type.
+If a custom field type is specified as the parameter, the friendly type for that type will be returned
+
+=cut
+
+sub FriendlyType {
+    my $self = shift;
+
+    my $type = shift || $self->Type;
+
+    if ( $type eq 'SelectSingle' ) {
+        return ( $self->loc('Select one value') );
+    }
+    elsif ( $type eq 'SelectMultiple' ) {
+        return ( $self->loc('Select multiple values') );
+    }
+    elsif ( $type eq 'FreeformSingle' ) {
+        return ( $self->loc('Enter one value') );
+    }
+    elsif ( $type eq 'FreeformMultiple' ) {
+        return ( $self->loc('Enter multiple values') );
+    }
+    else {
+        return ( $self->loc( $self->Type ) );
+    }
+}
+
+
+=head2 ValidateType TYPE
+
+Takes a single string. returns true if that string is a value
+type of custom field
+
+=begin testing
+
+ok(my $cf = RT::CustomField->new($RT::SystemUser));
+ok($cf->ValidateType('SelectSingle'));
+ok($cf->ValidateType('SelectMultiple'));
+ok(!$cf->ValidateType('SelectFooMultiple'));
+
+=end testing
+
+=cut
+
+sub ValidateType {
+    my $self = shift;
+    my $type = shift;
+
+    if( $TYPES{$type}) {
+        return(1);
+    }
+    else {
+        return undef;
+    }
+}
+
+# {{{ SingleValue
+
+=head2 SingleValue
+
+Returns true if this CustomField only accepts a single value. 
+Returns false if it accepts multiple values
+
+=cut
+
+sub SingleValue {
+    my $self = shift;
+    if ($self->Type =~  /Single$/) {
+        return 1;
+    } 
+    else {
+        return undef;
+    }
+}
+
+# }}}
+
+# {{{ sub CurrentUserHasRight
+
+=head2 CurrentUserHasRight RIGHT
+
+Helper function to call the custom field's queue's CurrentUserHasRight with the passed in args.
+
+=cut
+
+sub CurrentUserHasRight {
+    my $self = shift;
+    my $right = shift;
+    # if there's no queue, we want to know about a global right
+    if ( ( !defined $self->__Value('Queue') ) || ( $self->__Value('Queue') == 0 ) ) {
+         return $self->CurrentUser->HasRight( Object => $RT::System, Right => $right); 
+    } else {
+        return ( $self->QueueObj->CurrentUserHasRight($right) );
+    }
+}
+
+# }}}
+
+# {{{ sub _Set
+
+sub _Set {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('AdminCustomFields') ) {
+        return ( 0, $self->loc('Permission Denied') );
+    }
+    return ( $self->SUPER::_Set(@_) );
+
+}
+
+# }}}
+
+# {{{ sub _Value 
+
+=head2 _Value
+
+Takes the name of a table column.
+Returns its value as a string, if the user passes an ACL check
+
+=cut
+
+sub _Value {
+
+    my $self  = shift;
+    my $field = shift;
+
+    # We need to expose the queue so that we can do things like ACL checks
+    if ( $field eq 'Queue') {
+          return ( $self->SUPER::_Value($field) );
+     }
+
+
+    #Anybody can see global custom fields, otherwise we need to do the rights check
+        unless ( $self->__Value('Queue') == 0 || $self->CurrentUserHasRight( 'SeeQueue') ) {
+            return (undef);
+        }
+    return ( $self->__Value($field) );
+
+}
+
+# }}}
+# {{{ sub SetDisabled
+
+=head2 SetDisabled
+
+Takes a boolean.
+1 will cause this custom field to no longer be avaialble for tickets.
+0 will re-enable this queue
+
+=cut
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/CustomFields.pm b/rt/lib/RT/CustomFields.pm
new file mode 100644 (file)
index 0000000..3e47765
--- /dev/null
@@ -0,0 +1,121 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+  RT::CustomFields -- Class Description
+=head1 SYNOPSIS
+
+  use RT::CustomFields
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=cut
+
+package RT::CustomFields;
+
+use RT::SearchBuilder;
+use RT::CustomField;
+
+use vars qw( @ISA );
+@ISA= qw(RT::SearchBuilder);
+
+
+sub _Init {
+    my $self = shift;
+    $self->{'table'} = 'CustomFields';
+    $self->{'primary_key'} = 'id';
+
+
+
+  # By default, order by name
+  $self->OrderBy( ALIAS => 'main',
+                  FIELD => 'SortOrder',
+                  ORDER => 'ASC');
+
+    return ( $self->SUPER::_Init(@_) );
+}
+
+
+=item NewItem
+
+Returns an empty new RT::CustomField item
+
+=cut
+
+sub NewItem {
+    my $self = shift;
+    return(RT::CustomField->new($self->CurrentUser));
+}
+
+        eval "require RT::CustomFields_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFields_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomFields_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFields_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::CustomFields_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/CustomFields_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::CustomFields_Overlay, RT::CustomFields_Vendor, RT::CustomFields_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/CustomFields_Overlay.pm b/rt/lib/RT/CustomFields_Overlay.pm
new file mode 100644 (file)
index 0000000..97c7cb8
--- /dev/null
@@ -0,0 +1,135 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::CustomFields - a collection of RT CustomField objects
+
+=head1 SYNOPSIS
+
+  use RT::CustomFields;
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::CustomFields);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+# {{{ sub LimitToGlobalOrQueue 
+
+=item LimitToGlobalOrQueue QUEUEID
+
+Limits the set of custom fields found to global custom fields or those tied to the queue with ID QUEUEID 
+
+=cut
+
+sub LimitToGlobalOrQueue {
+    my $self = shift;
+    my $queue = shift;
+    $self->LimitToQueue($queue);
+    $self->LimitToGlobal();
+}
+
+# }}}
+
+# {{{ sub LimitToQueue 
+
+=head2 LimitToQueue QUEUEID
+
+Takes a queue id (numerical) as its only argument. Makes sure that 
+Scopes it pulls out apply to this queue (or another that you've selected with
+another call to this method
+
+=cut
+
+sub LimitToQueue  {
+   my $self = shift;
+  my $queue = shift;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Queue',
+               VALUE => "$queue")
+      if defined $queue;
+  
+}
+# }}}
+
+# {{{ sub LimitToGlobal
+
+=head2 LimitToGlobal
+
+Makes sure that 
+Scopes it pulls out apply to all queues (or another that you've selected with
+another call to this method or LimitToQueue
+
+=cut
+
+
+sub LimitToGlobal  {
+   my $self = shift;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Queue',
+               VALUE => 0);
+  
+}
+# }}}
+
+
+# {{{ sub _DoSearch 
+
+=head2 _DoSearch
+
+  A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that _Disabled ro
+ws never get seen unless
+we're explicitly trying to see them.
+
+=cut
+
+sub _DoSearch {
+    my $self = shift;
+    
+    #unless we really want to find disabled rows, make sure we\'re only finding enabled ones.
+    unless($self->{'find_disabled_rows'}) {
+        $self->LimitToEnabled();
+    }
+    
+    return($self->SUPER::_DoSearch(@_));
+    
+}
+
+# }}}
+  
+1;
+
diff --git a/rt/lib/RT/EmailParser.pm b/rt/lib/RT/EmailParser.pm
new file mode 100644 (file)
index 0000000..49f3d55
--- /dev/null
@@ -0,0 +1,784 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::EmailParser;
+
+
+use base qw/RT::Base/;
+
+use strict;
+use Mail::Address;
+use MIME::Entity;
+use MIME::Head;
+use MIME::Parser;
+use File::Temp qw/tempdir/;
+
+=head1 NAME
+
+  RT::Interface::CLI - helper functions for creating a commandline RT interface
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+
+=begin testing
+
+ok(require RT::EmailParser);
+
+=end testing
+
+
+=head1 METHODS
+
+=head2 new
+
+
+=cut
+
+sub new  {
+  my $proto = shift;
+  my $class = ref($proto) || $proto;
+  my $self  = {};
+  bless ($self, $class);
+  return $self;
+}
+
+
+
+# {{{ sub debug
+
+sub debug {
+    my $val = shift;
+    my ($debug);
+    if ($val) {
+        $RT::Logger->debug( $val . "\n" );
+        if ($debug) {
+            print STDERR "$val\n";
+        }
+    }
+    if ($debug) {
+        return (1);
+    }
+}
+
+# }}}
+
+# {{{ sub CheckForLoops 
+
+sub CheckForLoops {
+    my $self = shift;
+
+    my $head = $self->Head;
+
+    #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/ ) {
+        return (1);
+    }
+
+    # TODO: We might not trap the case where RT instance A sends a mail
+    # to RT instance B which sends a mail to ...
+    return (undef);
+}
+
+# }}}
+
+# {{{ sub CheckForSuspiciousSender
+
+sub CheckForSuspiciousSender {
+    my $self = shift;
+
+    #if it's from a postmaster or mailer daemon, it's likely a bounce.
+
+    #TODO: better algorithms needed here - there is no standards for
+    #bounces, so it's very difficult to separate them from anything
+    #else.  At the other hand, the Return-To address is only ment to be
+    #used as an error channel, we might want to put up a separate
+    #Return-To address which is treated differently.
+
+    #TODO: search through the whole email and find the right Ticket ID.
+
+    my ( $From, $junk ) = $self->ParseSenderAddressFromHead();
+
+    if ( ( $From =~ /^mailer-daemon/i ) or ( $From =~ /^postmaster/i ) ) {
+        return (1);
+
+    }
+
+    return (undef);
+
+}
+
+# }}}
+
+# {{{ sub CheckForAutoGenerated
+sub CheckForAutoGenerated {
+    my $self = shift;
+    my $head = $self->Head;
+
+    my $Precedence = $head->get("Precedence") || "";
+    if ( $Precedence =~ /^(bulk|junk)/i ) {
+        return (1);
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ sub ParseMIMEEntityFromSTDIN
+
+sub ParseMIMEEntityFromSTDIN {
+    my $self = shift;
+    return $self->ParseMIMEEntityFromFileHandle(\*STDIN);
+}
+
+# }}}
+
+
+sub ParseMIMEEntityFromScalar {
+    my $self = shift;
+    my $message = shift;
+
+    # Create a new parser object:
+
+    my $parser = MIME::Parser->new();
+    $self->_SetupMIMEParser($parser);
+
+
+    # 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
+
+=head2 ParseMIMEEntityFromFilehandle *FH
+
+Parses a mime entity from a filehandle passed in as an argument
+
+=cut
+
+sub ParseMIMEEntityFromFileHandle {
+    my $self = shift;
+    my $filehandle = shift;
+
+    # Create a new parser object:
+
+    my $parser = MIME::Parser->new();
+    $self->_SetupMIMEParser($parser);
+
+
+    # TODO: XXX 3.0 we really need to wrap this in an eval { }
+
+    unless ( $self->{'entity'} = $parser->parse($filehandle) ) {
+
+        # Try again, this time without extracting nested messages
+        $parser->extract_nested_messages(0);
+        unless ( $self->{'entity'} = $parser->parse($filehandle) ) {
+            $RT::Logger->crit("couldn't parse MIME stream");
+            return ( undef);
+        }
+    }
+    $self->_PostProcessNewEntity();
+    return (1);
+}
+
+# }}}
+
+# {{{ _PostProcessNewEntity 
+
+=head2 _PostProcessNewEntity
+
+cleans up and postprocesses a newly parsed MIME Entity
+
+=cut
+
+sub _PostProcessNewEntity {
+    my $self = shift;
+
+    #Now we've got a parsed mime object. 
+
+    # try to convert text parts into utf-8 charset
+    RT::I18N::SetMIMEEntityToEncoding($self->{'entity'}, 'utf-8');
+
+
+    # Unfold headers that are have embedded newlines
+    $self->Head->unfold;
+
+
+}
+
+# }}}
+
+# {{{ sub ParseTicketId 
+
+sub ParseTicketId {
+    my $self = shift;
+
+    my $Subject = shift;
+
+    if ( $Subject =~ s/\[$RT::rtname \#(\d+)\s*\]//i ) {
+        my $id = $1;
+        $RT::Logger->debug("Found a ticket ID. It's $id");
+        return ($id);
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ sub MailError 
+
+=head2 MailError { }
+
+
+# TODO this doesn't belong here.
+# TODO doc this
+
+
+=cut
+
+
+sub MailError {
+    my $self = shift;
+
+    my %args = (
+        To          => $RT::OwnerEmail,
+        Bcc         => undef,
+        From        => $RT::CorrespondAddress,
+        Subject     => 'There has been an error',
+        Explanation => 'Unexplained error',
+        MIMEObj     => undef,
+        LogLevel    => 'crit',
+        @_
+    );
+
+    $RT::Logger->log(
+        level   => $args{'LogLevel'},
+        message => $args{'Explanation'}
+    );
+    my $entity = MIME::Entity->build(
+        Type                   => "multipart/mixed",
+        From                   => $args{'From'},
+        Bcc                    => $args{'Bcc'},
+        To                     => $args{'To'},
+        Subject                => $args{'Subject'},
+        'X-RT-Loop-Prevention' => $RT::rtname,
+    );
+
+    $entity->attach( Data => $args{'Explanation'} . "\n" );
+
+    my $mimeobj = $args{'MIMEObj'};
+    $mimeobj->sync_headers();
+    $entity->add_part($mimeobj);
+
+    if ( $RT::MailCommand eq 'sendmailpipe' ) {
+        open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ) || return (0);
+        print MAIL $entity->as_string;
+        close(MAIL);
+    }
+    else {
+        $entity->send( $RT::MailCommand, $RT::MailParams );
+    }
+}
+
+# }}}
+
+
+
+# {{{ sub GetCurrentUser 
+
+sub GetCurrentUser {
+    my $self     = shift;
+    my $ErrorsTo = shift;
+
+    my %UserInfo = ();
+
+    #Suck the address of the sender out of the header
+    my ( $Address, $Name ) = $self->ParseSenderAddressFromHead();
+
+    my $tempuser = RT::User->new($RT::SystemUser);
+
+    #This will apply local address canonicalization rules
+    $Address = $tempuser->CanonicalizeEmailAddress($Address);
+
+    #If desired, synchronize with an external database
+    my $UserFoundInExternalDatabase = 0;
+
+    # Username is the 'Name' attribute of the user that RT uses for things
+    # like authentication
+    my $Username = undef;
+    ( $UserFoundInExternalDatabase, %UserInfo ) =
+      $self->LookupExternalUserInfo( $Address, $Name );
+
+    $Address  = $UserInfo{'EmailAddress'};
+    $Username = $UserInfo{'Name'};
+
+    #Get us a currentuser object to work with. 
+    my $CurrentUser = RT::CurrentUser->new();
+
+    # First try looking up by a username, if we got one from the external
+    # db lookup. Next, try looking up by email address. Failing that,
+    # try looking up by users who have this user's email address as their
+    # username.
+
+    if ($Username) {
+        $CurrentUser->LoadByName($Username);
+    }
+
+    unless ( $CurrentUser->Id ) {
+        $CurrentUser->LoadByEmail($Address);
+    }
+
+    #If we can't get it by email address, try by name.  
+    unless ( $CurrentUser->Id ) {
+        $CurrentUser->LoadByName($Address);
+    }
+
+    unless ( $CurrentUser->Id ) {
+
+        #If we couldn't load a user, determine whether to create a user
+
+        # {{{ If we require an incoming address to be found in the external
+        # user database, reject the incoming message appropriately
+        if ( $RT::SenderMustExistInExternalDatabase
+             && !$UserFoundInExternalDatabase ) {
+
+            my $Message =
+              "Sender's email address was not found in the user database.";
+
+            # {{{  This code useful only if you've defined an AutoRejectRequest template
+
+            require RT::Template;
+            my $template = new RT::Template($RT::Nobody);
+            $template->Load('AutoRejectRequest');
+            $Message = $template->Content || $Message;
+
+            # }}}
+
+            MailError(
+                 To      => $ErrorsTo,
+                 Subject => "Ticket Creation failed: user could not be created",
+                 Explanation => $Message,
+                 MIMEObj     => $self->Entity,
+                 LogLevel    => 'notice' );
+
+            return ($CurrentUser);
+
+        }
+
+        # }}}
+
+        else {
+            my $NewUser = RT::User->new($RT::SystemUser);
+
+            my ( $Val, $Message ) = $NewUser->Create(
+                                  Name => ( $Username || $Address ),
+                                  EmailAddress => $Address,
+                                  RealName     => "$Name",
+                                  Password     => undef,
+                                  Privileged   => 0,
+                                  Comments => 'Autocreated on ticket submission'
+            );
+
+            unless ($Val) {
+
+                # Deal with the race condition of two account creations at once
+                #
+                if ($Username) {
+                    $NewUser->LoadByName($Username);
+                }
+
+                unless ( $NewUser->Id ) {
+                    $NewUser->LoadByEmail($Address);
+                }
+
+                unless ( $NewUser->Id ) {
+                    MailError(To          => $ErrorsTo,
+                              Subject     => "User could not be created",
+                              Explanation =>
+                                "User creation failed in mailgateway: $Message",
+                              MIMEObj  => $self->Entity,
+                              LogLevel => 'crit' );
+                }
+            }
+        }
+
+        #Load the new user object
+        $CurrentUser->LoadByEmail($Address);
+
+        unless ( $CurrentUser->id ) {
+            $RT::Logger->warning(
+                               "Couldn't load user '$Address'." . "giving up" );
+            MailError(
+                   To          => $ErrorsTo,
+                   Subject     => "User could not be loaded",
+                   Explanation =>
+                     "User  '$Address' could not be loaded in the mail gateway",
+                   MIMEObj  => $self->Entity,
+                   LogLevel => 'crit' );
+
+        }
+    }
+
+    return ($CurrentUser);
+
+}
+
+# }}}
+
+
+# {{{ ParseCcAddressesFromHead 
+
+=head2 ParseCcAddressesFromHead HASHREF
+
+Takes a hashref object containing QueueObj, Head and CurrentUser objects.
+Returns a list of all email addresses in the To and Cc 
+headers b<except> the current Queue\'s email addresses, the CurrentUser\'s 
+email address  and anything that the $RTAddressRegexp matches.
+
+=cut
+
+sub ParseCcAddressesFromHead {
+
+    my $self = shift;
+
+    my %args = (
+        QueueObj    => undef,
+        CurrentUser => undef,
+        @_
+    );
+
+    my (@Addresses);
+
+    my @ToObjs = Mail::Address->parse( $self->Head->get('To') );
+    my @CcObjs = Mail::Address->parse( $self->Head->get('Cc') );
+
+    foreach my $AddrObj ( @ToObjs, @CcObjs ) {
+        my $Address = $AddrObj->address;
+        my $user = RT::User->new($RT::SystemUser);
+        $Address = $user->CanonicalizeEmailAddress($Address);
+        next if ( $args{'CurrentUser'}->EmailAddress   =~ /^$Address$/i );
+        next if ( $args{'QueueObj'}->CorrespondAddress =~ /^$Address$/i );
+        next if ( $args{'QueueObj'}->CommentAddress    =~ /^$Address$/i );
+        next if ( IsRTAddress($Address) );
+
+        push ( @Addresses, $Address );
+    }
+    return (@Addresses);
+}
+
+# }}}
+
+# {{{ ParseSenderAdddressFromHead
+
+=head2 ParseSenderAddressFromHead
+
+Takes a MIME::Header object. Returns a tuple: (user@host, friendly name) 
+of the From (evaluated in order of Reply-To:, From:, Sender)
+
+=cut
+
+sub ParseSenderAddressFromHead {
+    my $self = shift;
+
+    #Figure out who's sending this message.
+    my $From = $self->Head->get('Reply-To')
+      || $self->Head->get('From')
+      || $self->Head->get('Sender');
+    return ( $self->ParseAddressFromHeader($From) );
+}
+
+# }}}
+
+# {{{ ParseErrorsToAdddressFromHead
+
+=head2 ParseErrorsToAddressFromHead
+
+Takes a MIME::Header object. Return a single value : user@host
+of the From (evaluated in order of Errors-To:,Reply-To:, From:, Sender)
+
+=cut
+
+sub ParseErrorsToAddressFromHead {
+    my $self = shift;
+
+    #Figure out who's sending this message.
+
+    foreach my $header ( 'Errors-To', 'Reply-To', 'From', 'Sender' ) {
+
+        # If there's a header of that name
+        my $headerobj = $self->Head->get($header);
+        if ($headerobj) {
+            my ( $addr, $name ) = $self->ParseAddressFromHeader($headerobj);
+
+            # If it's got actual useful content...
+            return ($addr) if ($addr);
+        }
+    }
+}
+
+# }}}
+
+# {{{ ParseAddressFromHeader
+
+=head2 ParseAddressFromHeader ADDRESS
+
+Takes an address from $self->Head->get('Line') and returns a tuple: user@host, friendly name
+
+=cut
+
+sub ParseAddressFromHeader {
+    my $self = shift;
+    my $Addr = shift;
+
+    my @Addresses = Mail::Address->parse($Addr);
+
+    my $AddrObj = $Addresses[0];
+
+    unless ( ref($AddrObj) ) {
+        return ( undef, undef );
+    }
+
+    my $Name = ( $AddrObj->phrase || $AddrObj->comment || $AddrObj->address );
+
+    #Lets take the from and load a user object.
+    my $Address = $AddrObj->address;
+
+    return ( $Address, $Name );
+}
+
+# }}}
+
+# {{{ IsRTAddress
+
+=item IsRTaddress ADDRESS
+
+Takes a single parameter, an email address. 
+Returns true if that address matches the $RTAddressRegexp.  
+Returns false, otherwise.
+
+=begin testing
+
+is(RT::EmailParser::IsRTAddress("","rt\@example.com"),1, "Regexp matched rt address" );
+is(RT::EmailParser::IsRTAddress("","frt\@example.com"),undef, "Regexp didn't match non-rt address" );
+
+=end testing
+
+=cut
+
+sub IsRTAddress {
+    my $self = shift;
+    my $address = shift;
+
+    # Example: the following rule would tell RT not to Cc 
+    #   "tickets@noc.example.com"
+    if ( defined($RT::RTAddressRegexp) &&
+                       $address =~ /$RT::RTAddressRegexp/ ) {
+        return(1);
+    } else {
+        return (undef);
+    }
+}
+
+# }}}
+
+
+# {{{ CullRTAddresses
+
+=item CullRTAddresses ARRAY
+
+Takes a single argument, an array of email addresses.
+Returns the same array with any IsRTAddress()es weeded out.
+
+=begin testing
+
+@before = ("rt\@example.com", "frt\@example.com");
+@after = ("frt\@example.com");
+ok(eq_array(RT::EmailParser::CullRTAddresses("",@before),@after), "CullRTAddresses only culls RT addresses");
+
+=end testing
+
+=cut
+
+sub CullRTAddresses {
+    my $self = shift;
+    my @addresses= (@_);
+    my @addrlist;
+
+    foreach my $addr( @addresses ) {
+      push (@addrlist, $addr)    unless IsRTAddress("", $addr);
+    }
+    return (@addrlist);
+}
+
+# }}}
+
+
+# {{{ LookupExternalUserInfo
+
+
+# LookupExternalUserInfo is a site-definable method for synchronizing
+# incoming users with an external data source. 
+#
+# This routine takes a tuple of EmailAddress and FriendlyName
+#   EmailAddress is the user's email address, ususally taken from
+#       an email message's From: header.
+#   FriendlyName is a freeform string, ususally taken from the "comment" 
+#       portion of an email message's From: header.
+#
+# If you define an AutoRejectRequest template, RT will use this   
+# template for the rejection message.
+
+
+=item LookupExternalUserInfo
+
+ LookupExternalUserInfo is a site-definable method for synchronizing
+ incoming users with an external data source. 
+
+ This routine takes a tuple of EmailAddress and FriendlyName
+    EmailAddress is the user's email address, ususally taken from
+        an email message's From: header.
+    FriendlyName is a freeform string, ususally taken from the "comment" 
+        portion of an email message's From: header.
+
+ It returns (FoundInExternalDatabase, ParamHash);
+
+   FoundInExternalDatabase must  be set to 1 before return if the user was
+   found in the external database.
+
+   ParamHash is a Perl parameter hash which can contain at least the following
+   fields. These fields are used to populate RT's users database when the user 
+   is created
+
+    EmailAddress is the email address that RT should use for this user.  
+    Name is the 'Name' attribute RT should use for this user. 
+         'Name' is used for things like access control and user lookups.
+    RealName is what RT should display as the user's name when displaying 
+         'friendly' names
+
+=cut
+
+sub LookupExternalUserInfo {
+  my $self = shift;
+  my $EmailAddress = shift;
+  my $RealName = shift;
+
+  my $FoundInExternalDatabase = 1;
+  my %params;
+
+  #Name is the RT username you want to use for this user.
+  $params{'Name'} = $EmailAddress;
+  $params{'EmailAddress'} = $EmailAddress;
+  $params{'RealName'} = $RealName;
+
+  # See RT's contributed code for examples.
+  # http://www.fsck.com/pub/rt/contrib/
+  return ($FoundInExternalDatabase, %params);
+}
+
+# }}}
+
+# {{{ Accessor methods for parsed email messages
+
+=head2 Head
+
+Return the parsed head from this message
+
+=cut
+
+sub Head {
+    my $self = shift;
+    return $self->Entity->head;
+}
+
+=head2 Entity 
+
+Return the parsed Entity from this message
+
+=cut
+
+sub Entity {
+    my $self = shift;
+    return $self->{'entity'};
+}
+
+# }}}
+# {{{ _SetupMIMEParser 
+
+=head2 _SetupMIMEParser $parser
+
+A private instance method which sets up a mime parser to do its job
+
+=cut
+
+
+    ## TODO: Does it make sense storing to disk at all?  After all, we
+    ## need to put each msg as an in-core scalar before saving it to
+    ## the database, don't we?
+
+    ## At the same time, we should make sure that we nuke attachments 
+    ## Over max size and return them
+
+sub _SetupMIMEParser {
+    my $self = shift;
+    my $parser = shift;
+    my $AttachmentDir = File::Temp::tempdir( TMPDIR => 1, CLEANUP => 1 );
+
+    # Set up output directory for files:
+    $parser->output_dir("$AttachmentDir");
+
+    #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);
+}
+# }}}
+
+eval "require RT::EmailParser_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/EmailParser_Vendor.pm});
+eval "require RT::EmailParser_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/EmailParser_Local.pm});
+
+1;
diff --git a/rt/lib/RT/GroupMember_Overlay.pm b/rt/lib/RT/GroupMember_Overlay.pm
new file mode 100644 (file)
index 0000000..20949f0
--- /dev/null
@@ -0,0 +1,351 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::GroupMember - a member of an RT Group
+
+=head1 SYNOPSIS
+
+RT::GroupMember should never be called directly. It should ONLY
+only be accessed through the helper functions in RT::Group;
+
+If you're operating on an RT::GroupMember object yourself, you B<ARE>
+doing something wrong.
+
+=head1 DESCRIPTION
+
+
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::GroupMember);
+
+=end testing
+
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+use RT::CachedGroupMembers;
+
+# {{{ sub Create
+
+=head2 Create { Group => undef, Member => undef }
+
+Add a Principal to the group Group.
+if the Principal is a group, automatically inserts all
+members of the principal into the cached members table recursively down.
+
+Both Group and Member are expected to be RT::Principal objects
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = (
+        Group  => undef,
+        Member => undef,
+        InsideTransaction => undef,
+        @_
+    );
+
+    unless ($args{'Group'} &&
+            UNIVERSAL::isa($args{'Group'}, 'RT::Principal') &&
+            $args{'Group'}->Id ) {
+
+        $RT::Logger->warning("GroupMember::Create called with a bogus Group arg");
+        return (undef);
+    }
+
+    unless($args{'Group'}->IsGroup) {
+        $RT::Logger->warning("Someone tried to add a member to a user instead of a group");
+        return (undef);
+    }
+
+    unless ($args{'Member'} && 
+            UNIVERSAL::isa($args{'Member'}, 'RT::Principal') &&
+            $args{'Member'}->Id) {
+        $RT::Logger->warning("GroupMember::Create called with a bogus Principal arg");
+        return (undef);
+    }
+
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    # TODO what about the groups key cache?
+    RT::Principal->_InvalidateACLCache();
+
+    $RT::Handle->BeginTransaction() unless ($args{'InsideTransaction'});
+
+    # We really need to make sure we don't add any members to this group
+    # that contain the group itself. that would, um, suck. 
+    # (and recurse infinitely)  Later, we can add code to check this in the 
+    # cache and bail so we can support cycling directed graphs
+
+    if ($args{'Member'}->IsGroup) {
+        my $member_object = $args{'Member'}->Object;
+        if ($member_object->HasMemberRecursively($args{'Group'})) {
+            $RT::Logger->debug("Adding that group would create a loop");
+            return(undef);
+        }
+        elsif ( $args{'Member'}->Id == $args{'Group'}->Id) {
+            $RT::Logger->debug("Can't add a group to itself");
+            return(undef);
+        }
+    }
+
+
+    my $id = $self->SUPER::Create(
+        GroupId  => $args{'Group'}->Id,
+        MemberId => $args{'Member'}->Id
+    );
+
+    unless ($id) {
+        $RT::Handle->Rollback() unless ($args{'InsideTransaction'});
+        return (undef);
+    }
+
+    my $cached_member = RT::CachedGroupMember->new( $self->CurrentUser );
+    my $cached_id     = $cached_member->Create(
+        Member          => $args{'Member'},
+        Group           => $args{'Group'},
+        ImmediateParent => $args{'Group'},
+        Via             => '0'
+    );
+
+
+    #When adding a member to a group, we need to go back
+    #and popuplate the CachedGroupMembers of all the groups that group is part of .
+
+    my $cgm = RT::CachedGroupMembers->new( $self->CurrentUser );
+
+    # find things which have the current group as a member. 
+    # $group is an RT::Principal for the group.
+    $cgm->LimitToGroupsWithMember( $args{'Group'}->Id );
+
+    while ( my $parent_member = $cgm->Next ) {
+        my $parent_id = $parent_member->MemberId;
+        my $via       = $parent_member->Id;
+        my $group_id  = $parent_member->GroupId;
+
+          my $other_cached_member =
+          RT::CachedGroupMember->new( $self->CurrentUser );
+        my $other_cached_id = $other_cached_member->Create(
+            Member          => $args{'Member'},
+                      Group => $parent_member->GroupObj,
+            ImmediateParent => $parent_member->MemberObj,
+            Via             => $parent_member->Id
+        );
+        unless ($other_cached_id) {
+            $RT::Logger->err( "Couldn't add " . $args{'Member'}
+                  . " as a submember of a supergroup" );
+            $RT::Handle->Rollback() unless ($args{'InsideTransaction'});
+            return (undef);
+        }
+    } 
+
+    unless ($cached_id) {
+        $RT::Handle->Rollback() unless ($args{'InsideTransaction'});
+        return (undef);
+    }
+
+    $RT::Handle->Commit() unless ($args{'InsideTransaction'});
+
+    return ($id);
+}
+
+# }}}
+
+# {{{ sub _StashUser
+
+=head2 _StashUser PRINCIPAL
+
+Create { Group => undef, Member => undef }
+
+Creates an entry in the groupmembers table, which lists a user
+as a member of himself. This makes ACL checks a whole bunch easier.
+This happens once on user create and never ever gets yanked out.
+
+PRINCIPAL is expected to be an RT::Principal object for a user
+
+This routine expects to be called inside a transaction by RT::User->Create
+
+=cut
+
+sub _StashUser {
+    my $self = shift;
+    my %args = (
+        Group  => undef,
+        Member => undef,
+        @_
+    );
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    # TODO what about the groups key cache?
+    RT::Principal->_InvalidateACLCache();
+
+
+    # We really need to make sure we don't add any members to this group
+    # that contain the group itself. that would, um, suck. 
+    # (and recurse infinitely)  Later, we can add code to check this in the 
+    # cache and bail so we can support cycling directed graphs
+
+    my $id = $self->SUPER::Create(
+        GroupId  => $args{'Group'}->Id,
+        MemberId => $args{'Member'}->Id,
+    );
+
+    unless ($id) {
+        return (undef);
+    }
+
+    my $cached_member = RT::CachedGroupMember->new( $self->CurrentUser );
+    my $cached_id     = $cached_member->Create(
+        Member          => $args{'Member'},
+        Group           => $args{'Group'},
+        ImmediateParent => $args{'Group'},
+        Via             => '0'
+    );
+
+    unless ($cached_id) {
+        return (undef);
+    }
+
+    return ($id);
+}
+
+# }}}
+
+# {{{ sub Delete
+
+=head2 Delete
+
+Takes no arguments. deletes the currently loaded member from the 
+group in question.
+
+Expects to be called _outside_ a transaction
+
+=cut
+
+sub Delete {
+    my $self = shift;
+
+
+    $RT::Handle->BeginTransaction();
+
+    # Find all occurrences of this member as a member of this group
+    # in the cache and nuke them, recursively.
+
+    # The following code will delete all Cached Group members
+    # where this member's group is _not_ the primary group 
+    # (Ie if we're deleting C as a member of B, and B happens to be 
+    # a member of A, will delete C as a member of A without touching
+    # C as a member of B
+
+    my $cached_submembers = RT::CachedGroupMembers->new( $self->CurrentUser );
+
+    $cached_submembers->Limit(
+        FIELD    => 'MemberId',
+        OPERATOR => '=',
+        VALUE    => $self->MemberObj->Id
+    );
+
+    $cached_submembers->Limit(
+        FIELD    => 'ImmediateParentId',
+        OPERATOR => '=',
+        VALUE    => $self->GroupObj->Id
+    );
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    # TODO what about the groups key cache?
+    RT::Principal->_InvalidateACLCache();
+
+
+
+
+    while ( my $item_to_del = $cached_submembers->Next() ) {
+        my $del_err = $item_to_del->Delete();
+        unless ($del_err) {
+            $RT::Handle->Rollback();
+            $RT::Logger->warning("Couldn't delete cached group submember ".$item_to_del->Id);
+            return (undef);
+        }
+    }
+
+    my $err = $self->SUPER::Delete();
+    unless ($err) {
+            $RT::Logger->warning("Couldn't delete cached group submember ".$self->Id);
+        $RT::Handle->Rollback();
+        return (undef);
+    }
+    $RT::Handle->Commit();
+    return ($err);
+
+}
+
+# }}}
+
+# {{{ sub MemberObj
+
+=head2 MemberObj
+
+Returns an RT::Principal object for the Principal specified by $self->PrincipalId
+
+=cut
+
+sub MemberObj {
+    my $self = shift;
+    unless ( defined( $self->{'Member_obj'} ) ) {
+        $self->{'Member_obj'} = RT::Principal->new( $self->CurrentUser );
+        $self->{'Member_obj'}->Load( $self->MemberId );
+    }
+    return ( $self->{'Member_obj'} );
+}
+
+# }}}
+
+# {{{ sub GroupObj
+
+=head2 GroupObj
+
+Returns an RT::Principal object for the Group specified in $self->GroupId
+
+=cut
+
+sub GroupObj {
+    my $self = shift;
+    unless ( defined( $self->{'Group_obj'} ) ) {
+        $self->{'Group_obj'} = RT::Principal->new( $self->CurrentUser );
+        $self->{'Group_obj'}->Load( $self->GroupId );
+    }
+    return ( $self->{'Group_obj'} );
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/GroupMembers_Overlay.pm b/rt/lib/RT/GroupMembers_Overlay.pm
new file mode 100644 (file)
index 0000000..1259fd6
--- /dev/null
@@ -0,0 +1,126 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::GroupMembers - a collection of RT::GroupMember objects
+
+=head1 SYNOPSIS
+
+  use RT::GroupMembers;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::GroupMembers);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ LimitToUsers
+
+=head2 LimitToUsers
+
+Limits this search object to users who are members of this group.
+This is really useful when you want to haave your UI seperate out
+groups from users for display purposes
+
+=cut
+
+sub LimitToUsers {
+    my $self = shift;
+
+    my $principals = $self->NewAlias('Principals');
+    $self->Join( ALIAS1 => 'main', FIELD1 => 'MemberId',
+                 ALIAS2 => $principals, FIELD2 =>'id');
+
+    $self->Limit(       ALIAS => $principals,
+                         FIELD => 'PrincipalType',
+                         VALUE => 'User',
+                         ENTRYAGGREGATOR => 'OR',
+                         );
+}
+
+# }}}
+
+
+# {{{ LimitToGroups
+
+=head2 LimitToGroups
+
+Limits this search object to Groups who are members of this group.
+This is really useful when you want to haave your UI seperate out
+groups from users for display purposes
+
+=cut
+
+sub LimitToGroups {
+    my $self = shift;
+
+    my $principals = $self->NewAlias('Principals');
+    $self->Join( ALIAS1 => 'main', FIELD1 => 'MemberId',
+                 ALIAS2 => $principals, FIELD2 =>'id');
+
+    $self->Limit(       ALIAS => $principals,
+                         FIELD => 'PrincipalType',
+                         VALUE => 'Group',
+                         ENTRYAGGREGATOR => 'OR',
+                         );
+}
+
+# }}}
+
+# {{{ sub LimitToMembersOfGroup
+
+=head2 LimitToMembersOfGroup PRINCIPAL_ID
+
+Takes a Principal Id as its only argument. 
+Limits the current search principals which are _directly_ members
+of the group which has PRINCIPAL_ID as its principal id.
+
+=cut
+
+sub LimitToMembersOfGroup {
+    my $self = shift;
+    my $group = shift;
+
+    return ($self->Limit( 
+                         VALUE => $group,
+                         FIELD => 'GroupId',
+                         ENTRYAGGREGATOR => 'OR',
+                                    QUOTEVALUE => 0
+                         ));
+
+}
+# }}}
+
+1;
diff --git a/rt/lib/RT/Group_Overlay.pm b/rt/lib/RT/Group_Overlay.pm
new file mode 100644 (file)
index 0000000..9215025
--- /dev/null
@@ -0,0 +1,1260 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Released under the terms of version 2 of the GNU Public License
+
+=head1 NAME
+
+  RT::Group - RT\'s group object
+
+=head1 SYNOPSIS
+
+  use RT::Group;
+my $group = new RT::Group($CurrentUser);
+
+=head1 DESCRIPTION
+
+An RT group object.
+
+=head1 AUTHOR
+
+Jesse Vincent, jesse@bestpractical.com
+
+=head1 SEE ALSO
+
+RT
+
+=head1 METHODS
+
+
+=begin testing
+
+# {{{ Tests
+ok (require RT::Group);
+
+ok (my $group = RT::Group->new($RT::SystemUser), "instantiated a group object");
+ok (my ($id, $msg) = $group->CreateUserDefinedGroup( Name => 'TestGroup', Description => 'A test group',
+                    ), 'Created a new group');
+ok ($id != 0, "Group id is $id");
+ok ($group->Name eq 'TestGroup', "The group's name is 'TestGroup'");
+my $ng = RT::Group->new($RT::SystemUser);
+
+ok($ng->LoadUserDefinedGroup('TestGroup'), "Loaded testgroup");
+ok(($ng->id == $group->id), "Loaded the right group");
+
+
+ok (($id,$msg) = $ng->AddMember('1'), "Added a member to the group");
+ok($id, $msg);
+ok (($id,$msg) = $ng->AddMember('2' ), "Added a member to the group");
+ok($id, $msg);
+ok (($id,$msg) = $ng->AddMember('3' ), "Added a member to the group");
+ok($id, $msg);
+
+# Group 1 now has members 1, 2 ,3
+
+my $group_2 = RT::Group->new($RT::SystemUser);
+ok (my ($id_2, $msg_2) = $group_2->CreateUserDefinedGroup( Name => 'TestGroup2', Description => 'A second test group'), , 'Created a new group');
+ok ($id_2 != 0, "Created group 2 ok- $msg_2 ");
+ok (($id,$msg) = $group_2->AddMember($ng->PrincipalId), "Made TestGroup a member of testgroup2");
+ok($id, $msg);
+ok (($id,$msg) = $group_2->AddMember('1' ), "Added  member RT_System to the group TestGroup2");
+ok($id, $msg);
+
+# Group 2 how has 1, g1->{1, 2,3}
+
+my $group_3 = RT::Group->new($RT::SystemUser);
+ok (($id_3, $msg) = $group_3->CreateUserDefinedGroup( Name => 'TestGroup3', Description => 'A second test group'), 'Created a new group');
+ok ($id_3 != 0, "Created group 3 ok - $msg");
+ok (($id,$msg) =$group_3->AddMember($group_2->PrincipalId), "Made TestGroup a member of testgroup2");
+ok($id, $msg);
+
+# g3 now has g2->{1, g1->{1,2,3}}
+
+my $principal_1 = RT::Principal->new($RT::SystemUser);
+$principal_1->Load('1');
+
+my $principal_2 = RT::Principal->new($RT::SystemUser);
+$principal_2->Load('2');
+
+ok (($id,$msg) = $group_3->AddMember('1' ), "Added  member RT_System to the group TestGroup2");
+ok($id, $msg);
+
+# g3 now has 1, g2->{1, g1->{1,2,3}}
+
+ok($group_3->HasMember($principal_2) == undef, "group 3 doesn't have member 2");
+ok($group_3->HasMemberRecursively($principal_2), "group 3 has member 2 recursively");
+ok($ng->HasMember($principal_2) , "group ".$ng->Id." has member 2");
+my ($delid , $delmsg) =$ng->DeleteMember($principal_2->Id);
+ok ($delid !=0, "Sucessfully deleted it-".$delid."-".$delmsg);
+
+#Gotta reload the group objects, since we've been messing with various internals.
+# we shouldn't need to do this.
+#$ng->LoadUserDefinedGroup('TestGroup');
+#$group_2->LoadUserDefinedGroup('TestGroup2');
+#$group_3->LoadUserDefinedGroup('TestGroup');
+
+# G1 now has 1, 3
+# Group 2 how has 1, g1->{1, 3}
+# g3 now has  1, g2->{1, g1->{1, 3}}
+
+ok(!$ng->HasMember($principal_2)  , "group ".$ng->Id." no longer has member 2");
+ok($group_3->HasMemberRecursively($principal_2) == undef, "group 3 doesn't have member 2");
+ok($group_2->HasMemberRecursively($principal_2) == undef, "group 2 doesn't have member 2");
+ok($ng->HasMember($principal_2) == undef, "group 1 doesn't have member 2");;
+ok($group_3->HasMemberRecursively($principal_2) == undef, "group 3 has member 2 recursively");
+
+# }}}
+
+=end testing
+
+
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use RT::Users;
+use RT::GroupMembers;
+use RT::Principals;
+use RT::ACL;
+
+use vars qw/$RIGHTS/;
+
+$RIGHTS = {
+    AdminGroup           => 'Modify group metadata or delete group',  # loc_pair
+    AdminGroupMembership =>
+      'Modify membership roster for this group',                      # loc_pair
+    ModifyOwnMembership => 'Join or leave this group'                 # loc_pair
+};
+
+# Tell RT::ACE that this sort of object can get acls granted
+$RT::ACE::OBJECT_TYPES{'RT::Group'} = 1;
+
+
+#
+
+# TODO: This should be refactored out into an RT::ACLedObject or something
+# stuff the rights into a hash of rights that can exist.
+
+foreach my $right ( keys %{$RIGHTS} ) {
+    $RT::ACE::LOWERCASERIGHTNAMES{ lc $right } = $right;
+}
+
+
+=head2 AvailableRights
+
+Returns a hash of available rights for this object. The keys are the right names and the values are a description of what the rights do
+
+=cut
+
+sub AvailableRights {
+    my $self = shift;
+    return($RIGHTS);
+}
+
+
+# {{{ sub SelfDescription
+
+=head2 SelfDescription
+
+Returns a user-readable description of what this group is for and what it's named.
+
+=cut
+
+sub SelfDescription {
+       my $self = shift;
+       if ($self->Domain eq 'ACLEquivalence') {
+               my $user = RT::Principal->new($self->CurrentUser);
+               $user->Load($self->Instance);
+               return $self->loc("user [_1]",$user->Object->Name);
+       }
+       elsif ($self->Domain eq 'UserDefined') {
+               return $self->loc("group '[_1]'",$self->Name);
+       }
+       elsif ($self->Domain eq 'Personal') {
+               my $user = RT::User->new($self->CurrentUser);
+               $user->Load($self->Instance);
+               return $self->loc("personal group '[_1]' for user '[_2]'",$self->Name, $user->Name);
+       }
+       elsif ($self->Domain eq 'RT::System-Role') {
+               return $self->loc("system [_1]",$self->Type);
+       }
+       elsif ($self->Domain eq 'RT::Queue-Role') {
+               my $queue = RT::Queue->new($self->CurrentUser);
+               $queue->Load($self->Instance);
+               return $self->loc("queue [_1] [_2]",$queue->Name, $self->Type);
+       }
+       elsif ($self->Domain eq 'RT::Ticket-Role') {
+               return $self->loc("ticket #[_1] [_2]",$self->Instance, $self->Type);
+       }
+       elsif ($self->Domain eq 'SystemInternal') {
+               return $self->loc("system group '[_1]'",$self->Type);
+       }
+       else {
+               return $self->loc("undescribed group [_1]",$self->Id);
+       }
+}
+
+# }}}
+
+# {{{ sub Load 
+
+=head2 Load ID
+
+Load a group object from the database. Takes a single argument.
+If the argument is numerical, load by the column 'id'. Otherwise, 
+complain and return.
+
+=cut
+
+sub Load {
+    my $self       = shift;
+    my $identifier = shift || return undef;
+
+    #if it's an int, load by id. otherwise, load by name.
+    if ( $identifier !~ /\D/ ) {
+        $self->SUPER::LoadById($identifier);
+    }
+    else {
+        $RT::Logger->crit("Group -> Load called with a bogus argument");
+        return undef;
+    }
+}
+
+# }}}
+
+# {{{ sub LoadUserDefinedGroup 
+
+=head2 LoadUserDefinedGroup NAME
+
+Loads a system group from the database. The only argument is
+the group's name.
+
+
+=cut
+
+sub LoadUserDefinedGroup {
+    my $self       = shift;
+    my $identifier = shift;
+
+        $self->LoadByCols( "Domain" => 'UserDefined',
+                           "Name" => $identifier );
+}
+
+# }}}
+
+# {{{ sub LoadACLEquivalenceGroup 
+
+=head2 LoadACLEquivalenceGroup  PRINCIPAL
+
+Loads a user's acl equivalence group. Takes a principal object.
+ACL equivalnce groups are used to simplify the acl system. Each user
+has one group that only he is a member of. Rights granted to the user
+are actually granted to that group. This greatly simplifies ACL checks.
+While this results in a somewhat more complex setup when creating users
+and granting ACLs, it _greatly_ simplifies acl checks.
+
+
+
+=cut
+
+sub LoadACLEquivalenceGroup {
+    my $self       = shift;
+    my $princ = shift;
+
+        $self->LoadByCols( "Domain" => 'ACLEquivalence',
+                            "Type" => 'UserEquiv',
+                           "Instance" => $princ->Id);
+}
+
+# }}}
+
+# {{{ sub LoadPersonalGroup 
+
+=head2 LoadPersonalGroup {Name => NAME, User => USERID}
+
+Loads a personal group from the database. 
+
+=cut
+
+sub LoadPersonalGroup {
+    my $self       = shift;
+    my %args =  (   Name => undef,
+                    User => undef,
+                    @_);
+
+        $self->LoadByCols( "Domain" => 'Personal',
+                           "Instance" => $args{'User'},
+                           "Type" => '',
+                           "Name" => $args{'Name'} );
+}
+
+# }}}
+
+# {{{ sub LoadSystemInternalGroup 
+
+=head2 LoadSystemInternalGroup NAME
+
+Loads a Pseudo group from the database. The only argument is
+the group's name.
+
+
+=cut
+
+sub LoadSystemInternalGroup {
+    my $self       = shift;
+    my $identifier = shift;
+
+        $self->LoadByCols( "Domain" => 'SystemInternal',
+                           "Instance" => '',
+                           "Name" => '',
+                           "Type" => $identifier );
+}
+
+# }}}
+
+# {{{ sub LoadTicketRoleGroup 
+
+=head2 LoadTicketRoleGroup  { Ticket => TICKET_ID, Type => TYPE }
+
+Loads a ticket group from the database. 
+
+Takes a param hash with 2 parameters:
+
+    Ticket is the TicketId we're curious about
+    Type is the type of Group we're trying to load: 
+        Requestor, Cc, AdminCc, Owner
+
+=cut
+
+sub LoadTicketRoleGroup {
+    my $self       = shift;
+    my %args = (Ticket => undef,
+                Type => undef,
+                @_);
+        $self->LoadByCols( Domain => 'RT::Ticket-Role',
+                           Instance =>$args{'Ticket'}, 
+                           Type => $args{'Type'}
+                           );
+}
+
+# }}}
+
+# {{{ sub LoadQueueRoleGroup 
+
+=head2 LoadQueueRoleGroup  { Queue => Queue_ID, Type => TYPE }
+
+Loads a Queue group from the database. 
+
+Takes a param hash with 2 parameters:
+
+    Queue is the QueueId we're curious about
+    Type is the type of Group we're trying to load: 
+        Requestor, Cc, AdminCc, Owner
+
+=cut
+
+sub LoadQueueRoleGroup {
+    my $self       = shift;
+    my %args = (Queue => undef,
+                Type => undef,
+                @_);
+        $self->LoadByCols( Domain => 'RT::Queue-Role',
+                           Instance =>$args{'Queue'}, 
+                           Type => $args{'Type'}
+                           );
+}
+
+# }}}
+
+# {{{ sub LoadSystemRoleGroup 
+
+=head2 LoadSystemRoleGroup  Type
+
+Loads a System group from the database. 
+
+Takes a single param: Type
+
+    Type is the type of Group we're trying to load: 
+        Requestor, Cc, AdminCc, Owner
+
+=cut
+
+sub LoadSystemRoleGroup {
+    my $self       = shift;
+    my $type = shift;
+        $self->LoadByCols( Domain => 'RT::System-Role',
+                           Type => $type
+                           );
+}
+
+# }}}
+
+# {{{ sub Create
+=head2 Create
+
+You need to specify what sort of group you're creating by calling one of the other
+Create_____ routines.
+
+=cut
+
+sub Create {
+    my $self = shift;
+    $RT::Logger->crit("Someone called RT::Group->Create. this method does not exist. someone's being evil");
+    return(0,$self->loc('Permission Denied'));
+}
+
+# }}}
+
+# {{{ sub _Create
+
+=head2 _Create
+
+Takes a paramhash with named arguments: Name, Description.
+
+Returns a tuple of (Id, Message).  If id is 0, the create failed
+
+=cut
+
+sub _Create {
+    my $self = shift;
+    my %args = (
+        Name        => undef,
+        Description => undef,
+        Domain      => undef,
+        Type        => undef,
+        Instance    => undef,
+        InsideTransaction => undef,
+        @_
+    );
+
+    $RT::Handle->BeginTransaction() unless ($args{'InsideTransaction'});
+    # Groups deal with principal ids, rather than user ids.
+    # When creating this group, set up a principal Id for it.
+    my $principal    = RT::Principal->new( $self->CurrentUser );
+    my $principal_id = $principal->Create(
+        PrincipalType => 'Group',
+        ObjectId      => '0'
+    );
+    $principal->__Set(Field => 'ObjectId', Value => $principal_id);
+
+
+    $self->SUPER::Create(
+        id          => $principal_id,
+        Name        => $args{'Name'},
+        Description => $args{'Description'},
+        Type        => $args{'Type'},
+        Domain      => $args{'Domain'},
+        Instance    => $args{'Instance'}
+    );
+    my $id = $self->Id;
+    unless ($id) {
+        return ( 0, $self->loc('Could not create group') );
+    }
+
+    # If we couldn't create a principal Id, get the fuck out.
+    unless ($principal_id) {
+        $RT::Handle->Rollback() unless ($args{'InsideTransaction'});
+        $self->crit( "Couldn't create a Principal on new user create. Strange things are afoot at the circle K" );
+        return ( 0, $self->loc('Could not create group') );
+    }
+
+    # Now we make the group a member of itself as a cached group member
+    # this needs to exist so that group ACL checks don't fall over.
+    # you're checking CachedGroupMembers to see if the principal in question
+    # is a member of the principal the rights have been granted too
+
+    # in the ordinary case, this would fail badly because it would recurse and add all the members of this group as 
+    # cached members. thankfully, we're creating the group now...so it has no members.
+    my $cgm = RT::CachedGroupMember->new($self->CurrentUser);
+    $cgm->Create(Group =>$self->PrincipalObj, Member => $self->PrincipalObj, ImmediateParent => $self->PrincipalObj);
+
+
+
+    $RT::Handle->Commit() unless ($args{'InsideTransaction'});
+    return ( $id, $self->loc("Group created") );
+}
+
+# }}}
+
+# {{{ CreateUserDefinedGroup
+
+=head2 CreateUserDefinedGroup { Name => "name", Description => "Description"}
+
+A helper subroutine which creates a system group 
+
+Returns a tuple of (Id, Message).  If id is 0, the create failed
+
+=cut
+
+sub CreateUserDefinedGroup {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('AdminGroup') ) {
+        $RT::Logger->warning( $self->CurrentUser->Name
+              . " Tried to create a group without permission." );
+        return ( 0, $self->loc('Permission Denied') );
+    }
+
+    return($self->_Create( Domain => 'UserDefined', Type => '', Instance => '', @_));
+}
+
+# }}}
+
+# {{{ _CreateACLEquivalenceGroup
+
+=head2 _CreateACLEquivalenceGroup { Principal }
+
+A helper subroutine which creates a group containing only 
+an individual user. This gets used by the ACL system to check rights.
+Yes, it denormalizes the data, but that's ok, as we totally win on performance.
+
+Returns a tuple of (Id, Message).  If id is 0, the create failed
+
+=cut
+
+sub _CreateACLEquivalenceGroup { 
+    my $self = shift;
+    my $princ = shift;
+      my $id = $self->_Create( Domain => 'ACLEquivalence', 
+                           Type => 'UserEquiv',
+                           Name => 'User '. $princ->Object->Id,
+                           Description => 'ACL equiv. for user '.$princ->Object->Id,
+                           Instance => $princ->Id,
+                           InsideTransaction => 1);
+      unless ($id) {
+        $RT::Logger->crit("Couldn't create ACL equivalence group");
+        return undef;
+      }
+    
+       # We use stashuser so we don't get transactions inside transactions
+       # and so we bypass all sorts of cruft we don't need
+       my $aclstash = RT::GroupMember->new($self->CurrentUser);
+       my ($stash_id, $add_msg) = $aclstash->_StashUser(Group => $self->PrincipalObj,
+                                             Member => $princ);
+
+      unless ($stash_id) {
+        $RT::Logger->crit("Couldn't add the user to his own acl equivalence group:".$add_msg);
+        # We call super delete so we don't get acl checked.
+        $self->SUPER::Delete();
+        return(undef);
+      }
+    return ($id);
+}
+
+# }}}
+
+# {{{ CreatePersonalGroup
+
+=head2 CreatePersonalGroup { PrincipalId => PRINCIPAL_ID, Name => "name", Description => "Description"}
+
+A helper subroutine which creates a personal group. Generally,
+personal groups are used for ACL delegation and adding to ticket roles
+PrincipalId defaults to the current user's principal id.
+
+Returns a tuple of (Id, Message).  If id is 0, the create failed
+
+=cut
+
+sub CreatePersonalGroup {
+    my $self = shift;
+    my %args = (
+        Name        => undef,
+        Description => undef,
+        PrincipalId => $self->CurrentUser->PrincipalId,
+        @_
+    );
+
+    if ( $self->CurrentUser->PrincipalId == $args{'PrincipalId'} ) {
+
+        unless ( $self->CurrentUserHasRight('AdminOwnPersonalGroups') ) {
+            $RT::Logger->warning( $self->CurrentUser->Name
+                  . " Tried to create a group without permission." );
+            return ( 0, $self->loc('Permission Denied') );
+        }
+
+    }
+    else {
+        unless ( $self->CurrentUserHasRight('AdminAllPersonalGroups') ) {
+            $RT::Logger->warning( $self->CurrentUser->Name
+                  . " Tried to create a group without permission." );
+            return ( 0, $self->loc('Permission Denied') );
+        }
+
+    }
+
+    return (
+        $self->_Create(
+            Domain      => 'Personal',
+            Type        => '',
+            Instance    => $args{'PrincipalId'},
+            Name        => $args{'Name'},
+            Description => $args{'Description'}
+        )
+    );
+}
+
+# }}}
+
+# {{{ CreateRoleGroup 
+
+=head2 CreateRoleGroup { Domain => DOMAIN, Type =>  TYPE, Instance => ID }
+
+A helper subroutine which creates a  ticket group. (What RT 2.0 called Ticket watchers)
+Type is one of ( "Requestor" || "Cc" || "AdminCc" || "Owner") 
+Domain is one of (RT::Ticket-Role || RT::Queue-Role || RT::System-Role)
+Instance is the id of the ticket or queue in question
+
+This routine expects to be called from {Ticket||Queue}->CreateTicketGroups _inside of a transaction_
+
+Returns a tuple of (Id, Message).  If id is 0, the create failed
+
+=cut
+
+sub CreateRoleGroup {
+    my $self = shift;
+    my %args = ( Instance => undef,
+                 Type     => undef,
+                 Domain   => undef,
+                 @_ );
+    unless ( $args{'Type'} =~ /^(?:Cc|AdminCc|Requestor|Owner)$/ ) {
+        return ( 0, $self->loc("Invalid Group Type") );
+    }
+
+
+    return ( $self->_Create( Domain            => $args{'Domain'},
+                             Instance          => $args{'Instance'},
+                             Type              => $args{'Type'},
+                             InsideTransaction => 1 ) );
+}
+
+# }}}
+
+# {{{ sub Delete
+
+=head2 Delete
+
+Delete this object
+
+=cut
+
+sub Delete {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('AdminGroup') ) {
+        return ( 0, 'Permission Denied' );
+    }
+
+    $RT::Logger->crit("Deleting groups violates referential integrity until we go through and fix this");
+    # TODO XXX 
+   
+    # Remove the principal object
+    # Remove this group from anything it's a member of.
+    # Remove all cached members of this group
+    # Remove any rights granted to this group
+    # remove any rights delegated by way of this group
+
+    return ( $self->SUPER::Delete(@_) );
+}
+
+# }}}
+
+=head2 SetDisabled BOOL
+
+If passed a positive value, this group will be disabled. No rights it commutes or grants will be honored.
+It will not appear in most group listings.
+
+This routine finds all the cached group members that are members of this group  (recursively) and disables them.
+=cut 
+
+ # }}}
+
+ sub SetDisabled {
+     my $self = shift;
+     my $val = shift;
+    if ($self->Domain eq 'Personal') {
+               if ($self->CurrentUser->PrincipalId == $self->Instance) {
+               unless ( $self->CurrentUserHasRight('AdminOwnPersonalGroups')) {
+                       return ( 0, $self->loc('Permission Denied') );
+               }
+       } else {
+               unless ( $self->CurrentUserHasRight('AdminAllPersonalGroups') ) {
+                        return ( 0, $self->loc('Permission Denied') );
+               }
+       }
+       }
+       else {
+        unless ( $self->CurrentUserHasRight('AdminGroup') ) {
+                 return (0, $self->loc('Permission Denied'));
+    }
+    }
+    $RT::Handle->BeginTransaction();
+    $self->PrincipalObj->SetDisabled($val);
+
+
+
+
+    # Find all occurrences of this member as a member of this group
+    # in the cache and nuke them, recursively.
+
+    # The following code will delete all Cached Group members
+    # where this member's group is _not_ the primary group 
+    # (Ie if we're deleting C as a member of B, and B happens to be 
+    # a member of A, will delete C as a member of A without touching
+    # C as a member of B
+
+    my $cached_submembers = RT::CachedGroupMembers->new( $self->CurrentUser );
+
+    $cached_submembers->Limit( FIELD    => 'ImmediateParentId', OPERATOR => '=', VALUE    => $self->Id);
+
+    #Clear the key cache. TODO someday we may want to just clear a little bit of the keycache space. 
+    # TODO what about the groups key cache?
+    RT::Principal->_InvalidateACLCache();
+
+
+
+    while ( my $item = $cached_submembers->Next() ) {
+        my $del_err = $item->SetDisabled($val);
+        unless ($del_err) {
+            $RT::Handle->Rollback();
+            $RT::Logger->warning("Couldn't disable cached group submember ".$item->Id);
+            return (undef);
+        }
+    }
+
+    $RT::Handle->Commit();
+    return (1, $self->loc("Succeeded"));
+
+}
+
+# }}}
+
+
+
+sub Disabled {
+    my $self = shift;
+    $self->PrincipalObj->Disabled(@_);
+}
+
+
+# {{{ DeepMembersObj
+
+=head2 DeepMembersObj
+
+Returns an RT::CachedGroupMembers object of this group's members.
+
+=cut
+
+sub DeepMembersObj {
+    my $self = shift;
+    my $members_obj = RT::CachedGroupMembers->new( $self->CurrentUser );
+
+    #If we don't have rights, don't include any results
+    # TODO XXX  WHY IS THERE NO ACL CHECK HERE?
+    $members_obj->LimitToMembersOfGroup( $self->PrincipalId );
+
+    return ( $members_obj );
+
+}
+
+# }}}
+
+# {{{ UserMembersObj
+
+=head2 UserMembersObj
+
+Returns an RT::Users object of this group's members, including
+all members of subgroups
+
+=cut
+
+sub UserMembersObj {
+    my $self = shift;
+
+    my $users = RT::Users->new($self->CurrentUser);
+
+    #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');
+    $users->Limit(ALIAS => $cached_members, 
+                  FIELD => 'GroupId',
+                  OPERATOR => '=',
+                  VALUE => $self->PrincipalId);
+
+
+    return ( $users);
+
+}
+
+# }}}
+
+# {{{ MembersObj
+
+=head2 MembersObj
+
+Returns an RT::CachedGroupMembers object of this group's members.
+
+=cut
+
+sub MembersObj {
+    my $self = shift;
+    my $members_obj = RT::GroupMembers->new( $self->CurrentUser );
+
+    #If we don't have rights, don't include any results
+    # TODO XXX  WHY IS THERE NO ACL CHECK HERE?
+    $members_obj->LimitToMembersOfGroup( $self->PrincipalId );
+
+    return ( $members_obj );
+
+}
+
+# }}}
+
+# {{{ MemberEmailAddresses
+
+=head2 MemberEmailAddresses
+
+Returns an array of the email addresses of all of this group's members
+
+
+=cut
+
+sub MemberEmailAddresses {
+    my $self = shift;
+
+    my %addresses;
+    my $members = $self->UserMembersObj();
+    while (my $member = $members->Next) {
+        $addresses{$member->EmailAddress} = 1;
+    }
+    return(sort keys %addresses);
+}
+
+# }}}
+
+# {{{ MemberEmailAddressesAsString
+
+=head2 MemberEmailAddressesAsString
+
+Returns a comma delimited string of the email addresses of all users 
+who are members of this group.
+
+=cut
+
+
+sub MemberEmailAddressesAsString {
+    my $self = shift;
+    return (join(', ', $self->MemberEmailAddresses));
+}
+
+# }}}
+
+# {{{ AddMember
+
+=head2 AddMember PRINCIPAL_ID
+
+AddMember adds a principal to this group.  It takes a single principal id.
+Returns a two value array. the first value is true on successful 
+addition or 0 on failure.  The second value is a textual status msg.
+
+=cut
+
+sub AddMember {
+    my $self       = shift;
+    my $new_member = shift;
+
+
+
+    if ($self->Domain eq 'Personal') {
+               if ($self->CurrentUser->PrincipalId == $self->Instance) {
+               unless ( $self->CurrentUserHasRight('AdminOwnPersonalGroups')) {
+                       return ( 0, $self->loc('Permission Denied') );
+               }
+       } else {
+               unless ( $self->CurrentUserHasRight('AdminAllPersonalGroups') ) {
+                        return ( 0, $self->loc('Permission Denied') );
+               }
+       }
+       }
+       
+       else {  
+    # We should only allow membership changes if the user has the right 
+    # to modify group membership or the user is the principal in question
+    # and the user has the right to modify his own membership
+    unless ( ($new_member == $self->CurrentUser->PrincipalId &&
+             $self->CurrentUserHasRight('ModifyOwnMembership') ) ||
+             $self->CurrentUserHasRight('AdminGroupMembership') ) {
+        #User has no permission to be doing this
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+       } 
+    $self->_AddMember(PrincipalId => $new_member);
+}
+
+# A helper subroutine for AddMember that bypasses the ACL checks
+# this should _ONLY_ ever be called from Ticket/Queue AddWatcher
+# when we want to deal with groups according to queue rights
+# In the dim future, this will all get factored out and life
+# will get better      
+
+# takes a paramhash of { PrincipalId => undef, InsideTransaction }
+
+sub _AddMember {
+    my $self = shift;
+    my %args = ( PrincipalId => undef,
+                 InsideTransaction => undef,
+                 @_);
+    my $new_member = $args{'PrincipalId'};
+
+    unless ($self->Id) {
+        $RT::Logger->crit("Attempting to add a member to a group which wasn't loaded. 'oops'");
+        return(0, $self->loc("Group not found"));
+    }
+
+    unless ($new_member =~ /^\d+$/) {
+        $RT::Logger->crit("_AddMember called with a parameter that's not an integer.");
+    }
+
+
+    my $new_member_obj = RT::Principal->new( $self->CurrentUser );
+    $new_member_obj->Load($new_member);
+
+
+    unless ( $new_member_obj->Id ) {
+        $RT::Logger->debug("Couldn't find that principal");
+        return ( 0, $self->loc("Couldn't find that principal") );
+    }
+
+    if ( $self->HasMember( $new_member_obj ) ) {
+
+        #User is already a member of this group. no need to add it
+        return ( 0, $self->loc("Group already has member") );
+    }
+    if ( $new_member_obj->IsGroup &&
+         $new_member_obj->Object->HasMemberRecursively($self->PrincipalObj) ) {
+
+        #This group can't be made to be a member of itself
+        return ( 0, $self->loc("Groups can't be members of their members"));
+    }
+
+
+    my $member_object = RT::GroupMember->new( $self->CurrentUser );
+    my $id = $member_object->Create(
+        Member => $new_member_obj,
+        Group => $self->PrincipalObj,
+        InsideTransaction => $args{'InsideTransaction'}
+    );
+    if ($id) {
+        return ( 1, $self->loc("Member added") );
+    }
+    else {
+        return(0, $self->loc("Couldn't add member to group"));
+    }
+}
+# }}}
+
+# {{{ HasMember
+
+=head2 HasMember RT::Principal
+
+Takes an RT::Principal object returns a GroupMember Id if that user is a 
+member of this group.
+Returns undef if the user isn't a member of the group or if the current
+user doesn't have permission to find out. Arguably, it should differentiate
+between ACL failure and non membership.
+
+=cut
+
+sub HasMember {
+    my $self    = shift;
+    my $principal = shift;
+
+
+    unless (UNIVERSAL::isa($principal,'RT::Principal')) {
+        $RT::Logger->crit("Group::HasMember was called with an argument that".
+                          "isn't an RT::Principal. It's $principal");
+        return(undef);
+    }
+
+    my $member_obj = RT::GroupMember->new( $self->CurrentUser );
+    $member_obj->LoadByCols( MemberId => $principal->id, 
+                             GroupId => $self->PrincipalId );
+
+    #If we have a member object
+    if ( defined $member_obj->id ) {
+        return ( $member_obj->id );
+    }
+
+    #If Load returns no objects, we have an undef id. 
+    else {
+        #$RT::Logger->debug($self." does not contain principal ".$principal->id);
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ HasMemberRecursively
+
+=head2 HasMemberRecursively RT::Principal
+
+Takes an RT::Principal object and returns true if that user is a member of 
+this group.
+Returns undef if the user isn't a member of the group or if the current
+user doesn't have permission to find out. Arguably, it should differentiate
+between ACL failure and non membership.
+
+=cut
+
+sub HasMemberRecursively {
+    my $self    = shift;
+    my $principal = shift;
+
+    unless (UNIVERSAL::isa($principal,'RT::Principal')) {
+        $RT::Logger->crit("Group::HasMemberRecursively was called with an argument that".
+                          "isn't an RT::Principal. It's $principal");
+        return(undef);
+    }
+    my $member_obj = RT::CachedGroupMember->new( $self->CurrentUser );
+    $member_obj->LoadByCols( MemberId => $principal->Id,
+                             GroupId => $self->PrincipalId ,
+                             Disabled => 0
+                             );
+
+    #If we have a member object
+    if ( defined $member_obj->id ) {
+        return ( 1);
+    }
+
+    #If Load returns no objects, we have an undef id. 
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ DeleteMember
+
+=head2 DeleteMember PRINCIPAL_ID
+
+Takes the principal id of a current user or group.
+If the current user has apropriate rights,
+removes that GroupMember from this group.
+Returns a two value array. the first value is true on successful 
+addition or 0 on failure.  The second value is a textual status msg.
+
+=cut
+
+sub DeleteMember {
+    my $self   = shift;
+    my $member_id = shift;
+
+
+    # We should only allow membership changes if the user has the right 
+    # to modify group membership or the user is the principal in question
+    # and the user has the right to modify his own membership
+
+    if ($self->Domain eq 'Personal') {
+               if ($self->CurrentUser->PrincipalId == $self->Instance) {
+               unless ( $self->CurrentUserHasRight('AdminOwnPersonalGroups')) {
+                       return ( 0, $self->loc('Permission Denied') );
+               }
+       } else {
+               unless ( $self->CurrentUserHasRight('AdminAllPersonalGroups') ) {
+                        return ( 0, $self->loc('Permission Denied') );
+               }
+       }
+       }
+       else {
+    unless ( (($member_id == $self->CurrentUser->PrincipalId) &&
+             $self->CurrentUserHasRight('ModifyOwnMembership') ) ||
+             $self->CurrentUserHasRight('AdminGroupMembership') ) {
+        #User has no permission to be doing this
+        return ( 0, $self->loc("Permission Denied") );
+    }
+       }
+    $self->_DeleteMember($member_id);
+}
+
+# A helper subroutine for DeleteMember that bypasses the ACL checks
+# this should _ONLY_ ever be called from Ticket/Queue  DeleteWatcher
+# when we want to deal with groups according to queue rights
+# In the dim future, this will all get factored out and life
+# will get better      
+
+sub _DeleteMember {
+    my $self = shift;
+    my $member_id = shift;
+
+    my $member_obj =  RT::GroupMember->new( $self->CurrentUser );
+    
+    $member_obj->LoadByCols( MemberId  => $member_id,
+                             GroupId => $self->PrincipalId);
+
+
+    #If we couldn't load it, return undef.
+    unless ( $member_obj->Id() ) {
+        $RT::Logger->debug("Group has no member with that id");
+        return ( 0,$self->loc( "Group has no such member" ));
+    }
+
+    #Now that we've checked ACLs and sanity, delete the groupmember
+    my $val = $member_obj->Delete();
+
+    if ($val) {
+        return ( $val, $self->loc("Member deleted") );
+    }
+    else {
+        $RT::Logger->debug("Failed to delete group ".$self->Id." member ". $member_id);
+        return ( 0, $self->loc("Member not deleted" ));
+    }
+}
+
+# }}}
+
+# {{{ ACL Related routines
+
+# {{{ sub _Set
+sub _Set {
+    my $self = shift;
+
+       if ($self->Domain eq 'Personal') {
+               if ($self->CurrentUser->PrincipalId == $self->Instance) {
+               unless ( $self->CurrentUserHasRight('AdminOwnPersonalGroups')) {
+                       return ( 0, $self->loc('Permission Denied') );
+               }
+       } else {
+               unless ( $self->CurrentUserHasRight('AdminAllPersonalGroups') ) {
+                        return ( 0, $self->loc('Permission Denied') );
+               }
+       }
+       }
+       else {
+       unless ( $self->CurrentUserHasRight('AdminGroup') ) {
+               return ( 0, $self->loc('Permission Denied') );
+       }
+       }
+    return ( $self->SUPER::_Set(@_) );
+}
+
+# }}}
+
+
+
+
+=item CurrentUserHasRight RIGHTNAME
+
+Returns true if the current user has the specified right for this group.
+
+
+    TODO: we don't deal with membership visibility yet
+
+=cut
+
+
+sub CurrentUserHasRight {
+    my $self = shift;
+    my $right = shift;
+
+
+
+    if ($self->Id && 
+               $self->CurrentUser->HasRight( Object => $self,
+                                                                                  Right => $right )) {
+        return(1);
+   }
+    elsif ( $self->CurrentUser->HasRight(Object => $RT::System, Right =>  $right )) {
+               return (1);
+    } else {
+        return(undef);
+    }
+
+}
+
+# }}}
+
+
+
+
+# {{{ Principal related routines
+
+=head2 PrincipalObj
+
+Returns the principal object for this user. returns an empty RT::Principal
+if there's no principal object matching this user. 
+The response is cached. PrincipalObj should never ever change.
+
+=begin testing
+
+ok(my $u = RT::Group->new($RT::SystemUser));
+ok($u->Load(4), "Loaded the first user");
+ok($u->PrincipalObj->ObjectId == 4, "user 4 is the fourth principal");
+ok($u->PrincipalObj->PrincipalType eq 'Group' , "Principal 4 is a group");
+
+=end testing
+
+=cut
+
+
+sub PrincipalObj {
+    my $self = shift;
+    unless ($self->{'PrincipalObj'} &&
+            ($self->{'PrincipalObj'}->ObjectId == $self->Id) &&
+            ($self->{'PrincipalObj'}->PrincipalType eq 'Group')) {
+
+            $self->{'PrincipalObj'} = RT::Principal->new($self->CurrentUser);
+            $self->{'PrincipalObj'}->LoadByCols('ObjectId' => $self->Id,
+                                                'PrincipalType' => 'Group') ;
+            }
+    return($self->{'PrincipalObj'});
+}
+
+
+=head2 PrincipalId  
+
+Returns this user's PrincipalId
+
+=cut
+
+sub PrincipalId {
+    my $self = shift;
+    return $self->Id;
+}
+
+# }}}
+1;
+
diff --git a/rt/lib/RT/Groups_Overlay.pm b/rt/lib/RT/Groups_Overlay.pm
new file mode 100644 (file)
index 0000000..3d2c660
--- /dev/null
@@ -0,0 +1,298 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Groups - a collection of RT::Group objects
+
+=head1 SYNOPSIS
+
+  use RT::Groups;
+  my $groups = $RT::Groups->new($CurrentUser);
+  $groups->LimitToReal();
+  while (my $group = $groups->Next()) {
+     print $group->Id ." is a group id\n";
+  }
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Groups);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+# {{{ sub _Init
+
+sub _Init { 
+  my $self = shift;
+  $self->{'table'} = "Groups";
+  $self->{'primary_key'} = "id";
+
+  $self->OrderBy( ALIAS => 'main',
+                 FIELD => 'Name',
+                 ORDER => 'ASC');
+
+
+  return ( $self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ LimiToSystemInternalGroups
+
+=head2 LimitToSystemInternalGroups
+
+Return only SystemInternal Groups, such as "privileged" "unprivileged" and "everyone" 
+
+=cut
+
+
+sub LimitToSystemInternalGroups {
+    my $self = shift;
+    $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'SystemInternal');
+    $self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => '');
+}
+
+
+# }}}
+
+# {{{ LimiToUserDefinedGroups
+
+=head2 LimitToUserDefined Groups
+
+Return only UserDefined Groups
+
+=cut
+
+
+sub LimitToUserDefinedGroups {
+    my $self = shift;
+    $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'UserDefined');
+    $self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => '');
+}
+
+
+# }}}
+
+# {{{ LimiToPersonalGroups
+
+=head2 LimitToPersonalGroupsFor PRINCIPAL_ID
+
+Return only Personal Groups for the user whose principal id 
+is PRINCIPAL_ID
+
+=cut
+
+
+sub LimitToPersonalGroupsFor {
+    my $self = shift;
+    my $princ = shift;
+
+    $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'Personal');
+    $self->Limit(   FIELD => 'Instance',   
+                    OPERATOR => '=', 
+                    VALUE => $princ,
+                    ENTRY_AGGREGATOR => 'OR');
+}
+
+
+# }}}
+
+# {{{ LimitToRolesForQueue
+
+=item LimitToRolesForQueue QUEUE_ID
+
+Limits the set of groups found to role groups for queue QUEUE_ID
+
+=cut
+
+sub LimitToRolesForQueue {
+    my $self = shift;
+    my $queue = shift;
+    $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'RT::Queue-Role');
+    $self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => $queue);
+}
+
+# }}}
+
+# {{{ LimitToRolesForTicket
+
+=item LimitToRolesForTicket Ticket_ID
+
+Limits the set of groups found to role groups for Ticket Ticket_ID
+
+=cut
+
+sub LimitToRolesForTicket {
+    my $self = shift;
+    my $Ticket = shift;
+    $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'RT::Ticket-Role');
+    $self->Limit(FIELD => 'Instance', OPERATOR => '=', VALUE => '$Ticket');
+}
+
+# }}}
+
+# {{{ LimitToRolesForSystem
+
+=item LimitToRolesForSystem System_ID
+
+Limits the set of groups found to role groups for System System_ID
+
+=cut
+
+sub LimitToRolesForSystem {
+    my $self = shift;
+    $self->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => 'RT::System-Role');
+}
+
+# }}}
+
+=head2 WithMember {PrincipalId => PRINCIPAL_ID, Recursively => undef}
+
+Limits the set of groups returned to groups which have
+Principal PRINCIPAL_ID as a member
+   
+=begin testing
+
+my $u = RT::User->new($RT::SystemUser);
+$u->Create(Name => 'Membertests');
+my $g = RT::Group->new($RT::SystemUser);
+my ($id, $msg) = $g->CreateUserDefinedGroup(Name => 'Membertests');
+ok ($id,$msg);
+
+my ($aid, $amsg) =$g->AddMember($u->id);
+ok ($aid, $amsg);
+ok($g->HasMember($u->PrincipalObj),"G has member u");
+
+my $groups = RT::Groups->new($RT::SystemUser);
+$groups->LimitToUserDefinedGroups();
+$groups->WithMember(PrincipalId => $u->id);
+ok ($groups->Count == 1,"found the 1 group - " . $groups->Count);
+ok ($groups->First->Id == $g->Id, "it's the right one");
+
+
+
+
+=end testing
+
+
+=cut
+
+sub WithMember {
+    my $self = shift;
+    my %args = ( PrincipalId => undef,
+                 Recursively => undef,
+                 @_);
+    my $members;
+
+    if ($args{'Recursively'}) {
+        $members = $self->NewAlias('CachedGroupMembers');
+    } else {
+        $members = $self->NewAlias('GroupMembers');
+    }
+    $self->Join(ALIAS1 => 'main', FIELD1 => 'id',
+                ALIAS2 => $members, FIELD2 => 'GroupId');
+
+    $self->Limit(ALIAS => $members, FIELD => 'MemberId', OPERATOR => '=', VALUE => $args{'PrincipalId'});
+}
+
+
+sub WithRight {
+    my $self = shift;
+    my %args = ( Right                  => undef,
+                 Object =>              => undef,
+                 IncludeSystemRights    => undef,
+                 IncludeSuperusers      => undef,
+                 @_ );
+
+    my $groupprinc = $self->NewAlias('Principals');
+    my $acl        = $self->NewAlias('ACL');
+
+    # {{{ 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},
+                  ENTRYAGGREGATOR => 'OR' );
+
+    if ( $args{'IncludeSuperusers'} ) {
+        $self->Limit( ALIAS           => $acl,
+                      FIELD           => 'RightName',
+                      OPERATOR        => '=',
+                      VALUE           => 'SuperUser',
+                      ENTRYAGGREGATOR => 'OR' );
+    }
+    # }}}
+
+    my ($or_check_ticket_roles, $or_check_roles, $or_look_at_object);
+
+    if ( defined $args{'Object'} ) {
+        if ( ref($args{'Object'}) eq 'RT::Ticket' ) {
+            $or_check_ticket_roles =
+                " OR ( main.Domain = 'RT::Ticket-Role' AND main.Instance = " . $args{'Object'}->Id . ") ";
+
+            # If we're looking at ticket rights, we also want to look at the associated queue rights.
+            # this is a little bit hacky, but basically, now that we've done the ticket roles magic,
+            # we load the queue object and ask all the rest of our questions about the queue.
+            $args{'Object'}   = $args{'Object'}->QueueObj;
+        }
+        # TODO XXX This really wants some refactoring
+        if ( ref($args{'Object'}) eq 'RT::Queue' ) {
+            $or_check_roles =
+                " OR ( ( (main.Domain = 'RT::Queue-Role' AND main.Instance = " .
+                $args{'Object'}->Id . ") $or_check_ticket_roles ) " .
+                " AND main.Type = $acl.PrincipalType AND main.id = $groupprinc.id) ";
+        }
+
+        $or_look_at_object =
+            " OR ($acl.ObjectType = '" . ref($args{'Object'}) . "'" .
+            " AND $acl.ObjectId = " . $args{'Object'}->Id . ") ";
+    }
+
+    $self->_AddSubClause( "WhichObject", "($acl.ObjectType = 'RT::System' $or_look_at_object)" );
+
+    $self->_AddSubClause( "WhichGroup",
+        qq{
+          ( (    $acl.PrincipalId = $groupprinc.id
+             AND $acl.PrincipalType = 'Group'
+             AND (   main.Domain = 'SystemInternal'
+                  OR main.Domain = 'UserDefined'
+                  OR main.Domain = 'ACLEquivalence')
+             AND main.id = $groupprinc.id)
+           $or_check_roles)
+        }
+    );
+}
+
+1;
+
diff --git a/rt/lib/RT/I18N.pm b/rt/lib/RT/I18N.pm
new file mode 100644 (file)
index 0000000..c013c21
--- /dev/null
@@ -0,0 +1,430 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+RT::I18N - a base class for localization of RT
+
+=cut
+
+package RT::I18N;
+
+use strict;
+use Locale::Maketext 1.04;
+use Locale::Maketext::Lexicon 0.25;
+use base ('Locale::Maketext::Fuzzy');
+use vars qw( %Lexicon );
+
+#If we're running on 5.6, we desperately need Encode::compat. But if we're on 5.8, we don't really need it.
+BEGIN { if ($] < 5.007001) {
+require Encode::compat;
+} }
+use Encode;
+
+use MIME::Entity;
+use MIME::Head;
+
+# I decree that this project's first language is English.
+
+%Lexicon = (
+   'TEST_STRING' => 'Concrete Mixer',
+
+    '__Content-Type' => 'text/plain; charset=utf-8',
+
+  '_AUTO' => 1,
+  # That means that lookup failures can't happen -- if we get as far
+  #  as looking for something in this lexicon, and we don't find it,
+  #  then automagically set $Lexicon{$key} = $key, before possibly
+  #  compiling it.
+  
+  # The exception is keys that start with "_" -- they aren't auto-makeable.
+
+);
+# End of lexicon.
+
+=head2 Init
+
+Initializes the lexicons used for localization.
+
+=begin testing
+
+use_ok (RT::I18N);
+ok(RT::I18N->Init);
+
+=end testing
+
+=cut
+
+sub Init {
+    # Load language-specific functions
+    foreach my $language ( glob(substr(__FILE__, 0, -3) . "/*.pm")) {
+        if ($language =~ /^([-\w.\/\\~:]+)$/) {
+            require $1;
+        }
+        else {
+           warn("$language is tainted. not loading");
+        } 
+    }
+
+    my @lang = @RT::LexiconLanguages;
+    @lang = ('*') unless @lang;
+
+    # Acquire all .po files and iterate them into lexicons
+    Locale::Maketext::Lexicon->import({
+       _decode => 1, map {
+           $_  => [
+               Gettext => (substr(__FILE__, 0, -3) . "/$_.po"),
+               Gettext => "$RT::LocalLexiconPath/*/$_.po",
+           ],
+       } @lang
+    });
+
+    return 1;
+}
+
+=head2 encoding
+
+Returns the encoding of the current lexicon, as yanked out of __ContentType's "charset" field.
+If it can't find anything, it returns 'ISO-8859-1'
+
+=begin testing
+
+ok(my $chinese = RT::I18N->get_handle('zh_tw'));
+ok(UNIVERSAL::can($chinese, 'maketext'));
+ok($chinese->maketext('__Content-Type') =~ /utf-8/i, "Found the utf-8 charset for traditional chinese in the string ".$chinese->maketext('__Content-Type'));
+ok($chinese->encoding eq 'utf-8', "The encoding is 'utf-8' -".$chinese->encoding);
+
+ok(my $en = RT::I18N->get_handle('en'));
+ok(UNIVERSAL::can($en, 'maketext'));
+ok($en->encoding eq 'utf-8', "The encoding ".$en->encoding." is 'utf-8'");
+
+=end testing
+
+
+=cut
+
+
+sub encoding { 'utf-8' }
+
+# {{{ SetMIMEEntityToUTF8
+
+=head2 SetMIMEEntityToUTF8 $entity
+
+An utility method which will try to convert entity body into utf8.
+It's now a wrap-up of SetMIMEEntityToEncoding($entity, 'utf-8').
+
+=cut
+
+sub SetMIMEEntityToUTF8 {
+    RT::I18N::SetMIMEEntityToEncoding(shift, 'utf-8');
+}
+
+# }}}
+
+# {{{ SetMIMEEntityToEncoding
+
+=head2 SetMIMEEntityToEncoding $entity, $encoding
+
+An utility method which will try to convert entity body into specified
+charset encoding (encoded as octets, *not* unicode-strings).  It will
+iterate all the entities in $entity, and try to convert each one into
+specified charset if whose Content-Type is 'text/plain'.
+
+This method doesn't return anything meaningful.
+
+=cut
+
+sub SetMIMEEntityToEncoding {
+    my ( $entity, $enc, $preserve_words ) = ( shift, shift, shift );
+
+    #if ( $entity->is_multipart ) {
+    #$RT::Logger->crit("This entity is a multipart " . $entity->head->as_string);
+       SetMIMEEntityToEncoding( $_, $enc, $preserve_words ) foreach $entity->parts;
+    #}
+
+    my $charset = _FindOrGuessCharset($entity) or return;
+    # one and only normalization
+    $charset = 'utf-8' if $charset eq 'utf8';
+    $enc     = 'utf-8' if $enc     eq 'utf8';
+
+    SetMIMEHeadToEncoding($entity->head, $charset => $enc, $preserve_words);
+
+    my $head = $entity->head;
+
+    # convert at least MIME word encoded attachment filename
+    foreach my $attr (qw(content-type.name content-disposition.filename)) {
+       if ( my $name = $head->mime_attr($attr) and !$preserve_words ) {
+           $head->mime_attr( $attr => DecodeMIMEWordsToUTF8($name) );
+       }
+    }
+
+    # If this is a textual entity, we'd need to preserve its original encoding
+    $head->add( "X-RT-Original-Encoding" => $charset )
+       if $head->mime_attr('content-type.charset') or $head->mime_type =~ /^text/;
+
+
+    return unless ( $head->mime_type =~ qr{^(text/plain|message/rfc822)$}i  );
+    
+
+    my $body = $entity->bodyhandle;
+
+    if ( $enc ne $charset && $body) {
+       my @lines = $body->as_lines or return;
+
+       # {{{ Convert the body
+       eval {
+           $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". $head->get('subject'));
+
+           # NOTE:: see the comments at the end of the sub.
+           Encode::_utf8_off( $lines[$_] ) foreach ( 0 .. $#lines );
+           Encode::from_to( $lines[$_], $charset => $enc ) for ( 0 .. $#lines );
+       };
+
+       if ($@) {
+           $RT::Logger->error( "Encoding error: " . $@ . " defaulting to ISO-8859-1 -> UTF-8" );
+           eval {
+               Encode::from_to( $lines[$_], 'iso-8859-1' => $enc ) foreach ( 0 .. $#lines );
+           };
+           if ($@) {
+               $RT::Logger->crit( "Totally failed to convert to utf-8: " . $@ . " I give up" );
+           }
+       }
+       # }}}
+
+        my $new_body = MIME::Body::InCore->new( \@lines );
+
+        # set up the new entity
+        $head->mime_attr( "content-type" => 'text/plain' )
+          unless ( $head->mime_attr("content-type") );
+        $head->mime_attr( "content-type.charset" => $enc );
+        $entity->bodyhandle($new_body);
+    }
+}
+
+# NOTES:  Why Encode::_utf8_off before Encode::from_to
+#
+# All the strings in RT are utf-8 now.  Quotes from Encode POD:
+#
+# [$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK])
+# ... The data in $octets must be encoded as octets and not as
+# characters in Perl's internal format. ...
+#
+# Not turning off the UTF-8 flag in the string will prevent the string
+# from conversion.
+
+# }}}
+
+# {{{ DecodeMIMEWordsToUTF8
+
+=head2 DecodeMIMEWordsToUTF8 $raw
+
+An utility method which mimics MIME::Words::decode_mimewords, but only
+limited functionality.  This function returns an utf-8 string.
+
+It returns the decoded string, or the original string if it's not
+encoded.  Since the subroutine converts specified string into utf-8
+charset, it should not alter a subject written in English.
+
+Why not use MIME::Words directly?  Because it fails in RT when I
+tried.  Maybe it's ok now.
+
+=cut
+
+sub DecodeMIMEWordsToUTF8 {
+    my $str = shift;
+    DecodeMIMEWordsToEncoding($str, 'utf-8');
+}
+
+sub DecodeMIMEWordsToEncoding {
+    my $str = shift;
+    my $enc = shift;
+
+   
+    @_ = $str =~ m/([^=]*)=\?([^?]+)\?([QqBb])\?([^?]+)\?=([^=]*)/g;
+
+    return ($str) unless (@_);
+
+    $str = "";
+    while (@_) {
+       my ($prefix, $charset, $encoding, $enc_str, $trailing) =
+           (shift, shift, shift, shift, shift);
+
+        $trailing =~ s/\s?\t?$//;               # Observed from Outlook Express
+
+       if ($encoding eq 'Q' or $encoding eq 'q') {
+           use MIME::QuotedPrint;
+           $enc_str =~ tr/_/ /;                # Observed from Outlook Express
+           $enc_str = decode_qp($enc_str);
+       } elsif ($encoding eq 'B' or $encoding eq 'b') {
+           use MIME::Base64;
+           $enc_str = decode_base64($enc_str);
+       } else {
+           $RT::Logger->warning("RT::I18N::DecodeMIMEWordsToCharset got a " .
+                             "strange encoding: $encoding.");
+       }
+
+       # now we have got a decoded subject, try to convert into the encoding
+       unless ($charset eq $enc) {
+           eval { Encode::from_to($enc_str, $charset,  $enc) };
+           if ($@) {
+               $charset = _GuessCharset( $enc_str );
+               Encode::from_to($enc_str, $charset, $enc);
+           }
+       }
+
+       $str .= $prefix . $enc_str . $trailing;
+    }
+
+    return ($str)
+}
+
+# }}}
+
+# {{{ _FindOrGuessCharset
+
+=head2 _FindOrGuessCharset MIME::Entity
+
+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
+
+=cut
+
+sub _FindOrGuessCharset {
+    my $entity = 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/}) {
+       my $body = $entity->bodyhandle or return;
+       return _GuessCharset( $head->as_string . $body->as_string );
+    }
+    else {
+       # potentially binary data -- don't guess the body
+       return _GuessCharset( $head->as_string );
+    }
+}
+
+# }}}
+
+
+# {{{ _GuessCharset
+
+=head2 _GuessCharset STRING
+
+use Encode::Guess to try to figure it out the string's encoding.
+
+=cut
+
+sub _GuessCharset {
+    my $fallback = 'iso-8859-1';
+    my $charset;
+
+    if ( @RT::EmailInputEncodings and eval { require Encode::Guess; 1 } ) {
+       Encode::Guess->set_suspects(@RT::EmailInputEncodings);
+       my $decoder = Encode::Guess->guess( $_[0] );
+
+       if ( ref $decoder ) {
+           $charset = $decoder->name;
+           $RT::Logger->debug("Guessed encoding: $charset");
+           return $charset;
+       }
+       elsif ($decoder =~ /(\S+ or .+)/) {
+           my %matched = map { $_ => 1 } split(/ or /, $1);
+           return 'utf-8' if $matched{'utf8'}; # one and only normalization
+
+           foreach my $suspect (@RT::EmailInputEncodings) {
+               next unless $matched{$suspect};
+               $RT::Logger->debug("Encode::Guess ambiguous ($decoder); using $suspect");
+               $charset = $suspect;
+               last;
+           }
+       }
+       else {
+           $RT::Logger->warning("Encode::Guess failed: $decoder; fallback to $fallback");
+       }
+    }
+    else {
+       $RT::Logger->warning("Cannot Encode::Guess; fallback to $fallback");
+    }
+
+    return($charset || $fallback);
+}
+
+# }}}
+
+# {{{ SetMIMEHeadToEncoding
+
+=head2 SetMIMEHeadToEncoding HEAD OLD_CHARSET NEW_CHARSET
+
+Converts a MIME Head from one encoding to another. This totally violates the RFC.
+We should never need this. But, Surprise!, MUAs are badly broken and do this kind of stuff
+all the time
+
+
+=cut
+
+sub SetMIMEHeadToEncoding {
+    my ( $head, $charset, $enc, $preserve_words ) = ( shift, shift, shift, shift );
+
+    $charset = 'utf-8' if $charset eq 'utf8';
+    $enc     = 'utf-8' if $enc     eq 'utf8';
+
+    return if $charset eq $enc and $preserve_words;
+
+    foreach my $tag ( $head->tags ) {
+        my @values = $head->get_all($tag);
+        $head->delete($tag);
+        foreach my $value (@values) {
+            if ( $charset ne $enc ) {
+
+                eval {
+                    Encode::_utf8_off($value);
+                    Encode::from_to( $value, $charset => $enc );
+                };
+                if ($@) {
+                    $RT::Logger->error( "Encoding error: " . $@
+                                       . " defaulting to ISO-8859-1 -> UTF-8" );
+                    eval { Encode::from_to( $value, 'iso-8859-1' => $enc ) };
+                    if ($@) {
+                        $RT::Logger->crit( "Totally failed to convert to utf-8: " . $@ . " I give up" );
+                    }
+                }
+            }
+            $value = DecodeMIMEWordsToEncoding( $value, $enc ) unless $preserve_words;
+            $head->add( $tag, $value );
+        }
+    }
+
+}
+# }}}
+
+eval "require RT::I18N_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/I18N_Vendor.pm});
+eval "require RT::I18N_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/I18N_Local.pm});
+
+1;  # End of module.
+
diff --git a/rt/lib/RT/I18N/cs.pm b/rt/lib/RT/I18N/cs.pm
new file mode 100644 (file)
index 0000000..36e2bc6
--- /dev/null
@@ -0,0 +1,68 @@
+package RT::I18N::cs;
+
+# # CZECH TRANSLATORS COMMENTS see Locale::Maketext::TPJ13
+# Obecne parametry musi byt docela slozite (v pripade Slavistickych jazyku)
+# typu pocet, slovo, pad a rod 
+#
+#pad 1., rod muzsky:
+#0 krecku
+#1 krecek
+#2..4 krecci
+#5.. krecku (nehodi se zde resit pravidlo mod 1,2,3,4 krom mod 11,12,13,14)
+#
+#0 kabatu
+#1 kabat
+#2..4 kabaty
+#5 kabatu
+#
+# => Vyplati se udelat quant s parametry typu pocet, slovo1, slovo2..4, slovo5 a slovo0
+#
+
+sub quant {
+  my($handle, $num, @forms) = @_;
+
+  return $num if @forms == 0; # what should this mean?
+  return $forms[3] if @forms > 3 and $num == 0; # special zeroth case
+
+  # Normal case:
+  # Note that the formatting of $num is preserved.
+  #return( $handle->numf($num) . ' ' . $handle->numerate($num, @forms) );
+  return( $handle->numerate($num, @forms) );
+   # Most human languages put the number phrase before the qualified phrase.
+}
+
+
+sub numerate {
+ # return this lexical item in a form appropriate to this number
+  my($handle, $num, @forms) = @_;
+  my $s = ($num == 1);
+
+  return '' unless @forms;
+  return
+   $s ? $forms[0] :
+   ( $num > 1 && $num < 5 ) ? $forms[1] :
+   $forms[2];
+}
+
+#--------------------------------------------------------------------------
+
+sub numf {
+  my($handle, $num) = @_[0,1];
+  if($num < 10_000_000_000 and $num > -10_000_000_000 and $num == int($num)) {
+    $num += 0;  # Just use normal integer stringification.
+         # Specifically, don't let %G turn ten million into 1E+007
+  } else {
+    $num = CORE::sprintf("%G", $num);
+     # "CORE::" is there to avoid confusion with the above sub sprintf.
+  }
+  while( $num =~ s/^([-+]?\d+)(\d{3})/$1,$2/s ) {1}  # right from perlfaq5
+   # The initial \d+ gobbles as many digits as it can, and then we
+   #  backtrack so it un-eats the rightmost three, and then we
+   #  insert the comma there.
+
+  $num =~ tr<.,><,.> if ref($handle) and $handle->{'numf_comma'};
+   # This is just a lame hack instead of using Number::Format
+  return $num;
+}
+
+1;
diff --git a/rt/lib/RT/I18N/cs.po b/rt/lib/RT/I18N/cs.po
new file mode 100644 (file)
index 0000000..75f3495
--- /dev/null
@@ -0,0 +1,4496 @@
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 3.0.0\n"
+"POT-Creation-Date: 2002-05-02 11:36+0800\n"
+"PO-Revision-Date: 2003-03-24 03:00+0800\n"
+"Last-Translator: Jan Okrouhly <okrouhly@civ.zcu.cz>\n"
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr "#%1"
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %3.%2.%7 %4:%5:%6"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%1 %2 přidáno"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "- %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 změněno na %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 smazáno"
+
+#: 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"
+msgstr "%1 %2 se vzorem %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 tento požadavek\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "%1. až %2. zobrazený"
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - argument k předání %2"
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - Výstupní stav jde do STDOUT"
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Jaký akční modul chcete použít"
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Jaký podmínkový modul chcete použít"
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Jaký vyhledávací modul chcete použít"
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "ScripAction %1 nahrána"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 přidáno jako hodnota pro %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1 aliasy vyžadují k činnosti TicketId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1 aliasy vyžadují k činnosti TicketId (odesílatel %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr "%1 vypadá jako lokální objekt, ale není v databázi"
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 uživatelem %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 změněno z %2 na %3"
+
+#: lib/RT/Interface/Web.pm:857
+msgid "%1 could not be set to %2."
+msgstr "%1 nemůže být nastaveno na %2."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 nemůže začít transakci (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 nemůže nastavit stav na vyřešen. RT databáze může být nekonzistentní."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "%1 nejdůležitějších požadavků, které vlastním..."
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "%1 nejdůležitějších požadavků, které žádám..."
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 je nástroj zpracující požadavky z vnějšího plánovacího nástroje jako je cron"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 již není %2 této fronty."
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 již není %2 tohoto požadavku."
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 již není hodnotou uživatelské položky %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 není platným identifikátorem fronty."
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 %quant(%1,minuta,minuty,minut,minut)"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 nezobrazeno"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "práva %1"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 provedeno\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "typ %1 neznámý pro $MessageId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "typ %1 neznámý pro %2"
+
+#: lib/RT/Action/ResolveMembers.pm:42
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 vyřeší všechny členy skupiny vyřešeného požadavku."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr "%1 odloží [místní] BÁZI, je-li závislá [či členem] na spjatém požadavku."
+
+#: lib/RT/Transaction_Overlay.pm:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: neudána příloha"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr "%1 B"
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1 kB"
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "%1 je neplatnou hodnotou pro stav"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "%1 je neznámá akce."
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Zatrhněte pro smazání scripu)"
+
+#: 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 "(Zatrhněte pro smazání)"
+
+#: html/Ticket/Create.html:178
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(Zadejte identifikátory či URL požadavku, oddělené mezerami)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(Pro prázdné pole se použije %1)"
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr "(Žádné uživatelské položky)"
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Žádní členové)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "Žádné scripy"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr "(Žádné vzory)"
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Zašle skrytou kopii této aktualizace mezerami oddělenému seznamu e-mail adres. <b>Neovlivňuje</b> příjemce budoucích aktualizací.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Zašle skrytou kopii této aktualizace mezerami oddělenému seznamu e-mail adres. <b>Neovlivňuje</b> příjemce budoucích aktualizací.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Zašle kopii této aktualizace mezerami oddělenému seznamu e-mail adres. Tito lidé <b>budou</b> dostávat budoucí aktualizace.)"
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Zašle kopii této aktualizace mezerami oddělenému seznamu e-mail adres. <b>Nemění</b> příjemce budoucích aktualizací"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Zašle kopii této aktualizace mezerami oddělenému seznamu e-mail adres. <b>Neovlivňuje</b> příjemce budoucích aktualizací.)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Zašle kopii této aktualizace mezerami oddělenému seznamu e-mail adres. Tito lidé <b>budou</b> dostávat budoucí aktualizace.)"
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(prázdná)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr "žádné jméno nebylo vypsáno"
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(bez předmětu)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(bez hodnoty)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(jen jeden požadavek)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr "(očekávájící schválení)"
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr "(jiné očekávající požadavky)"
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(povinné)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr "(nepojmenováno)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr "25 mnou vlastněných nejdůležitějších požadavků..."
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr "25 mnou žádaných nejdůležitějších požadavků..."
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Nový požadavek v\">&nbsp;%1"
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "Prázdný vzor"
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE nenalezeno"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACE mohou být jen vytvářeny nebo rušeny."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Přerušeno k zamezení nežádoucích změn požadavku.\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr "O mně"
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Řízení přístupu"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Akce"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Akce %1 nenalezena"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Akce provedena."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Akce připravena..."
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Přidat AdminCc"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Přidat Cc"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr "Přidat další soubory"
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Přidat Žadatele"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a new a global scrip"
+msgstr "Přidat nový globální scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Přidat scrip k této frontě"
+
+#: html/Admin/Global/Scrip.html:55
+msgid "Add a scrip which will apply to all queues"
+msgstr "Přidat scrip do všech front"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Přidat komentáře či odpovědi k vybraným požadavkům"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Přidat členy"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Přidat nové pozorovatele"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr "PřidatDalšíStav"
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Uživatel přidán do této fronty jako %1"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Uživatel přidán k tomuto požadavku jako %1"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Adresa1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Adresa2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Admin Cc"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr "Administrativní komentář"
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr "Administrativní korespondence"
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Správa/Front"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Správa/Uživatelů"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Správa/Globální konfigurace"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Správa/Skupin"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Správa/Front/Základních údajů"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminAllPersonalGroups"
+msgstr "Spravovat všechny osobní skupiny"
+
+#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:39 html/Ticket/Update.html:50 lib/RT/ACE_Overlay.pm:89
+msgid "AdminCc"
+msgstr "AdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "AdminComment"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "AdminCorrespondence"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr "Spravovat uživatelem definované položky"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr "Spravovat skupinu"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr "Spravovat členství ve skupinách"
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr "Spravovat vlastní osobní skupiny"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr "Spravovat frontu"
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr "Spravovat uživatele"
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Administrativní Cc"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Pokročilé Vyhledávání"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Po"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Stáří"
+
+#: html/Admin/Elements/EditCustomFields:96
+msgid "All Custom Fields"
+msgstr "Všechny uživatelské položky"
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Všechny Fronty"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "Vždy posílá zprávu žadatelům nezávisle na odesílateli"
+
+#: html/Elements/Tabs:58
+msgid "Approval"
+msgstr "Schvalování"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Schválení #%1: $2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Schválení #$1: Poznámky neuloženy kvůli systémové chybě"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Schválení #%1: Poznámky uloženy"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr "Detaily schválení"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr "Schvalovací diagram"
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr "Schválit"
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Poznámky schvalovatele: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "dub"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "Vzestupně"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Přiložit"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Připojit soubor"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "Připojený soubor"
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Příloha '%1' nemůže být nahrána"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Příloha vytvořena"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Jméno souboru přílohy"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Přílohy"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "srp"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "AuthSystem"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "Automatická odpověď"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "Automaticky odpověz žadatelům"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "Automatická odpověď žadatelům"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Chybná PGP signatura: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Chybný identifikátor přílohy. Nelze nalézt přílohu'%1'\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Chybná data v %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Chybné číslo transakce u přílohy. %1 má být %2\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Základní údaje"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Bcc"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Neopomeňte uložit vaše změny"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "Před"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr "Začátek schvalování"
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Prázdný"
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "Uložitelné URL pro toto hledání"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Zkrácené hlavičky"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Hromadná úprava požadavků"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "Nelze měnit systémové uživatele"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr "Může tento uživatel vidět tuto frontu"
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "Uživatelské položce nelze přidat hodnotu beze jména"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "Požadavek nelze svázat se sebou samým"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Nelze sloučit do sloučeného požadavku. To by se vám nemělo nikdy stát."
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "Nelze zadat zároveň zdroj i cíl"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Nelze vytvořit uživatele: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Změna hesla"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "Zašrtnutím odstraníte"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Zatrhněte k odebrání práva"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Potomci"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Město"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr "Vyřešeno"
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Uzavřené požadavky"
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Neznámý příkaz!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Komentovat"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Adresa pro komentáře"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Komentář nezaznamenán"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr "Komentovat požadavky"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr "Komentovat požadavky"
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Poznámky"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Komentář (Neposílá se žadatelům)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Komentář (nepošle se žadatelům)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Poznámky o %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Poznámky o tomto uživateli"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Komentáře přidány"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "Commit v zárodku"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Omezení překladu"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Podmínka"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "Podmínky splněny..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Podmínka nenalezena"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Správa"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Potvrzení"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "Kontaktní informační systém"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Datum kontaktu '%1' nemůže být rozpoznáno"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Obsah"
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr "Korespondence"
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Adresa pro korespondenci"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Korespondence zaznamenána"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Korespondence nebyla zaznamenána"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "Nelze přidat novou hodnotu uživatelské položky požadavku. "
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "Nelze změnit vlastníka. "
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Nelze vytvořit Uživatelskou položku"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Nelze vytvořit skupinu"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Nelze vytvořit vzor: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "Nelze vytvořit požadavek. Nenastavena fronta"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "Nelze vytvořit uživatele"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Nelze nalézt požadavek s identifikátorem %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Nelze nalézt skupinu %1."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Tohoto uživatele nelze nalézt nebo vytvořit"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Nelze naléze tohoto uživatele"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Nelze nalézt uživatele %1."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Nelze načíst skupinu"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Tento uživatel nemůže být %1 této fronty"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Tento uživatel nemůže být %1 tohoto požadavku"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Tento uživatel nemůže být odstraněn jako %1 této fronty"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Tento uživatel nemůže být odstraněn jako %1 tohoto požadavku"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Do skupiny nelze přidat člena"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Nelze vytvořit transakci: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Nelze zjistit co dělat s gpg odpovědí\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Skupinu nelze nalézt\\n"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr "Nemohu nalézt sloupec"
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Tohoto uživatele nelze nalézt"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "Tuto hodnotu nelze nalézt"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Uživatele nelze nalézt\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Z uživatelské databáze nelze načíst %1.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "Konfigurační soubor RT '%1'nelze načíst %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "Scripy nelze načíst."
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Skupinu %1 nelze načíst"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Vazbu nelze načíst"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Frontu nelze načíst"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Frontu %1 nelze načíst"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Scrip nelze načíst"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Vzor nelze načíst"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Uživatele (%1) nelze načíst"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Požadavek '%1' nelze načíst"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "Země"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Vytvořit"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "Vytvořit požadavky"
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Vytvořit uživatelskou položku"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "Vytvoření uživatelské položky pro frontu %1"
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr "Vytvoření uživatelské položky pro všechny front"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Vytvořit novou uživatelskou položku"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "Vytvořit nový globální scrip"
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Vytvořit novou skupinu"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Vytvořit novou vlastní skupinu"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Vytvořit novou frontu"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Vytvořit nový scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Vytvořit nový vzor"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Vytvoření nového požadavku"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Vytvořit nového uživatele"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Vytvořit frontu"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Vytvořit frontu nazvanou"
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Vytvořit požadavek"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Vytvořit scrips pro frontu %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Vytvořit vzor"
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr "Vytvářet požadavky podle toho vzoru scripu"
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "Vytvořit požadavek"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr "Vytvářet požadavky v této frontě"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr "Vytvářet, mazat a měnit uživatelen definované položky"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr "Vytvářet, mazat a měnit fronty"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "Vytvářet, mazat a měnit členy uživatelských osobních skupin"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Vytvářet, mazat a měnit členy osobních skupin"
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr "Vytvářen, mazat a měnit uživatele"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr "Vytvořit požadavek"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Vytvořeno"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "Uživatelská položka %1 vytvořena"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Vzor %1 vytvořen"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Aktuální relace"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Aktuální scripy"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Aktuální členové"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Aktuální práva"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr "Aktuální vyhledávací podmínky"
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Aktuální pozorovatelé"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr "Uživatelská položka #%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"
+msgstr "Uživatelské položky"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Čistící kód uživatelské akce"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Přípravný kód uživatelské akce"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Uživatelská podmínka"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Užitavelská položka %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Uživatelská položka %1 má hodnotu."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Uživatelská položka %1 nemá hodnotu."
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Uživatelská položka %1 nenalezena"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr "Uživatelská položka smazána"
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Uživatelská položka nenalezena"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "Hodnota %1 nemůže být nalezena v uživatelské položce %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Hodnota uživatelské položky změněna z %1 na %2"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "Hodnota uživatelské položky nemůže být smazána"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "Hodnota uživatelské položky nemůže být nalezena"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Hodnota uživatelské položky smazána"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr "Uživatelská položka"
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Datumy"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "pro"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "Implicitní vzor automatické odpovědi"
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "Implicitní vzor automatické odpovědi"
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr "Implicitní vzor administrativního komentáře"
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr "Implicitní vzor administrativní korespondence"
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr "Implicitní korespondenční vzor"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Implicitní transakční vzor"
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Defaulní: %1/%2 změněno z %3 na %4"
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Delegovat práva"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Delegovat specifická práva, která vám byla poskytnuta."
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr "Delegovat práva"
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr "Pověření"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "Smazat"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr "Mazat požadavky"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr "Smazat požadavek"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Smazání tohoto objektu mohlo porušit referenční integritu"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Smazání tohoto objektu by mohlo porušit referenční integritu"
+
+#: lib/RT/User_Overlay.pm:430
+msgid "Deleting this object would violate referential integrity"
+msgstr "Smazání tohoto objektu by mohlo narušit referenční integritu"
+
+#: html/Approvals/Elements/Approve:46
+msgid "Deny"
+msgstr "Zamítnout"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "Je rekvizitou pro"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Závistlosti: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Závisející na"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "Sestupně"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Popište případ níže"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Popis"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Podrobnosti"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Zobrazit"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr "Zobrazit přístupová práva"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr "Zobrazovat scrips vzory pro tuto frontu"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr "Zobrazovat scripy pro tuto frontu"
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Režim zobrazení"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Zobraz požadavek #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr "Dělat cokoli a všechno"
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Neobčerstvovat tuto stránku."
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr "Nezobrazit výsledky hledání"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Stáhnout"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Termín dokončení"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "Datum termínu dokončení '%1' nemůže být rozpoznán"
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "CHYBA: Nelze načíst požadavek '%1': %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Upravit"
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Upravit uživatelské položky pro %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Upravit relace"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "Upravit vzory pro frontu %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "Upravit scprips"
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Úprava systémových vzorů"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Upravit vzory pro %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Úprava konfigurace pro frontu %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Úprava konfigurace pro uživatele %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Úprava uživatelské položky %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Úprava členství ve skupině %1"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Úprava členství ve vlastní skupině %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Úprava vzoru %1"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "Zdroj či cíl musí být zadány"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Email"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "Email adresa je použita"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "Email adresa"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "Kódování emailu"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "Povolena (zrušením zatrhnutí zablokujete tuto uživatelskou položky)"
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "Povolena (zrušením zatrhnutí zablokujete tuto skupinu)"
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Povoleno (zrušení zatrhnutí zablokuje tuto frontu)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr "Povolené uživatelské položky"
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Povolené fronty"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Povolen stav %1"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr "Vyplnit více hodnot"
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr "Vyplnit jednu hodnotu"
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Zadejte požadavky či URI se nimiž požadavky svázat. Oddělte více položek mezerami."
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Chyba"
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Chyba v parametrech do Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Chyba v parametrech do Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Chyba v parametrech do Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Chyba v parametrech do Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Kdokoli"
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Příklad:"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "Identifikátor externí autentizace"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "Identifikátor externího kontaktu"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Doplňkové údaje"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Nepovedlo se nalézt uživatele 'Privilegované' pseudoskupiny."
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Nepovedlo se nalézt uživatele 'Neprivilegované' pseudoskupiny"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Nepovedlo se nahrát modul %1. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "úno"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "Kon"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Koncová priorita"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr "Koncová priorita"
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr "Najít skupiny které"
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Najít nové/otevřené požadavky"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Najít ty, jejichž"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr "Nalézt požadavky"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr "Záverečné schválení"
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "První"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "První stránka"
+
+#: 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:87
+msgid "Force change"
+msgstr "Vynutit změnu"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "Nalezen%quant(%1,,y,o) %numf(%1) %quant(%1,požadavek,požadavky,požadavků)"
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr "Nalezen objekt"
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "Kontaktní údaje ve volné podobě"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr "Volná forma vícenásobně"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr "Volná formu jedinkrát"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "pá"
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Celé hlavičky"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Aktuální uživatel se získává z PGP podpisu\\n"
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "Dán %1"
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Globální"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "Globální Scrips"
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Globální vzor: %1"
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Spusť!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Správný PGP podpis od %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Přejít na stránku"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Přejít na požadavek"
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "Skupina"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Skupina %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Práva skupiny"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "Skupina již má člena"
+
+#: html/Admin/Groups/Modify.html:77
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "Skupina nemůže být založena: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Skupina vytvořena"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr "Skupina nemá takového člena"
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Skupina nenalezena"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Skupina nenalezena.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Skupina neudána.\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Skupiny"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Skupiny nemohou být svými členy"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Ahoj!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Ahoj, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Historie"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "Telefon domů"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Domovská stránka"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "Mám %quant(%1,míchačka,míchačky,míchaček)"
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "I have [quant,_1,concrete mixer]."
+
+#msgstr "Mám [quant,_1,Míchačku na beton,Míchačky na beton,Míchaček na beton]."
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Identifikátor"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identita"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Odmítni původce a zruš stávající schválení, bylo-li zamítnuto schválení"
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Byl-li tento nástroj setgid, místní uživatel jej mohl použit k získaní administrativního přístupu k RT"
+
+#: 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 "Pokud jste změnili cokoli nahoře, nezapomeňte"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr "Neplatná hodnota pro %1"
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr "Neměnitelná položka"
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr "Zahrnout do výpisu blokované uživatelské položky"
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Zahrnout blokované fronty do výpisu."
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Zahrnout blokované uživatele do vyhledávání."
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Počáteční priorita"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr "Počáteční priorita"
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Chyba na vstupu"
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr "Vnitřní chyba"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Vnitřní chyba: %1"
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Neplatný typ skupiny"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr "Neplatné právo"
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr "Neplatná data"
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Neplatný vlastník. Použije se 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Neplatná fronta"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Neplatné právo"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Neplatná hodnota pro %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Neplatná hodnota pro uživatelskou položku"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Neplatná hodnota pro stav"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Je velmi důležité, aby neprivilegovaní uživatelé nemohli spustit tento nástroj."
+
+#: bin/rt-crontool:192
+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 "Pro spuštění tohoto nástroje se doporučuje založení neprivilegovaného UNIX uživatele se správným skupinovým členstvím a přístupem do RT."
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Používá několik parametrů:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Věci očekávající mé schválení"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "led"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr "Přidat se či odebrat z této skupiny"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "čec"
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Maxi"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "čen"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Klíčové slovo"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Jazyk"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Poslední"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Poslední kontakt"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Naposled kontaktován"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr "Naposled upozorněn"
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Naposled aktualizován"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Zbývá"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Umožnit tomuto uživateli přístup k RT"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Umožnit dávat tomuto uživateli práva"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Vlastník omezen na %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Fronta omezena na %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "Vazba již existuje"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "Vazba nemůže být vytvořena"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Vazba vytvořena (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Vazba zrušena (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Vazba nenalezena"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Svázat požadavek #%1"
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Vazby"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Umístění"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Záznamový adresář %1 nenalezen nebo doň nemůže být zapisováno.\\ RT nemůže běžet."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Přihlášen jako %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Přihlásit"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Odhlásit"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Nastavit vlastníka"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Nastavit stav"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Nastavit datum termínu dokončení"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Nastavit datum vyřešení"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Nastavit datum, kdy začal"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Nastavit datum, kdy začne"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Nastavit datum posledního kontaktu"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Nastavit prioritu"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Nastavit frontu"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Nastavit předmět"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Správa skupin a členství v nich"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Správa vlastností a konfigurací platných ve všech frontách"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Správa front a jim příslušných vlastností"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Správa uživatelů a hesel"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "bře"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "kvě"
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Člen přidán"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Člen odebrán"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Člen neodebrán"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Člen"
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Členové"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "Sloučení úspěšné"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Sloučení se nepodařilo. Nelze nastavit EffectiveId"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Sloučit do"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Zpráva"
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr "Chybí primární klíč?: %1"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Mobilní telefon"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "Mobilní telefon"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "Upravovat seznam přístupových práv"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Upravit uživatelskou položku %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "Úprava uživatelských položek pro všechny fronty"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+msgstr "Upravovat vzory scripů této fronty"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "Modify Scrips for this queue"
+msgstr "Upravovat scripů této fronty"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr "Upravovat vzor %1"
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "Upravovat uživatelskou položku pro frontu %1"
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr "Upravovat uživatelskou položku pro všechny fronty"
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Upravovat scrip pro frontu %1"
+
+#: html/Admin/Global/Scrip.html:48
+msgid "Modify a scrip which applies to all queues"
+msgstr "Upravovat scrip platný ve všech frontách"
+
+#: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Upravit datumy pro #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Úprav datumů pro požadavek # %1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Úprava globálních skupinových práv"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Úprava globálních skupinových práv."
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global scrips"
+msgstr "Úprava globálních scrips"
+
+#: html/Admin/Global/UserRights.html:25 html/Admin/Global/UserRights.html:28 html/Admin/Global/index.html:60
+msgid "Modify global user rights"
+msgstr "Úprava globálních uživatelských práv"
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Úprava globálních uživatelských práv."
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr "Upravovat metadata skupiny nebo smazat skupinu"
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Úprava skupinových práv pro %1"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Úprava skupinových práv pro frontu %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr "Upravovat seznam členů pro tuto skupinu"
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr "Upravovat vlastní RT účet"
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Úprava uživatelů fronty %1"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Úprava uživatelů souvisejících s požadavkem #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Úprava scrips pro frontu %1"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Upravovat scripy platné ve všech frontách"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Úprava vzoru %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr "Upravit vzory pro všechny fronty"
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Úprava skupiny %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr "Upravovat pozorovatele fronty"
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Úprava uživatele %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Úprava požadavku # %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Úprava požadavku #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "Upravovat požadavky"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Úprava uživatelských práv pro skupinu %1"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Úprava skupinových práv pro frontu %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Úprava pozorovatelů fronty '%1'"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr "Upravovat seznam přístupových práv"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr "Upravovat členství ve skupině"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr "Upravovat pozorovale fronty"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr "Upravovat scripy"
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr "Upravovat sebe"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr "Upravovat vzor"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr "Upravovat požadavek"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "po"
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Více o %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr "Dát níže"
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr "Dát výše"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Vícenásobná"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "Nutno zadat atribut 'Jméno'"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Mnou schválené"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+msgstr "Mnou schválené"
+
+#: 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"
+msgstr "Jméno"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Jméno je použito"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "Je třeba schválení systémového správce"
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr "Nikdy"
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Nové"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Nové heslo"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Nová probíhající schválení"
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Nové relace"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+msgstr "Nové vyhledávání"
+
+#: 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 "Vytvořit uživatelskou položku"
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr "Založit skupinu"
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Nové heslo"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Oznámení nového hesla zasláno"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr "Vytvoření fronty"
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Nový požadavek"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Nová práva"
+
+#: 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 "Vytovření scripu"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Nové vyhledání"
+
+#: 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 "Vytvořit vzor"
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "Nový požadavek neexistuje"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr "Vytvořit uživatele"
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Nový uživatel jména"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Nový pozorovatel"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Nové nastavení okna"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Další"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Další stránka"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Přezdívka"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Přezdívka"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Žádná uživatelská položka"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Nedefinována žádná skupina"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Nedefinována žádná fronta"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Žádný uživatel RT nenalezen. Prosím poraďte se se správcem RT.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Žádný vzor"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Neudán požadavek. Přerušuje se požadavek "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Neudán požadavek. Přerušují se úpravy požadavku\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr "bez akce"
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr "Neudán sloupec"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Příkaz nenalezen\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Poznámky k tomuto uživateli neudány"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Žádná připojená korespondence"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Pro %1 není popis"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "Neudána skupina"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "Heslo nenastaveno"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "Nedostatek práv k vytváření front"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "Nedostatek práv k vytváření požadavků ve frontě '%1'"
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "Nedostatek práv k vytváření uživatelů"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "Nedostatek práv k zobrazení tohoto požadavku"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "Nedostatek práv k zobrazení aktualizace požadavku"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Nezadán uživatel"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Nevybráni uživatelé."
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Nenalezeny žádné fronty odpovídající vyhledávací podmínce."
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr "Práva nenalezena"
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Nepřidělena žádná práva."
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Bez vyhledání nelze pracovat."
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Neudán identifikátor požadavku"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "Neudán typ transakce"
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Nenalezeni uživatelé odpovídající vyhledávací podmínce"
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Nenalezen platný uživatel RT. Ovladač RT CVS uvolněn. Prosím poraďte se se svým správcem RT.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr "Žádná z hodnot nanastavena na _Set!\\n"
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr "Nikdo"
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr "Neexistující položka"
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr "Nepřihlášen"
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "Nepřihlášen."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Nenastaven"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Zatím neimplementováno."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "Zatím neimplementováno..."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr "Poznámky"
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "Upozornění nemůže být zasláno"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr "Zaslat všem AdminCc"
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr "Zaslat všem AdminCc jako komentář"
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr "Zaslat ostatním příjemcům"
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr "Zaslat ostatním příjemcům jako komentář"
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr "Zaslat vlastníkovi"
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr "Zaslat vlastníkovi jako komentář"
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Zaslat vlastníkům a všem AdminCc nové případy očekávající jejich schválení"
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr "Zaslat žadatelům"
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr "Zaslat žadatelům a všem Cc"
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Zaslat žadatelům a všem Cc jako komentář"
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Zaslat žadatelům, všem Cc a všem AdminCc"
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Zaslat žadatelům, včem Cc a včem AdminCc jako komentář"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "lis"
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "Objekt nemůže být vytvořen"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Objekt vytvořen"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "říj"
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "Dne"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Při komentáři"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "Při korespondenci"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Při založení"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Při změně vlastníka"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Při změně fronty"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Při vyřešení"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Při změně stavu"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Při transakci"
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Zobrazit jen schvalování pro požadavky založené po %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Zobrazit jen schvalování pro požadavky založení před %quant(%1)"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Otevřené"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Otevřít"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Otevřené požadavky"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Otevřít požadavky (ze seznamu) v novém okně"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Otevřít požadavky (ze seznamu) v jiném okně"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr "Otevřít požadavky při korespondenci"
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Řazení a třídění"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organizace"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Původní požadavek: #%1"
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Časem se priorita posouvá k"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr "Vlastnit požadavky"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr "Vlastnit požadavek"
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Vlastník"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr "Vlastník změněn z %1 na %2"
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Vlastník nuceně změněn z %1 na %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "Vlastník"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Pager"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "Číslo pageru"
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Rodiče"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Heslo"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Připomínač hesel"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Heslo příliš krátké"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Heslo: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Uživatelé"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr "Provedení uživatelem definované akce"
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "Přístup nepovolen"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr "Osobní skupiny"
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Vlastní skupiny"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Vlastní skupiny:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Čísla telefonů"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "Zábor místa"
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Nastavení"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Nastavení"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Prepare v zárodku"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Předchozí"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Předchozí stránka"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "Uživatel %1 nenalezen."
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Priorita"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "Priorita začíná na"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Privilegovaný"
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Privilegovaný stav: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Privilegovaní uživatelé"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Pseudo skupina pro vnitřní použití"
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Fronta"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Fronta %1 nenalezena"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Fronta '%1' nenalezena\\n"
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Název fronty"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Scripy fronty"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "Fronta již existuje"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "Fronta nemůže být vytvořena"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "Fronta nemůže být načtena."
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Fronta vytvořena"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr "Není zadána fronta."
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Fronta nenalezena"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Fronty"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 pro %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 od <a href=\"http://bestpractical.com\">Best Practival Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "Správa RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "Autentizační chyba RT."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RT Bounce: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "Konfigurační chyba RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "Kritická chyba RT. Zpráva nezaznamenána!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "Chyba RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT přijal poštu (%1) od sebe samého."
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT Samoobsluha / Uzavřené požadavky"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr "RT v celé své záři"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT vás nemůže autentizovat"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT nemůže nalézt žadatele přes hledání v externí databázi"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT nemůže nalézt frontu: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT nemůže ověřit tento PGP podpis. \\n"
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT pro %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "RT pro %1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT zpracoval vaše příkazy"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT je &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;. Šířeno pod <a href=\"http://www.gnu.org/copyleft/gpl.html\">verzí 2 GNU General Public License.</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT bere tuto zprávu jako bounce"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT zpracuje tuto zprávu tak, jako by byla nepodepsaná.\\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 "Emailový příkazový režim RT vyžaduje PGP autentizaci. Nepodepsal jste vaši zprávu nebo váš podpis nemůže být ověřen."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Skutečné jméno"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "Skutečné jméno"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "Je odkazem z"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Odkazuje na"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Zjemnit"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Zjemnit vyhledání"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Obnovit tuto stránku %quant(%1,každou,každé,každých) %numf(%1) %quant(%1,minutu,minuty,minut)."
+
+#??? quant
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Vztahy"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Odstranit AdminCc"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Odstranit Cc"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Odstranit žadatele"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Odpovědět"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr "Odpovědět na požadavky"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr "Odpovídat na požadavky"
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Žadatel"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Emailová adresa žadatele"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "Žadatel(é)"
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Žadatelé"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Požadavky mají být vyřešeny do"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Vynulovat"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Bydliště"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Vyřešit"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Vyřešení požadavku #%1 (%2)"
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Vyřešen"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Odpověď žadatelům"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Výsledky"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Výsledků na stránku"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Zopakujte heslo"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Nenalezeno právo %1 pro %2 %3 v mezích %4 (%5)"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Právo delegováno"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Práva přidána"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Právo načteno"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Právo nemůže být odebráno"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Právo nenalezeno"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Právo nenačteno."
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Právo odebráno"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Práva"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "Práva pro %1 nemohou být přidělena"
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "Práva nemohou být %1 odebrána"
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Pravidla"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "Kořenový schvalovatel"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "so"
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Uložit změny"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Nezapomeňte uložit změny - "
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "Scrip #%1"
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Scrip vytvořen"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Scrip smazán"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Scripy"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Scripy fro %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Scripy platné ve všech frontách"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Vyhledávání"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Podmínky vyhledávání"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr "Vyhledávání schvalování"
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Zabezpeční:"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr "Vidět frontu"
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Výběr skupiny"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Výběr fronty"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Výběr uživatele"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr "Vybrat uživatelskou položku"
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr "Vybrat skupinu"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr "Vybrat více hodnot"
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr "Vybrat jednu hodnotu"
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+msgstr "Výběr fronty"
+
+#: 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 "Výběr scripu"
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr "Vybrat vzor"
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr "Výběr uživatele"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr "Výběr vícenásobný"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr "Výbět jedinečný"
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Samoobsluha"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr "Zaslat e-mail všem pozorovatelům"
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Zaslat e-mail všem pozorovatelům jako \"komentář\""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr "Zaslat e-mail žadatelům a všem Cc"
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Zaslat e-mail žadatelům a všem Ccs jako komentář"
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr "Posílá zprávu všem žadatelům"
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Posílá e-mail všem přesně vyjmenovaným Cc a Bcc"
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr "Posílá e-mail všem administrativním Cc"
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Posílá e-mail všem administrativním Cc jako komentář"
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr "Posílá e-mail vlastníkovi"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "zář"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Zobrazit výsledky"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr "Zobrazit schválené požadavky"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Zobrazit základní údaje"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Zobrazit odepřené požadavky"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Zobrazit podrobnosti"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Zobrazit trvající požadavky"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "Zobrazit požadavky čekající na jejich schválení"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr "Zobrazovat privátní komentáře požadavku"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr "Zobrazovat výsledky požadavku"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr "Zobrazovat seznam přístupových práv"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr "Zobrazit scripy"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr "Zobrazit vzor"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr "Zobrazit požadavek"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr "Zobrazit komentáře požadavku"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "Být žadatelem či Cc požadavku či fronty"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "Být AdminCc požadavku nebo fronty"
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Podpis"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr "Příhlášen jako %1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Jednoduchá"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr "Přeskočit menu"
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Třídící klíč"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Třídit výsledky dle"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "Třídící pořadí"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Odložené"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Úvodní stránka"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Započato"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "Datum započetí '%1' nemůže být rozpoznáno"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Začíná"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Začíná"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "Datum začínání '%1' nemůže být rozpoznáno"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Stát"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Stav"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr "Změna Stavu"
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Stav změněn z %1 na %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "Změna stavu"
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Vzít"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Vzato %1 "
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Předmět"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Předmět změněn na %1"
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Odeslat"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "Potvrdit model zpracování"
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr "Úspěšné"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "ne"
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr "Super uživatel"
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "Systém"
+
+#: 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 "Systémová chyba"
+
+#: lib/RT/ACE_Overlay.pm:616
+msgid "System error. Right not delegated."
+msgstr "Systémová chyba. Právo nedelegováno."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Systémová chyba. Právo nepřiděleno."
+
+#: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36
+msgid "System groups"
+msgstr "Systémové skupiny"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "Skupina systémovýh pravidel pro vnitřní použití"
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "Míchačka na beton"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Vzít"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Vzatý"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Vzor"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "Vzor #%!"
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr "Vzor smazán"
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Vzor nenalezen"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Vzor nenalezen\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Vzor rozpoznán"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Vzory"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Vzory pro %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr "Toto je již aktuální hodnota"
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Toto není hodnota pro tuto uživatelskou položku"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Toto je shodná hodnota"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Tento uživatel je již v této frontě %1"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Tento uživatel je již u tohoto požadavku %1"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Tento uživatel není v této frontě %1"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Tento uživatel není u tohoto požadavku %1"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Tata fronta neexistuje"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Tento požadavek má nevyřešené závislosti"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Tento uživatel již má toto právo"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Tento uživatel již tento požadavek vlastní"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Tento uživatel neexistuje"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Tento uživatel je již privilegován"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Tento uživatel je již neprivilegován"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Uživatel je nyní privilegován"
+
+#: lib/RT/User_Overlay.pm:344
+msgid "That user is now unprivileged"
+msgstr "Uživatel je nyní neprivilegován"
+
+#: lib/RT/Ticket_Overlay.pm:2944
+msgid "That user may not own tickets in that queue"
+msgstr "V této frontě nemůže tento uživatel vlastnit požadavky"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Toto není číselný identifikátor"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Základní údaje"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr "Cc požadavku"
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr "Administrativní Cc požadavku"
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "Komentář byl zaznamenán"
+
+#: bin/rt-crontool:198
+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 "Následující příkaz najde všechny aktivní požadavky ve frontě 'general' a nastaví jejich priority na 99, pokud nebyly tknuty poslední 4 hodiny:"
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Následující příkazy nebyly zpracovány\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr "Nová hodnota nastavena."
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr "Vlastník požadavku"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr "Žadatel požadavku"
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Tyto komentáře nejsou běžně viditelné uživateli"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Tento požadavek %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Tento nástroj umožňuje uživateli spustit libovolné perl moduly z RT."
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Tato transakce vypadá, že nemá obsah"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "nejdůležitější%quant(%1, požadavek,požadavky,ch požadavků) tohoto uživatele"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "25 nejdůležitějších požadavků tohoto uživatele"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "čt"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr "Požadavek # %1 %2"
+
+#: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "Maxi aktualizace požadavku #%1: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Požadavek #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Požadavek %1 vytvořen ve frontě '%2'"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Požadavek %1 načten\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Požadavek %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Historie požadavku # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Identifikátor požadavku"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr "Požadavek vyřešen"
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Příloha požadavku"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Obsah požadavku"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Typ obsahu požadavku"
+
+#: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr "Požadaven nemůže být vytvořen pro vnitřní chybu"
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Požadavek vytvořen"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Nezdařilo se vytvoření požadavku"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Požadavek smazán"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+msgid "Ticket id not found"
+msgstr "Id požadavku nenalezeno"
+
+#: html/REST/1.0/modify:36 html/REST/1.0/update:41
+msgid "Ticket not found"
+msgstr "Požadavek nenalezen"
+
+#: etc/initialdata:289
+msgid "Ticket status changed"
+msgstr "Stav požadavku změněn"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Pozorovatelé požadavku"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr "Požadavky"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "Požadavky %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Požadavky %1 dle %2"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Požadavky z %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "Požadavky, které záleží na tomto schválení:"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Zbývající čas"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Čas práce"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Zbývající čas"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Čas k zobrazení"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Čas práce"
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr "Čas práce"
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Vytvořit diff tohoto commitu:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "Vytvořit diff tohoto commitu:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Poslední kontakt"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transakce"
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Transakce %1 vymazána"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transakce vytvořena"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Bez udání id požadavku nelze volat Transaction->Create"
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Transakce jsou neměnné"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Pokus o smazání práva: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "út"
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "typ"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Neimplementováno"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Unixový login"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "Unixové uživatelské jméno"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Neznámé kódování obsahu %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Neomezeně"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "Neprivilegovaný"
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "Vrácen"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Aktualizace"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Identifikátor aktualizace"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Typ aktualizace"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Aktualizovat společně všechny tyty požadavky"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Aktualizovat email"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Aktualizovat jméno"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Aktualizace nezaznamenána"
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Aktualizovat vybrané požadavky"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Aktualizace podpisu"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Aktualizace požadavku"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Aktualizace požadavku # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Aktualizace požadavku #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Aktualizace požadavku #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "Typ aktualizace nebyl ani korespondence ani komentář."
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Aktualizováno"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Uživatel %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Heslo uživatele %1: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Uživatel '%1' nenalezen"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Uživatel '%1' nenalezen\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr "Uživatelem definované"
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "Identifikátor uživatele"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Identifikátor uživatele"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Práva uživatele"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Uživatel nemůže být vytvořen: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Uživatel vytvořen"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Uživatelem definované skupiny"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Uživatel upozorněn"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Uživatelský pohled"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Uživatelské jméno"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Uživatelé"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Uživatelé odpovídající podmínce vyhledání"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "Hodnota fronty"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Hodnoty"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr "Být pozorovatelem"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr "Být AdminCc pozorovatelem"
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Pozorovatelé"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "Kódování WWW"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "st"
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Přidat korespondenci k původnímu požadavku, pokud byl požadavek schválen všemi"
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Přidat korespondenci k původnímu požadavku, pokud byl požadavek kýmkoli schválen"
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Když je požadavek vytvořen"
+
+#: 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 "Upozornit vlastníka a všechny AdminCc, jejichž schválení se očekává, při vytvoření schvalovaného požadavku"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Stane-li se cokoli"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Je-li vyřešen požadavek"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Změní-li se vlastník požadavku"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Změní-li se fronta požadavku"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Změní-li se stav požadavku"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Splní-li se uživatelská podmínka"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Přijde-li komentář"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Přijde-li korespondence"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Zaměstnání"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "Telefon do zaměstnání"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Odpracováno"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "Požadavek již vlastníte"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "Nejste autorizovaný uživatel"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Můžete přidělit pouze požadavky, které jsou vaše nebo nejsou vlastněny"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "Nemáte právo k zobrazení tohoto požadavku.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "Nalezl jste %1 požadavků ve frontě %2"
+
+#??? quant
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "Byl jste odhlášen od RT."
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "V této frontě nemáte práva vytvářet požadavky."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "V této frontě nemůžete vytvářet požadavky."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "Jste vítáni k dalšímu přihlášení"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Vašich %1 požadavků"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "Váš správce RT chybně nastavil poštovní aliasy, které volají 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 "Váš požadavek byl schválen uživatelem %1. Další schválení mohou být ještě očekávána."
+
+#: etc/initialdata:463 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Váš požadavek byl schválen."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "Váš požadavek byl odmítnut"
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Váš požadavek byl odmítnut."
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Vaše uživatelské jméno či heslo je nesprávné"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "PSČ"
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "jak je dovoleno %1"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "obsahuje"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "obsah"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "typ obsahu"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "korespondence (zřejmě) neposlána"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "korespondence poslána"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "dnů"
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "smazat"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "smazán"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "neodpovídá"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "neobsahuje"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "je rovno"
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "název souboru"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "větší než"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "skupina '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "hodin"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "Identifikátor"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "je"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "není"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "menší než"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "odpovídá"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "minut"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "úpravy\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "měsíců"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "nový"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr "znehodnotit"
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "žádný"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "není rovno"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "otevřený"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "vlastní skupina '%1' pro uživatele '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "fronta %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "zamítnutý"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "vyřešený"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "sek"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "odložený"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "systém %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "systémová skupina '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "volající komponenta neudala důvod"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "požadavek #%1 %2"
+
+#: lib/RT/Group_Overlay.pm:216
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "nepopsaná skupina %1"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr "nepopsaná skupina %1"
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "uživatel %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "týdnů"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "se vzorem %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "roků"
+
diff --git a/rt/lib/RT/I18N/de.po b/rt/lib/RT/I18N/de.po
new file mode 100644 (file)
index 0000000..3595aad
--- /dev/null
@@ -0,0 +1,4500 @@
+# German localization catalog for Request Tracker (RT)
+# FIRST AUTHOR: Florian Bischof <flo@fxb.de>, May 2002
+#
+msgid ""
+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 <flo@fxb.de>\n"
+"Language-Team: RT German <rt@fxb.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr ""
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %3. %2 %7, %4:%5:%6"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%1 %2 hinzugefügt"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "vor %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 geändert in %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 gelöscht"
+
+#: 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"
+msgstr "%1 %2 mit der Vorlage %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 dieses Ticket\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "%1 - %2 angezeigt"
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - ein Argument zur Übergabe an %2"
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr ""
+
+#msgstr "%1 - Schreibe Statusupdates nach STDOUT"
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Gebe an, welches Action-Modul benutzt werden soll"
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Gebe an, welches Condition-Modul benutzt werden soll"
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Gebe an, welches Search-Modul benutzt werden soll"
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "ScripAction %1 geladen"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 als Wert für %2 hinzugefügt"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr ""
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr "%1 konnte nicht in der Datenbank gefunden werden obwohl es ein lokales Objekt zu sein scheint"
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "am %1 von %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 von %2 in %3 geändert"
+
+#: lib/RT/Interface/Web.pm:857
+msgid "%1 could not be set to %2."
+msgstr "%1 konnte nicht auf %2 gesetzt werden."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 konnte den Status nicht auf erledigt setzen. Die RT-Datenbank könnte inkonsistent sein."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "%1 mir zugewiesene Anfragen mit höchster Priorität..."
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "Die %1 von mir ausgelösten Anfragen mit höchster Priorität"
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 ist ein Werkzeug um Anfragen über externe Terminierungstools wie \"cron\" zu verarbeiten"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+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."
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 ist kein Wert des benutzerdefinierten Feldes %2 mehr"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 ist keine gültige Stapel-Id."
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 Min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1 Rechte"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr ""
+
+#: lib/RT/Action/ResolveMembers.pm:42
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 wird alle Mitglieder eines erledigten Gruppentickets erledigen."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: kein Anhang angegeben"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr "%1b"
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k"
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' ist ein ungültiger Wert für Status"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Markieren um Scrip zu löschen)"
+
+#: 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 "(Markieren um zu löschen)"
+
+#: html/Ticket/Create.html:178
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(Gib Anfragenummern oder URLs getrennt durch Leerzeichen ein)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(Bei Freilassen %1"
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr "(Keine benutzerdefinierten Felder)"
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Keine Mitglieder)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Keine Scrips)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr "(Keine Vorlagen)"
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Schickt eine Blindkopie dieser Aktualisierung an eine durch Komma getrennte Liste von E-Mail-Adressen. Ändert <b>nicht</b> wer künftig Aktualisierungen geschickt bekommt.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+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 <b>will</b> receive future updates.)"
+msgstr "(Schickt eine Kopie dieser Aktualisierung an eine durch Komma getrennte Liste von administrativen E-Mail-Adressen. Diese <b>werden</b> künftig Aktualisierungen erhalten.)"
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Schickt eine Kopie dieser Aktualisierung an eine durch Komma getrennte Liste von E-Mail-Adressen. Ändert <b>nicht</b> wer künftig Aktualisierungen geschickt bekommt.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr ""
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Schickt eine Kopie dieser Aktualisierung an eine durch Komma getrennte Liste von E-Mail-Adressen. Diese <b>werden</b> künftig Aktualisierungen erhalten.)"
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(leer)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr ""
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(kein Betreff)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(keine Angabe)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(nur eine Anfrage)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr "(wartet auf Freigabe)"
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr "(wartet auf andere Anfragen)"
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(notwendig)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr "(unbenannt)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr ""
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Neue Anfrage in\">&nbsp;%1"
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "Eine leere Vorlage"
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE nicht gefunden"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACEs können nur erstellt und gelöscht werden."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Breche ab um ungewünschte Veränderungen an der Anfrage zu verhindern.\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr "Über mich"
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Zugriffskontrolle"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Aktion"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Aktion %1 nicht gefunden"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Aktion durchgeführt."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Aktion vorbereitet..."
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "AdminCC hinzufügen"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "CC hinzufügen"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr "Mehr Dateien anhängen"
+msgstr "Weitere Dateien anhängen"
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Klient hinzufügen"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a new a global scrip"
+msgstr "Erstelle ein neues globales Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Erstelle ein Scrip für diesen Stapel"
+
+#: html/Admin/Global/Scrip.html:55
+msgid "Add a scrip which will apply to all queues"
+msgstr "Scrip erstellen, das auf alle Stapel angewendet wird"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Füge den ausgewählten Anfragen Kommentare oder Antworten hinzu"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Mitglieder hinzufügen"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Neue Beobachter hinzufügen"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Habe einen Hauptverantwortlichen als %1 für diesen Stapel hinzugefügt"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Habe einen Hauptverantwortlichen als %1 für diese Anfrage hinzugefügt"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Adresse 1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Adresse 2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Admin CC"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr "Admin Kommentar"
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr "Admin Korrespondenz"
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Admin Stapel"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr ""
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Admin/Globale Einstellungen"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr ""
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Admin/Stapel/Basics"
+
+#: 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 ""
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr ""
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Administrative CC"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Erweiterte Suche"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Nach dem"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Alter"
+
+#: html/Admin/Elements/EditCustomFields:96
+msgid "All Custom Fields"
+msgstr "Alle benutzerdefinierten Felder"
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Alle Stapel"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr ""
+
+#: html/Elements/Tabs:58
+msgid "Approval"
+msgstr "Freigabe"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Freigabe #%1: %2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Freigabe #%1: Notiz wurde aufgrund eines Systemfehlers nicht vermerkt"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Freigabe #%1: Notiz vermerkt"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr "Freigeben"
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Notizen des Freigebenden: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Apr"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "aufsteigend"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Anhängen"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Datei anhängen"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "Dateianhang"
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Anhang '%1' konnte nicht geladen werden"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Anhang erstellt"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Dateiname des Anhangs"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Anhänge"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Aug"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "AuthSystem"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "Autoreply"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "Autoreply an Klienten"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Fehlerhafte PGP-Signatur: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Fehlerhafte Anhangs-Id. Konnte Anhang '%1' nicht finden\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Fehlerhafte Daten in %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Fehlerhafte Transaktionsnummer für den Anhang. %1 solle %2 sein\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Grundlagen"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "BCC"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Denke daran, Deine Änderungen zu speichern"
+
+### wieder - Duzen???
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "vor dem"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr ""
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Leer"
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "Speicherbare URL für diese Suche"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Kurze Kopfzeilen"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Massen Ticketupdate"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "Kann Systembenutzer nicht ändern"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr "Kann dieser Hauptverantwortliche diesen Stapel sehen"
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "Kann kein benutzerdefiniertes Feld ohne Namen hinzufügen"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+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"
+
+#: 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"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Kann Benutzer nicht anlegen: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "CC"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Passwort ändern"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "Zum Löschen ankreuzen"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Zum Entziehen einer Berechtigung ankreuzen"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Kinder"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Stadt"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr "Geschlossen"
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Geschossene Tickets"
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Kommentar"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Kommentaradresse"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr "Kommentiere Tickets"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Kommantare"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Kommentar (wird nicht an Klienten geschickt)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Kommentar (wird nicht an Klienten geschickt)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Kommentar über %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Kommentar zu diesen Benutzer"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Kommentar hinzugefügt"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "Übergabe abgehakt"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Bedingung"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "Condition trifft zu..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Bedingung nicht gefunden"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Bestätigen"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr ""
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Inhalt"
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr "Korrespondenz"
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Korrespondenzadresse"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Korrespondenz hinzugefügt"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "Konnte dem Ticket kein neues benutzerdefiniertes Feld hinzufügen. "
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "Konnte den Inhaber nicht ändern. "
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Konnte benutzerdefiniertes Feld nicht anlegen"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Konnte Gruppe nicht anlegen"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Konnte Vorlage nicht anlegen: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "Konnte Ticket nicht anlegen. Stapel nicht bestimmt"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "Konnte Benutzer nicht anlegen"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Konnte diesen Benutzer nicht finden oder anlegen"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Konnte diesen Hauptverantwortlichen nicht finden"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr ""
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Konnte die Gruppe nicht laden"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Konnte den Hauptverantwortlichen nicht zu einen %1 dieses Stapels machen"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Konnte diesen Hauptverantwortlichen nicht zu einem %1 dieses Tickets machen"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Konnte diesen Hauptverantwortlichen nicht als %1 dieses Stapels entfernen"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Konnte diesen Hauptverantwortlichen nicht als %1 dieses Tickets entfernen"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Konnte Mitglied nicht der Gruppe hinzufügen"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Konnte die Transaktion nicht anlegen: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr "Konne Zeile nicht finden"
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Konnte diesen Hauptverantwortlichen nicht finden"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "Konnte diesen Wert nicht finden"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr ""
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Konnte %1 nicht aus der Benutzerdatenbank laden.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Konnte Gruppe %1 nicht laden"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Konnte den Verweis nicht laden"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Konnte den Stapel nicht laden"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Konnte den Stapel %1 nicht laden"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Konnte diesen Benutzer nicht laden (%1)"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Konnte das Ticket '%1' nicht laden"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "Land"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Erstellen"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "Erstelle Tickets"
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Erstelle ein benutzerdefiniertes Feld"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "Erstelle ein benutzerdef. Feld für Stapel %1"
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr "Erstelle ein benutzerdef. Feld für alle Stapel"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Erstelle eine neue Gruppe"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Erstelle eine neue persönliche Gruppe"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr ""
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Erstelle ein neues Ticket"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Erstelle einen neuen Benutzer"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Erstelle einen Stapel"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr ""
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Erstelle ein Ticket"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Erstelle ein Scrip für den Stapel %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Erstelle eine Vorlage"
+
+#: 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"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr "Erstelle Tickets in diesem Stapel"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr "Erstellen, löschen und modifizieren von benutzerdef. Felder"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr "Erstelle, lösche und modifiziere Stapel"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Erstellen, löschen und modifizieren von Mitgliedern persönlicher Gruppen"
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr "Erstellen, löschen und modifizieren von Benutzern"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr ""
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Angelegt"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "Erstelle ein benutzerdefiniertes Feld %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Momentane Beziehungen"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Aktuelle Scrips"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Aktuelle Mitglieder"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Aktuelle Rechte"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr "Aktuelle Suchkriterien"
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Aktuelle Beobachter"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr "Benutzerdef. Feld #%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"
+msgstr "Benutzerdef. Felder"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Benutzerdefinierter Action-Cleanup-Code"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Benutzerdefinierter Aktions-Vorbereitungs-Code"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Benutzerdefinierte Bedingung"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Benutzerdefiniertes Feld %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Benutzerdefiniertes Feld %1 hat einen Wert."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Benutzerdefiniertes Feld %1 hat keinen Wert."
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Benutzerdefiniertes Feld %1 nicht gefunden"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr "Benutzerdefiniertes Feld wurde gelöscht"
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Benutzerdefiniertes Feld nicht gefunden"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "Wert %1 des benutzerdefinierten Feldes %2 konnte nicht gefunden werden"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "Wert des benutzerdefinierten Felds konnte nicht gelöscht werden"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "Wert des benutzerdefinierten Feldes konnte nicht gefunden werden"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Wert des benutzerdefinierten Feldes gelöscht"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr ""
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Datumsangaben"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Dez"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr ""
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "Standard Autoresponse-Vorlage"
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr "Standard Admin-Kommentar-Vorlage"
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr "Standard Admin-Korrespondenz-Vorlage"
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr "Standard Korrespondenz-Vorlage"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Standard Transaktions-Vorlage"
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Standard: %1/%2 von \"%3\" in \"%4\" geändert."
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Rechte weitergeben"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Dir gewährte Rechte weitergeben"
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr ""
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr "Rechteweitergabe"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr "Lösche Tickets"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Löschen dieses Objektes kann die referenzielle Integrität gefährden"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Löschen dieses Objektes würde die referenzielle Integrität gefährden"
+
+#: lib/RT/User_Overlay.pm:430
+msgid "Deleting this object would violate referential integrity"
+msgstr "Löschen dieses Objektes würde die referenzielle Integrität verletzen"
+
+#: html/Approvals/Elements/Approve:46
+msgid "Deny"
+msgstr "Ablehnen"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "Abhängig gemacht von"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr ""
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Abhängig von"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "absteigend"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Beschreibe hier das Problem"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Beschreibung"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Details"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Anzeigen"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr "Zeige Zugriffskontrollliste an"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr "Zeige Scrip-Vorlagen für diesen Stapel"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr "Zeige Scrips für diesen Stapel"
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Anzeigemodus"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Zeige Ticket #%1 an"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr "Mache irgend etwas und alles"
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Seite nicht aktualisieren."
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr "Suchergebnisse nicht anzeigen"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Download"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Fällig"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr ""
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "FEHLER: Konnte Ticket '%1' nicht laden: %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr ""
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Bearbeite benutzerdefinierte Felder für %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Bearbeite Beziehungen"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "Bearbeite Vorlagen für Stapel %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr ""
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Bearbeite Systemvorlagen"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Bearbeite Konfiguration für den Stapel %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Bearbeite Konfiguration für Benutzer %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Bearbeite benutzerdefiniertes Feld %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Bearbeite Mitgliedschaft für die Gruppe %1"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Bearbeite Mitgliedschaft der persönlichen Gruppe %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "Es muß entweder eine Basis oder ein Ziel angegeben werden"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "E-Mail"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "E-Mail-Adresse bereits in Gebrauch"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "E-Mail-Adresse"
+
+### muss das überhaupt übersetzt werden???
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "E-Mail-Kodierung"
+
+### muss das überhaupt übersetzt werden???
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "Aktiviert (Abwählen deaktiviert dieses benutzerdef. Feld)"
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "Aktiviert (Abwählen deaktiviert diese Gruppe)"
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Aktiviert (Abwählen deaktiviert diesen Stapel)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr "Aktivierte benutzerdefinierte Felder"
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Aktivierte Stapel"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Status %1 aktiviert"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr "Mehrere Werte eingeben"
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr "Einen Wert eingeben"
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Ticketnummern oder URIs getrennt durch Leerzeichen eingeben."
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Fehler"
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Fehler in den Parameter für Queue-AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Fehler in den Paramter für Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Fehler in den Parameter für Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Fehler in den Parameter für Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Everyone"
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Beispiel:"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "ExternalAuthId"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "ExternalContactInfoId"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Zusatzinformationen"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Konnte die Pseudogruppe 'Privileged' nicht finden."
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Failed to find 'Unprivileged' users pseudogroup"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Konnte Modul %1 nicht laden. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Feb"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr ""
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Endpriorität"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr ""
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr "Finde Gruppe wessen"
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Finde neue/offene Tickets"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Finde Leute deren"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr "Anfragen suchen"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Erste"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Erste Seite"
+
+#: 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:87
+msgid "Force change"
+msgstr "erzwinge Änderung"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "%quant(%1,ticket) gefunden"
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr "Objekt gefunden"
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "FreeformContactInfo"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr "FreieMehrfachauswahl"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr "FreieEinzelauswahl"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Fr"
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Alle Kopfzeilen"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "An %1 gegeben"
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Global"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr ""
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Globale Vorlage: %1"
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Los!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr ""
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Gehe zu Seite"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Zeig' Ticket"
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "Gruppe"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Gruppenrechte"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "Gruppe hat bereits Mitglieder"
+
+#: html/Admin/Groups/Modify.html:77
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "Gruppe konnte nicht erstellt werden: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Gruppe angelegt"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr "Gruppe hat kein solches Mitglied"
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Gruppe nicht gefunden"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr ""
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Gruppen"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Gruppen können nicht Mitglied eines ihrer Mitglieder sein"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Hallo!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Hallo %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Historie"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "TelefonZuhause"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Start"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Nr."
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identität"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Wenn eine Freigabe abgewiesen wird, weise das Original ab und lösche wartende Freigaben"
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Wenn dieses Werkzeug 'setgid' wäre könnte ein feindlicher lokaler Benutzer dadurch administrativen Zugriff auf RT erlangen."
+
+#: 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"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr "Unerlaubter Wert für %1"
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr "Unveränderbares Feld"
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr "Zeige auch deaktivierte benutzerdefinierte Felder an."
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Zeige auch deaktivierte Stapel an."
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Zeige deaktivierte Benutzer auch in der Suche an."
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Anfängliche Priorität"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Eingabefehler"
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr "Interner Fehler"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Internet Fehler: %1"
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Ungültige Gruppenart"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr "Ungültiges Recht"
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr "Ungültige Daten"
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Ungültiger Inhaber. Zurücksetzung auf 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Ungültiger Stapel"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Ungültiges Recht"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Ungültiger Wert für %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Ungültiger Wert für das benutzerdefinierte Feld"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Ungültiger Statuswert"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Es ist sehr wichtig dass nichtprivilegierte Benutzer dieses Werkzeug nicht aufrufen können."
+
+#: bin/rt-crontool:192
+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 "Es wird empfohlen einen nichtprivilegierten Unix-User mit korrekter Gruppenzugehörigkeit zum Zugriff auf RT anzulegen um dieses Werkzeug aufzurufen."
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Es verarbeitet verschiedene Parameter:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr ""
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Jan"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr "Betrete oder verlasse diese Gruppe"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Jul"
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Alles"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Jun"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Sprache"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "letzter Kontakt"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Letzter Kontakt"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Zuletzt Kontaktiert"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr "Letzte Änderung"
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Zuletzt Aktualisiert"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Diesen Benutzer RT-Zugriff gewähren"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Diesen Benutzer mehr Rechte gewähren"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "Beziehung existiert bereits"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "Beziehung konnte nicht erstellt werden"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Beziehung erstellt (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Beziehung gelöscht (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Beziehung nicht gefunden"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Verweise auf Ticket #%1"
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Beziehungen"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Adresse"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Log-Verzeichnis %1 nicht gefunden oder kein Schreibzugriff.\\n RT kann nicht starten."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Angemeldet als %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Anmelden"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Abmelden"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Mach Inhaber"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Mach Status"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Mach Fälligkeitsdatum"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Mach Erledigungsdatum"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Mach Datum gestartet"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Mach Startdatum"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Mach Eingangsdatum"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Mach Priorität"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Mach Stapel"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Betreff setzen"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Gruppen und Gruppenmitglieder verwalten"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Eigenschaften und Einstellungen für alle Stapel verwalten"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Stapel und stapelspezifische Einstellungen verwalten"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Benutzer und Passworte verwalten"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Mär"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "Mai."
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Mitglied hinzugefügt"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Mitglied gelöscht"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Mitglied nicht gelöscht"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Mitglied von"
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Mitglieder"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "Zusammenführung erfolgreich"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Zusammenführung fehlgeschlagen. Konnte EffectiveId nicht setztn"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Zusammenführen in"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Nachricht"
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr "%1: Fehlt ein Primärschlüssel?"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Mobil"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "Mobiltelefon"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "Ändere Zugriffskontrollliste"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr ""
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "Ändere benutzdefinierte Felder für diesen Stapel"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+msgstr "Ändere Scrip-Vorlagen für diesen Stapel"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "Modify Scrips for this queue"
+msgstr "Ändere Scrips für diesen Stapel"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr ""
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "Ändere ein benutzerdefiniertes Feld für Stapel %1"
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr "Ändere ein globales benutzerdefiniertes Feld"
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Ändere ein Scrip für den Stapel %1"
+
+#: html/Admin/Global/Scrip.html:48
+msgid "Modify a scrip which applies to all queues"
+msgstr "Ändere ein globales benutzerdefiniertes Feld"
+
+#: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Ändere Datumsangaben für #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Ändere Datumsangaben für Ticket #%1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Ändere globale Gruppenrechte"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Ändere globale Gruppenrechte."
+
+#: 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 "Ändere globale Benutzerrechte"
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Ändere globale Benutzerrechte."
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr "Ändere Gruppen-Metadaten oder lösche die Gruppe"
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Ändere die Gruppenrechte der Gruppe %1"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Ändere Gruppenrechte für Stapel %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr "Ändere Mitgliedsverzeichnis dieser Gruppe"
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr "Ändere jemandens eigenen RT-Zugang"
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Ändere Leute bezogen auf Stapel %1"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Ändere Personen des Tickets #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Ändere Scrips für den Stapel %1"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Ändere auf alle Stapel angewandte Scrips"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Ändere Vorlage %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr "Ändere globale Templates"
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Ändere Gruppe %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr "Ändere die Stapelbeobachter"
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Ändere Benutzer %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Ändere Ticket #%1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Ändere Ticket #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "Ändere Tickets"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Ändere Benutzerrechte für die Gruppe %1"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Ändere Benutzerrechte für Stapel %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr ""
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Mo"
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Mehr über %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr "Runter verschieben"
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr "Hoch verschieben"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Mehrere"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "Du musst eine Angabe bei 'Name' machen"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr ""
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+msgstr "Meine Freigaben"
+
+#: 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"
+msgstr "Name"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Benutzername ist bereits in Gebrauch"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr "Niemals"
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Neu"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Neues Passwort"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Neue wartende Freigaben"
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Neue Beziehungen"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+msgstr "Neue Suche"
+
+#: 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 "Neues benutzerdef. Feld"
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr "Neue Gruppe"
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Neues Passwort"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Neue Passworterinnerung wurde verschickt"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr "Neuer Stapel"
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Neues Ticket"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Neue Rechte"
+
+#: 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 "Neues Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+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 "Neue Vorlage"
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "Neues Ticket existiert nicht"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr "Neuer Benutzer"
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Neues Benutzer aufgerufen"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Neue Beobachter"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Speichere Fenstereinstellungen"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Nächste"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Nächste Seite"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Spitzname"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Spitzname"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Kein benutzerdefiniertes Feld"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Keine Gruppe definiert"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Kein Stapel vorhanden"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Kein RT-Benutzer gefunden. Bitte kontaktiere Deinen RT-Administrator.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Keine Vorlage"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Kein Ticket angegeben. Bereche Ticket ab "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr "Keine Aktion"
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr "Keine Spalte angegeben"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr ""
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Kein Kommentar über diesen Benutzer angegeben"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Keine Korrespondenz aufgezeichnet"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Keine Beschreibung für %1 vorhanden"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "Keine Gruppe angegeben"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "Kein Passwort gesetzt"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "Kein Recht Stapel anzulegen"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "Kein Recht um Tickets im Stapel '%1' anzulegen"
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "Kein Recht Benutzer anzulegen"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "Kein Recht dieses Ticket anzuzeigen"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "Kein Recht dieses Ticket zu aktualisieren"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Kein Hauptverantwortlicher angegeben"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Keine Hauptverantwortliche ausgewählt."
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Keine den Suchkriterien entsprechenden Stapel gefunden"
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr "Keine Rechte gefunden"
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Keine Rechte gewährt."
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Keine Suchliste zum bearbeiten."
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "Kein Transaktionstyp angegeben"
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Keine auf die Suchkriterien passende Benutzer gefunden"
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Kein gültiger RT-Benutzer gefunden. RT CVS-Handler weggefallen. Bitte kontaktiere Deinen RT-Administrator.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr "Kein Wert an _Set geschickt!\\n"
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr "Niemand"
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr "Nichtexistierendes Feld?"
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr "Nicht angemeldet"
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "Nicht angemeldet."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Nicht angegeben"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Noch nicht implementiert."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "Noch nicht implementiert..."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr "Bemerkungen"
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "Benachrichtigung konnte nicht verschickt werden"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr "Benachrichtige AdminCCs"
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr "Benachrichtige AdminCCs als Kommentar"
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr "Benachrichtige andere Empfänger"
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr "Benachrichtige andere Empfänger als Kommentar"
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr "Benachrichte Inhaber"
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr "Benachrichtige Inhaber als Kommentar"
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Benachrichtige Inhaber und AdminCCs neuer auf Freigabe wartende Anfragen"
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr "Benachrichtige die Klienten"
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr "Benachrichtige die Klienten und CCs"
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Benachrichtige die Klienten und CCs als Kommentar"
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Benachrichtige die Klienten, CCs und AdminCCs"
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Benachrichtige die Klienten, CCs und AdminCCs als Kommentar"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Nov"
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "Objekt konnte nicht erstellt werden"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Objekt erstellt"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Okt"
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "am"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Bei Kommentar"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "Bei Korrespondenz"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Bei Erstellen"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Bei Eigentümerwechsel"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Bei Stapelwechsel"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Beim Erledigen"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Bei Statuswechsel"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Bei einer Transaktion"
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Zeige nur Freigaben für nach dem %1 erstelle Anfragen"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Zeige nur Freigaben für vor dem %1 erstellte Anfragen"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Offen"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Öffnen"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Offene Anfragen"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Öffne Anfragen (aus der Liste) in neuem Fenster"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Öffne Anfragen (aus der Liste) in ein anderes Fenster"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr "Öffne Anfragen bei Korrespondenz"
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Sortierung und Reihenfolge"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organisation"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Ursprüngliche Anfrage: #%1"
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Mit der Zeit steigt die Priorität auf"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr "Eigene Anfrage"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr ""
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Inhaber"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr "Inhaberwechsel von %1 zu %2"
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Inhaber mit Gewalt von %1 in %2 geändert"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "Inhaber ist"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Pager"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "PagerTelefon"
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Eltern"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Passwort"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Passworterinnerung"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Passwort ist zu kurz"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Passwort: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Personen"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr "Führe eine benutzerdefinierte Aktion aus"
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "Zugriff verweigert"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr "Persönliche Gruppen"
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Persönliche Gruppen"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Persönliche Gruppen:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Telefonnummern"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "Platzhalter"
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Voreinstellungen"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr ""
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Vorbereitung abgehakt"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Vorherige"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Vorherige Seite"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "Hauptverantwortlichen %1 nicht gefunden."
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Priorität"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "Priorität beginnt bei"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Privilegiert"
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Privilegierungsstatus: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Privilegierte Benutzer"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Pseudogruppe für internen Gebrauch"
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Stapel"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Stapel %2 nicht gefunden"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Name des Stapels"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "Stapel existiert bereits"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "Stapel konne nicht angelegt werden"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "Stapel konnte nicht geladen werden"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Stapel angelegt"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr ""
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Stapel nicht gefunden"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Stapel"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 für %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 von <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr ""
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "RT Administration"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr ""
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "RT Fehler"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr ""
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT Selbstbedienung / Geschlossene Anfragen"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr "RT auf einen Blick"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr ""
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT für %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT hat Deine Befehle verarbeitet"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  Vertrieben unter der <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr ""
+
+#: 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 ""
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Realer Name"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "RealerName"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "Bezogen von"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Bezieht sich auf"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Suche Verfeinen"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Seite alle %1 Minuten aktualisieren."
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Beziehungen"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Entferne AdminCC"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Entferne CC"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Entferne Klient"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Antworten"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr "Antworte auf Anfragen"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr ""
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Klient"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "email-Adresse des Klienten"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr ""
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Klienten"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Anfragen sollten erlegt werden in"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Zuhause"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Erledigen"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Erledige Anfrage Nr. %1 (%2)"
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Erledigt"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Antwort an alle Klienten"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Ergebnisse"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Ergebnisse pro Seite"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Passwort wiederholen"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Recht delegiert"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Recht erteilt"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Recht geladen"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Recht konnte nicht zurückgezogen werden"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Recht nicht gefunden"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Recht nicht gefunden."
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Recht zurückgezogen"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Rechte"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "Rechte konnten für %1 nicht gewährt werden"
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "Rechte konnten nicht für %1 entzogen werden"
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Rollen"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr ""
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Sa"
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Änderungen Sichern"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Änderungen Sichern"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Scrip angelegt"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Scrip gelöscht"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Scrips"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Scrips für %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Auf alle Stapel angewande Scrips"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Suchen"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr "Suche nach Freigaben"
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Sicherheit:"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr ""
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Wähle eine Gruppe aus"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr ""
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Wähle einen Benutzer aus"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr "Wähle ein benutzerdef. Feld"
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr "Wähle eine Gruppe"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr "Wähle mehrere Werte"
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr "Wähle einen Wert"
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+msgstr "Wähle einen Stapel"
+
+#: 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 "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"
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr "Wähle einen Benutzer"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr "Mehrfachauswahlfeld"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr "Einzelauswahlfeld"
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Selbstbedienung"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr "Schicke eine Mail an alle Beobachter"
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Schicke eine Mail an alle Beobachter als \"Kommentar\""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr "Schicke eine Mail an die Klienten und CCs"
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Schicke eine Mail an die Klienten und CCs als Kommentar"
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr "Schicke eine Mail an die Klienten"
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Schicke eine Mail an die direkt angegebenen CCs und BCCs"
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr "Schicke eine Mail an die administrativen CCs"
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Schicke eine Mail an die administrativen CCs als Kommentar"
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr "Schicke eine Mail an den Inhaber"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Sep"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr "Zeige freigegebene Anfragen"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Zeige Grundlagen"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Zeige abgelehnte Anfragen"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Zeige Details"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Zeige schwebende Anfragen"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "Zeige auf andere Freigaben wartende Anfragen"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr "Zeige private Kommentare des Anfragen"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr "Zeige Kurzfassungen der Anfragen"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "Als Klient einer Anfrage oder Anfrage- bzw. Stapel-CC eintragen"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "Als Anfrage- oder Stapel-AdminCC eintragen"
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "E-Mail-Signatur"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr "Angemeldet als %1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Einzel"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr "Überspringe Menü"
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Sortierschlüssel"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Sortiere Ergebnisse nach"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "Sortierreihenfolge"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr ""
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Begonnen"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr ""
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Beginnt"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Staat"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Status"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr "Ändere Status"
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Status von %1 auf %2 geändert"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Stehlen"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Gestohlen von %1 "
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Betreff"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Betreff wurde auf %1 geändert"
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Übermitteln"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr "Geglückt"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "So"
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "System"
+
+#: 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 "Systemfehler"
+
+#: lib/RT/ACE_Overlay.pm:616
+msgid "System error. Right not delegated."
+msgstr "Systemfehler. Recht nicht delegiert."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Systemfehler. Recht nicht gewährt."
+
+#: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36
+msgid "System groups"
+msgstr "Systemgruppen"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "SystemRolegroup für internen Gebrauch"
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Übernehmen"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Übernommen"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Vorlage"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "Vorlage #%1"
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr "Vorlage gelöscht"
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Vorlage nicht gefunden"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr ""
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Vorlagen eingelesen"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Vorlagen"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Vorlagen für %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr "Das ist bereits der aktuelle Wert"
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Dies ist kein gültiger Wert für dieses benutzerdefinierte Feld"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Das ist der gleiche Wert"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Dieser Hauptverantwortliche ist bereits ein %1 dieses Stapels"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Dieser Hauptverantwortliche ist bereits ein %1 dieser Anfrage"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Dieser Hauptverantwortliche ist nicht ein %1 dieses Stapels"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Dieser Hauptverantwortliche ist nicht ein %1 dieser Anfrage"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Dieser Stapel existiert nicht"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Diese Anfrage hat ungelöste Abhängigkeiten"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Dieser Benutzer hat dieses Recht bereits" 
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Diesem Benutzer gehört diese Anfrage bereits"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Dieser Benutzer existiert nicht"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Dieser Benutzer ist bereits privilegiert"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Dieser Benutzer ist bereits ungeprivilegiert"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Dieser Benutzer ist jetzt privilegiert"
+
+#: lib/RT/User_Overlay.pm:344
+msgid "That user is now unprivileged"
+msgstr "Dieser Benutzer ist jetzt unprivelegiert"
+
+#: lib/RT/Ticket_Overlay.pm:2944
+msgid "That user may not own tickets in that queue"
+msgstr "Diesem Benutzer dürfen keine Anfragen aus diesen Stapel gehören"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Dies ist keine numerische Id"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Grundlagen"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr "Der CC einer Anfrage"
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr "Der administrative CC einer Anfrage"
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "Der Kommentar wurde aufgezeichnet"
+
+#: bin/rt-crontool:198
+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 "Das folgende Kommando wird alle aktiven Anfragen des Stapels 'general' finden und ihre Priorität auf 99 setzen, wenn sie innerhalb der letzten 4 Stunden nicht angefasst wurden:"
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Die folgenden Kommandos wurden nicht verarbeitet:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr "Der neue Wert wurde gesetzt."
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr "Der Inhaber einer Anfrage"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr "Der Klient einer Anfrage"
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Diese Kommentare sind generell nicht für den Benutzer sichtbar"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr ""
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Dieses Werkzeug erlaubt es Benutzern beliebige Perl-Module von RT aus aufzurufen."
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Diese Transaktion scheint keinen Inhalt zu haben"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "Die %1 höchstpriorisiertesten Anfragen dieses Benutzers"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr ""
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Do"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr ""
+
+#: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "Anfrage Nr. %1 Alles aktualisieren: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Anfrage Nr. %1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Anfrage %1 wurde in Anfrage '%2' angelegt"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Anfrage %1 geladen\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Anfrage %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Verlauf von Anfrage Nr. %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Anfrage Nr." 
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr "Anfrage erledigt"
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Anhang der Anfrage"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Inhalt der Anfrage"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Art des Inhalts der Anfrage"
+
+#: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr "Anfrage konnte aufgrund eines internen Fehlers nicht angelegt werden"
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Anfrage angelegt"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Anfrage gelöscht"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+msgid "Ticket id not found"
+msgstr "Anfragenummer nicht gefunden"
+
+#: html/REST/1.0/modify:36 html/REST/1.0/update:41
+msgid "Ticket not found"
+msgstr "Anfrage nicht gefunden"
+
+#: etc/initialdata:289
+msgid "Ticket status changed"
+msgstr "Status der Anfrage geändert"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Beobachter der Anfrage"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr "Anfragen"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "Anfragen %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Anfragen %2 von %2"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Anfragen von %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "Anfragen, die von dieser Freigabe abhängen:"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Übrige Zeit"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Arbeitszeit"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Übrige Zeit"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Benötigte Zeit"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Arbeitszeit"
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr "Gearbeitete Zeit"
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Um ein 'diff' dieser Übergabe zu erstellen:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "Um ein 'diff' dieser Übergabe zu erstellen:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Eingegangen"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transaktion"
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Transaktion %1 durchgeprügelt"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transaktion erstellt"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Transaction->Create konnte nicht ausgeführt werden da keine Ticketnummer angegeben wurde"
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Transaktionen sind unveränderbar"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr ""
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Di"
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Typ"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Nicht implementiert"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Unix Login"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "UnixBenutzername"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Unbekannte Inhalts-Kodierung %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "unbegrenzt"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "Unprivilegiert"
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "Zurückgegeben"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Aktualisierungs-ID"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Aktualisierungtyp"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Aktualisiere alle diese Anfragen auf einmal"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Aktualisiere E-Mail"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Aktualisiere Name"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Aktualisierung nicht aufgezeichnet."
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Aktualisiere ausgewählte Anfragen"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Aktualisiere Unterschrift"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Aktualisiere Anfrage"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Aktualisiere Anfrage Nr. %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Aktualisiere Anfrage Nr. %1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Aktualisiere Anfrage Nr. %1 (%2)"
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "Aktualisierungstyp war weder Korrespondenz noch Kommentar."
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Aktualisiert"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr ""
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr "Benutzerdefiniert"
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "Benutzer-ID"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Benutzername"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Benutzerrechte"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Benutzer konnte nicht angelegt werden: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Benutzer angelegt"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Benutzerdefinierte Gruppe"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Benutzeransicht"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Benutzername"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Benutzer"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Auf diese Kriterien zutreffenede Benutzer"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "ValueOfQueue"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Werte"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Beobachter"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "Webkodierung"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Mi"
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Füge Korrespondenz zum Originalticket, wenn eine Anfrage von allen Freigebenden freigegeben wurde"
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Füge Korrespondenz zum Originalticket wenn eine Anfrage  von einem Freigebenden freigegeben wurde"
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Wenn eine Afrage erstellt wird"
+
+#: 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 "Benachrichtige Inhaber und AdminCCs der auf Freigabe wartende Anfrage wenn ein Freigabeticket erstellt wurde"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Wenn irgendetwas passiert"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Immer wenn eine Anfrage  erledigt wird"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Immer wenn der Eigentümer einer Anfrage wechselt"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Immer wenn eine Anfrage den Stapel wechselt"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Immer wenn sich der Status einer Anfrage ändert"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Immer wenn eine benutzerdefinierte Bedingung auftritt"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Immer wenn ein neuer Kommentar eingeht"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Immer wenn neue Korrespondenz eingeht"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Arbeit"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "Arbeitstelefon"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Arbeitszeit"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "Du besitzt diese Anfrage bereits"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "Du bist 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"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+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"
+
+#: 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."
+
+#: 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."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "Du darfst 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"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Meine %1 Anfragen"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+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."
+
+#: etc/initialdata:463 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Deine Anfrage wurde freigegeben."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr ""
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Deine Anfrage wurde abgewiesen"
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Dein Benutzername oder Passwort ist falsch"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "PLZ"
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "wie an %1 gewährt"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "enthält"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "Inhalt"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "content-type"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "Korrepsondenz (möglicherweise) nicht verschickt"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "Korrespondenz verschickt"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "Tage"
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "löschen"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "gelöscht"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "entspricht nicht"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "enthält nicht"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "entspricht"
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "Dateiname"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "größer als"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "Gruppe '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "Stunden"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr ""
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "ist"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "ist nicht"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "kleiner als"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "entspricht"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "Min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "Minuten"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "Änderungen\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "Monate"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "neu"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr "kein Wert"
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "keine"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "entspricht nicht"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "offen"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "persönliche Gruppe '%1' für Benutzer '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "Stapel %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "abgewiesen"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "erledigt"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "Sek"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "zurückgestellt"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "System %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "Systemgruppe '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "die aufrufende Komponente gab nicht an warum"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "Ticket #%1 %2"
+
+#: lib/RT/Group_Overlay.pm:216
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "unbeschriebene Gruppe %1"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "Benutzer %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "Wochen"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr ""
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "Jahre"
+
diff --git a/rt/lib/RT/I18N/en.po b/rt/lib/RT/I18N/en.po
new file mode 100644 (file)
index 0000000..ffdc5cc
--- /dev/null
@@ -0,0 +1,88 @@
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Apr"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Aug"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Dec"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Feb"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Fri"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Home"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Jan"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Jul"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Jun"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Mar"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "May"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Mon"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Nov"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Oct"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Open"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Home"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Sat"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Sep"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Sun"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Thu"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Tue"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Wed"
+
diff --git a/rt/lib/RT/I18N/es.po b/rt/lib/RT/I18N/es.po
new file mode 100644 (file)
index 0000000..05006b1
--- /dev/null
@@ -0,0 +1,4749 @@
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 2.1.x\n"
+"POT-Creation-Date: 2002-05-02 11:36+0800\n"
+"PO-Revision-Date: 2003-03-23 12:38\n"
+"Last-Translator: Tomàs Núñez Lirola <tomasnl@dsl.upc.es>\n"
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr "#%1"
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %2 %3 %4:%5:%6 %7"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "Añadido %1 %2"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "Hace %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 ha cambiado a %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 borrado"
+
+#: 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"
+msgstr "%1 %2 con la plantilla %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 este caso\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "%1 - %2 mostrados"
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - Un parametro para pasar a %2"
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - El estado de la salida actualiza STDOUT"
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Especifica el modulo de accion que quieres usar"
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Especifica el modulo de condicion que quieres usar"
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Especifica el modulo de busqueda que quieres usar"
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "%1 ScripAction cargado"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "$1 añadido como un valor de %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1 alias requieren un TicketId en el que trabajar"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "%1 alias requieren un TicketId en el que trabajar "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1 alias requieren un TicketId en el que trabajar (de %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr "%1 parece ser un objeto local, pero no se encuentra en la base de datos"
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 por %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 ha cambiado de %2 a %3"
+
+#: lib/RT/Interface/Web.pm:857
+msgid "%1 could not be set to %2."
+msgstr "%1 no se ha podido fijar a %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 no pudo iniciar una transacción (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 no pudo fijar el estado a resuelto. La base de datos de RT podría ser inconsistente."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "Los %1 tickets de mayor prioridad que poseo... "
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "Los %1 tickets de mayor prioridad que he pedido"
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "$1 es una herramienta para actuar sobre los tickets con una herramienta de planificacion externa, como crom"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 ha dejado de ser un %2 para esta cola."
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 ha dejado de ser un %2 para este ticket."
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 ha dejado de ser un valor para campo personalizable %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 no es un identificador de Cola válido."
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 no mostrado"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1 privilegios"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 exitoso\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "%1 tipo desconocido para $MessageId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "%1 tipo desconocido para %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 was created without a CurrentUser\\n"
+msgstr "%1 se creó sin CurrentUser\\n"
+
+#: lib/RT/Action/ResolveMembers.pm:42
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 resolverá todos los miembros de un grupo de tickets resueltos."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr "%1 pondrá como pendiente una BASE [local] si es dependiente [o miembro] de una solicitud ligada."
+
+#: lib/RT/Transaction_Overlay.pm:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: ningún archivo adjunto especificado"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr "%1b"
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k"
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' es un valor inválido para el estado"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "'%1' no es una acción reconocida. "
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete group member)"
+msgstr "(Marque la caja para borrar al miembro del grupo)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Marque la caja para borrar el scrip)"
+
+#: 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 "(Marque la caja para borrar)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check boxes to delete)"
+msgstr "(Marque las cajas para borrar)"
+
+#: html/Ticket/Create.html:178
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(Introduzca los identificadores de ticket o URLs, separados por espacios)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(Si se deja vacio, pasara por defecto a %1"
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(Sin Valor)"
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr "(No hay campos custom)"
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Sin miembros)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Sin scrips)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr "(Sin plantillas)"
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Envia una copia oculta de esta actualizacion a una lista delimitada por comas de direcciones de email. <b>NO</b> cambia quien recibirá futuras actualizaciones)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Envía una copia oculta de esta actualización a una lista de direcciones de correo delimitada por comas. <b>No</b> cambia a quien recibirá futuras actualizaciones.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Envia una copia oculta de esta actualización a una lista delimitada por comas de direcciones de email administrativas. Estas personas <b>recibirán</b> las futuras actualizaciones.)"
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Envia una copia oculta de esta actualización a una lista delimitada por comas de direcciones de email.<b>NO</b> cambia quien recibirá futuras actualizaciones."
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Manda una copia de esta actualización a una lista de direcciones de correo delimitada por comas. <b>No</b> cambia a quien recibirá futuras actualizaciones.)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Envia una copia de esta actualización a una lista de direcciones de correo delimitada por comas. Estas personas <b>recibirán</b> actualizaciones futuras."
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(vacío)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr "(no hay nombres listados)"
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(sin asunto)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(sin valor)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(solo un ticket)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr "(pendiente de aprobacion)"
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr "(pendiente de otros tickets)"
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(requerido)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr "(sin titulo)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr "Los 25 tickets de mayor prioridad que poseo..."
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr "Los 25 tickets de mayor prioridad que he solicitado..."
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Nuevo ticket en\">&nbsp;%1"
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "Una plantilla en blanco"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE Borrado"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE Cargado"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr "ACE no se pudo borrar"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr "ACE no se encontró"
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE no encontrado"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACEs solo pueden ser creadas o borradas."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Abortando para prevenir modificaciones no intencionadas al ticket\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr "Sobre mi"
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Control de acceso"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Acción"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Acción %1 no encontrada"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Action committed."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Acción preparada..."
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Añadir AdminCc"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Añadir Cc"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr "Añadir más archivos"
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Añadir solicitante"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a keyword selection to this queue"
+msgstr "Añadir una seleccion de palabra clave a esta cola"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a new a global scrip"
+msgstr "Añadir un nuevo scrip global"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Añadir un scrip a esta cola"
+
+#: html/Admin/Global/Scrip.html:55
+msgid "Add a scrip which will apply to all queues"
+msgstr "Añadir un scrip que se aplicará a todas las colas"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Añadir comentarios o respuestas a los tickets seleccionados"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Añadir miembro"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Añadir nuevos observadores"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr "AddNextState"
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Principal ha sido añadido como %1 para esta cola"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Principal ha sido añadido como %1 para este ticket"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Dirección 1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Dirección 2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Admin Cc"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr "Admin Comment"
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr "Admin Correspondence"
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Administración de colas"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Administración de usuarios"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Adminsitración de la configuración global"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Administración de Grupos"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Administración de una cola"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminAllPersonalGroups"
+msgstr "AdminAllPersonalGroups"
+
+#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:39 html/Ticket/Update.html:50 lib/RT/ACE_Overlay.pm:89
+msgid "AdminCc"
+msgstr "AdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "AdminComment"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "AdminCorrespondence"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr "AdminCustomFields"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr "AdminGroup"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr "AdminGroupMembership"
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr "AdminOwnPersonalGroups"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr "AdminQueue"
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr "AdminUsers"
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Cc Administrativa"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Búsqueda avanzada"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Después"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Edad"
+
+#: html/Admin/Elements/EditCustomFields:96
+msgid "All Custom Fields"
+msgstr "Todos los campos custom"
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Todas las colas"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "Siempre envia un mensaje a los solicitantes independientemente del remitente del mensaje"
+
+#: html/Elements/Tabs:58
+msgid "Approval"
+msgstr "Aprobacion"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Aprobacion #%1: %2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Aprobación #%1: No se han guardado las notas debido a un error del sistema"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Aprobacion #%1: Notas guardadas"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr "Detalles de la aprobación"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr "Diagrama de la aprobación"
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr "Aprobar"
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Notas del aprobador: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Abr."
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "Abril"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "Ascendente"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Adjunto"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Adjuntar archivo"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "Archivo adjunto"
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Archivo adjunto '%1' no pudo ser cargado"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Archivo adjunto creado"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Nombre del archivo adjunto"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Archivos adjuntos"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Ago."
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "Agosto"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "Sistema de autenticación"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "Autorespuesta"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "Autorespuesta a los solicitantes"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "AutoreplyToRequestors"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Firma PGP incorrecta: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Identificador de archivo adjunto erróneo. No se puede encontrar el archivo '%1'\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Datos incorrectos en %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Número de transacción incorrecta para el archivo adjunto. %1 debe ser %2\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Basicos"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Bcc"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Asegúrese de salvar sus cambios"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "Antes"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr "Begin Approval"
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Vacio"
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "URL para guardar esta búsqueda en sus marcadores"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Encabezados breves"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Actualización de varios tickets a la vez"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "No se pueden modificar los usuarios del sistema"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr "Can this principal see this queue"
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "No se puede agregar un campo personalizable si no tiene un nombre"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "No se puede ligar un ticket a sí mismo"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "No se puede fusionar dentro de un caso ya fusionado. Nunca deberia recibir este error"
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "No se puede especificar origen y destino al mismo tiempo"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "No se puede crear el usuario: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "Check box to delete"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Seleccione la caja para quitar el permiso"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Hijo"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Ciudad"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr "Cerrado"
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Solicitudes cerradas"
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "No se entendió el comando!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Comentario"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Dirección de comentario"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Comentario no grabado"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr "Comentario sobre los tickets"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr "CommentOnTicket"
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Comentarios"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Comentarios (no se envían a los solicitantes)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Comentarios (no se envían a los solicitantes)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Comentarios acerca de %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Comentarios acerca de este usuario"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Comentarios añadidos"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "Acción realizada"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Compilar restricciones"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Condición"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "La condicion coincide..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Condición no encontrada"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Configuración"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "Información de contacto"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Fecha de contacto '%1' no pudo ser leida"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Contenido"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr "No se pudo crear grupo"
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr "Correspondencia"
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Dirección de corresponencia"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Correspondencia agregada"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Correspondencia no guardada"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "No se pudo añadir un nuevo valor de campo personalizable para el ticket. "
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr "No se pudo añadir un nuevo valor de campo personalizable para el ticket. %1 "
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "No se pudo cambiar el propietario. "
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "No se puede crear un CampoPersonalizable"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "No se pudo crear el grupo"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "No se pudo crear la plantilla: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "No se pudo crear el ticket. Cola no seleccionada"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "No se pudo crear el usuario"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "No se pudo crear un observador para el solicitante"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "No se pudo encontrar un ticket con identificador $1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "No se pudo encontrar el grupo %1."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "No se pudo encontrar o crear el usuario"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "No se pudo encontrar ese principal"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "No se pudo encontrar el usuario %1."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "No se puede cargar el grupo"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "No se pudo hacer ese principal un %1 para esta cola"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "No se pudo hacer ese principal un %1 para este ticket"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "No se pudo quitar ese principal como un %1 para esta cola"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "No se pudo quitar ese principal como un %1 para este ticket"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "No se pudo agregar el miembro al grupo"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "No se pudo crear la transacción: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "No se pudo averiguar que hacer a partir de la firma gpg de la respuesta"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "No se pudo encontrar el grupo\\n"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr "No se pudo encontrar la fila"
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "No pudo enconcontrar ese principal"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "No se pudo encontrar ese valor"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "No se pudo encontrar ese observador"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "No se pudo encontrar el usuario\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "No se pudo cargar %1 desde la base de datos de usuarios.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "No se pudo cargar KeywordSelects"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "No se pudo cargar el archivo de configuración de RT '%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "No se pudieron cargar los Scrips."
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "No se pudo cargar el grupo %1"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "No se puedo cargar el enlace"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "No se pudo cargar la cola"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "No se pudo cargar la cola %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "No se pudo cargar el scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "No se pudo cargar la plantilla"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "No se pudo cargar ese usuario (%1)"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "No se pudo cargar el ticket '%1'"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "País"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Crear"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "Crear Tickets"
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Crear CampoPersonalizable"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "Crear un campo personalizables para la cola %1"
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr "Crear un campo personalizable que se aplique a todas las colas"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Crear un nuevo campo personalizable"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "Crear un nuevo scrip global"
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Creat un nuevo grupo"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Crear un nuevo grupo personal"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Crear una nueva cola"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Crear un nuevo scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Crear una nueva plantilla"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Crear un nuevo ticket"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Crear un nuevo usuario"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Crear una cola"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Crear una cola llamada "
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Crear una solicitud"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Crear un scrip para la cola %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Crear una plantilla"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "Creación fallida: %1 / %2 / %3 "
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr "Creación fallida: %1 / %2 / %3 "
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr "Crear nuevos tickets basados en esta plantilla de scrip"
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "Crear ticket"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr "Crear tickets en esta cola"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr "Crear, borrar y modifical campos personalizables"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr "Crear, borrar y modificar colas"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "Crear, borrar y modificar los miembros de cualquier grupo personal de usuario"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Crear, borrar y modificar los miembros de los grupos personales"
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr "Crear, borrar y modificar usuarios"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr "CreateTicket"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Creado"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "CampoPersonalizable %1 creado"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Plantilla %1 creada"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Relaciones actuales"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Scrips actuales"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Miembros actuales"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Permisos actuales"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr "Criterio de busqueda actual"
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Observadores actuales"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr "Campo personalizable #%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"
+msgstr "Campos personalizables"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Codigo de limpieza de accion personalizable"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Codigo de preparacion de accion personalizable"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Condicion personalizable"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Campo personalizado %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Campo personalizado %1 tiene un valor."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Campo personalizado %1 no tiene un valor."
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Campo personalizado %1 no encontrado"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr "Campo personalizable borrado"
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Campo personalizado no encontrado"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "El valor del campo %1 no pudo ser encontrado para el campo %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Valor del campo cambiado de %1 a %2"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "El valor del campo no pudo ser borrado"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "El valor del campo no pudo se encontrado"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Valor del campo borrado"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr "CustomField"
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "Error de datos"
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Fechas"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Dic."
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "Diciembre"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "Plantilla de autorespuesta por defecto"
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "Plantilla de autorespuesta por defect"
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr "Plantilla de comentario de admin por defecto"
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr "Plantilla de correspondencia de admin por defecto"
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr "Plantilla de correspondencia por defecto"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Plantilla de trasacciones por defecto"
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Por defecto: %1/%2 ha cambiado de %3 a %4"
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Delegar derechos"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Delegar derechos especificos que te han sido concedidos"
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr "DelegateRights"
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr "Delegar"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "Borrar"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr "Borrar tickets"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr "DeleteTicket"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Al borrar este objeto, se puede romper la integridad referencial"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Al borrar este objeto, se romperá la integridad referencial"
+
+#: lib/RT/User_Overlay.pm:430
+msgid "Deleting this object would violate referential integrity"
+msgstr "Al borrar este objeto, se violará la integridad referencial"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity."
+msgstr "Al borrar este objeto, se violará la integridad referencial."
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity. That's bad."
+msgstr "Al borrar este objeto, se violará la integridad referencial. Eso es malo."
+
+#: html/Approvals/Elements/Approve:46
+msgid "Deny"
+msgstr "Denegar"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "Dependen de este ticket"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Dependencias: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Depende de"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr "DependsOn"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "Descendiente"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Describa el problema debajo"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Descripción"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Detalles"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Despliegue"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr "Mostrar Lista de Control de Acceso"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr "Mostrar plantillas de scrip para esta cola"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr "Mostrar scrips para esta cola"
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Modo de despliegue"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Despliega ticket #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr "Hacer cualquier cosa y todo"
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "No recargar esta página"
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr "No mostrar los resultados de la busqueda"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Descargar"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Retraso"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "La fecha de retraso '%1' no pudo ser leida"
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "ERROR: No se pudo cargar el ticket '%1': %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Editar"
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Editar campos personalizados para %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Editar relaciones"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "Editar plantillas para la cola %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr "Editar palabras clave"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "Editar acciones"
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Editar plantillas del sistema"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Editar plantillas para %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Editando configuración para la cola %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Editando configuración para el usuario %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Editando campo %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Editando los miembros del grupo %1"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Editando los miembros para el grupo personal %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Editando plantilla %1"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "La base o el destinatario deben ser especificados"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Correo"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "La dirección de correo ya está en uso"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "Correo Electrónico"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "Codificación para el correo"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "Habilitado (Desmarcar esta caja deshabilita este campo personalizable)"
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "Habilitado (Desmarcar esta caja deshabilita este campo personalizable)"
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Habilitado (Desmarcar esta caja, deshabilita esta cola)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr "Campos Personalizables Habilitados"
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Colas habilitadas"
+       
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Estado %1 habilitado"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr "Introducir multiples valores"
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr "Introducir un valor"
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Ingrese los números de ticket o las URL que llevan hacia el ticket. Separe multiples entradas con espacios"
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Error"
+
+#: NOT FOUND IN SOURCE
+msgid "Error adding watcher"
+msgstr "Error añadiendo observador"
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Error en los parámetros para Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Error en los parámetros para Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Error en los parámetros para Queue->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Error en los parámetros para Queue->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Todos"
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Ejemplo"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "ExternalAuthId"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "ExternalContactInfoId"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Información extra"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Problema para encontrar el pseudogrupo de usuarios 'Privileged'"
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Problema para encontrar el pseudogrupo de usuarios 'Unprivileged'"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Error al cargar el modulo %1. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Feb."
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "Febrero"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "Fin"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Prioridad Final"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr "FinalPriority"
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr "Encontrar grupo que"
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Encontrar tickets nuevos/abiertos"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Encontrar gente que"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr "Encontrar tickets"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr "Aprobacion final"
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Primero"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Primera página"
+
+#: 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:87
+msgid "Force change"
+msgstr "Forzar cambio"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "Encontrado %quant(%1,ticket)"
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr "Objeto encontrado"
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "FreeformContactInfo"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr "FreeformMultiple"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr "FreeformSingle"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Vie."
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Encabezados completos"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Obteniendo el usuario de la firma pgp"
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "Given to %1"
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Global"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr "Seleccion de palabras clave globales"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "Acciones Globales"
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Plantilla global"
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr " Ir "
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Firma pgp correcta de %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Ir a página"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Ir a ticket"
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "Grupo"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Grupo %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Derechos del grupo"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "El grupo ya tiene miembros"
+
+#: NOT FOUND IN SOURCE
+msgid "Group could not be created."
+msgstr "El grupo no se pudo crear"
+
+#: html/Admin/Groups/Modify.html:77
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "El grupo no se pudo crear: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Grupo creado"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr "El grupo no tiene este miembro"
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Grupo no encontrado"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Grupo no entontrado\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Grupo no especificado\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Grupos"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Los grupos no pueden ser miembros de sus propios miembros"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Hola!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Hola, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Historial"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "Tel Casa"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Inicio"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "Tengo %quant(%1,concrete mixer)."
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "Tengo [quant,_1,concrete mixer]."
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Id"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identidad"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Si una aprobacion es rechazada, rechazar la original y borrar las aprobaciones pendientes"
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Si esta herramienta estaba setgid, un usuario hostil local podria usar esta herramienta para conseguir acceso administrativo a RT."
+
+#: 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 "Si ha actualizado algo más arriba, no olvide"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr "Valor ilegal para %1"
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr "Campo inmutable"
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr "Incluir campos personalizables deshabilitados en el listado."
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Incluir colas deshabilitadas en el listado"
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Incluir usuarios deshabilitados en la búsqueda"
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Prioridad inicial"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr "InitialPriority"
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Error de entrada"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr "Interest noted"
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr "Error interno"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Error interno: %1"
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Tipo de grupo inválido"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr "Derechos inválidos"
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "Tipo inválido"
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr "Datos no válidos"
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Propietario inválido. Estableciéndolo a 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Área inválida"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Permiso inválido"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Valor inválido para %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Valor inválido para el campo personalizable"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Valor inválido para el estado"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Es increiblemente importante que los usuarios sin privilegios no puedan ejecutar esta herramienta"
+
+#: bin/rt-crontool:192
+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 "Es recomendable crear un usuario unix sin privilegios que pertenezca al grupo correcto y que tenga aceso a ejecutar esta herramienta"
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Tiene varios parametros:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Items pendientes de mi aprobación"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Ene."
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "Enero"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr "Unirse o abandonar este grupo"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Jul."
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "Julio"
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Todo"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Jun."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "Junio"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Palabras clave"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Leng"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Último"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Último contacto"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Último contactado"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr "Se le notifico por ultima vez"
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Actualizado por ultima vez"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr "LastUpdated"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Izquierda"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Permitir a este usuario acceder al RT"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Permitir que este usuario tenga privilegios adicionales"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Limitando propietario a %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Limitando cola a %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "El vínculo ya existe"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "El vínculo no pudo ser creado"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Vínculo creado (%2)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Vínculo borrado (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Vínculo no encontrado"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Vincular caso #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr "Enlazar ticket %1"
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Enlaces"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Direccion"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "El directorio del log %1 no pudo ser encontrado o no se pudo escribir en él.\\n RT no puede ejecutarse."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Autenticado como %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Entrar"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Salir"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Hacer propietario a"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Establecer estatus"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Establecer fecha de plazo"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Establecer fecha de resolución"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Establecer fecha de inicio"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Establecer fecha de inicio"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Establecer fecha de último cambio"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Establecer prioridad"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Establecer cola"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Establecer título"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Administrar grupos y miembros"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Administrar propiedades y configuracion que se aplique a todas las colas"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Administrar colas y propiedades especificas"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Administrar usuarios y contraseñas"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Mar."
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "Marzo"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "Mayo"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "May."
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Miembro añadido"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Miembro borrado"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Miembro no borrado"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Miembro de"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "MemberOf"
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Miembros"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "Fusión exitosa"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Fusión fallida. No se pudo establecer el EffectiveId"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Fusionar dentro de"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Mensaje"
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr "Falta una clave primaria?: %1"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Movil"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "Telefono Movil"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "Modificar lista de control de acceso"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Modificar el campo personalizable %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "Modificar los campos personalizables que se apliquen a todas las colas"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+msgstr "Modificar plantillas Sript para esta cola"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "Modify Scrips for this queue"
+msgstr "Modificar Scrips para esta cola"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify System ACLS"
+msgstr "Modificar ACLs de sistema"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr "Modificar plantilla %1"
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "Modificar un campo personalizable para la cola %1"
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr "Modificar un campo personalizable que se aplique a todas las colas"
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Modificar un scrip para la cola %1"
+
+#: html/Admin/Global/Scrip.html:48
+msgid "Modify a scrip which applies to all queues"
+msgstr "Modificar un scrip que se aplique a todas las colas"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "Modificar fechas para # %1"
+
+#: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Modificar fechas para #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Modificar fechas para ticket # %1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Modificar privilegios globales de grupo"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Modificar privilegios globales de grupo."
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for groups"
+msgstr "Modificar privilegios globales para grupos"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for users"
+msgstr "Modificar privilegios globales para usuarios"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global scrips"
+msgstr "Modificar acciones globales"
+
+#: html/Admin/Global/UserRights.html:25 html/Admin/Global/UserRights.html:28 html/Admin/Global/index.html:60
+msgid "Modify global user rights"
+msgstr "Modificar derechos globales de usuario"
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Modificar privilegios globales de usuario"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr "Modificar metadatos del grupo o borrar grupo"
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Modificar privilegios de grupo para %1"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Modificar privilegios de grupo para la cola %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr "Modificar miembros de este grupo"
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr "Modificar la propia cuenta RT"
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Modificar personas relacionadas al cola %1"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Modificar personas relacionadas al ticket #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Modificar acciones para la cola %1"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Modificar scrips que se aplican a todas las colas"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Modificar plantilla %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr "Modificar plantillas que se aplican a todas las colas"
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Modificar el grupo %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr "Modificar los observadores de la cola"
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Modificar el usuario %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Modificar el ticket # %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Modificar el ticket #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "Modificar tickets"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Modificar privilegios de usuario para el grupo %1"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Modificar derechos de usuario para la cola %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Modificar observadores para la cola '%1'"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr "ModifyACL"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr "ModifyOwnMembership"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr "ModifyQueueWatchers"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr "ModifyScrips"
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr "ModifySelf"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr "ModifyTemplate"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr "ModifyTicket"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Lun."
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Más acerca de %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr "Mover hacia abajo"
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr "Move hacia arriba"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Múltiple"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "Se debe especificar un nombre"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Mis aprobaciones"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+msgstr "Mis aprobaciones"
+
+#: 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"
+msgstr "Nombre"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Nombre en uso"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "Se necesita aprobacion del administrador del sistema"
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr "Nunca"
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Nuevo"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Nueva contraseñaa"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Nueva pendiente de aprobación"
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Nuevas relaciones"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+msgstr "Nueva búsqueda"
+
+#: 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 "Nuevo campo personalizable"
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr "Nuevo grupo"
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Nueva contraseñaa"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Notificación de nueva contraseña enviada"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr "Nueva cola"
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Nueva solicitud"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Nuevos privilegios"
+
+#: 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 "Nuevo scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Nueva búsqueda"
+
+#: 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 "Nueva plantilla"
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "El ticket nuevo no existe"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr "Nuevo usuario"
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Nuevo usuario llamado"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Nuevo observador"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Establecer nueva ventana "
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Siguiente"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Siguiente página"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Alias"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Alias"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "No hay campo personalizable"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "No hay grupo definido"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "No hay cola definida"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "No se encontró el usuario. Por favor consulte al administrador.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "No hay plantilla"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "No se especificó el ticket. Abortada la transacción"
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "No se especificó ticket. Abortando las modificaciones al ticket\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr "No action"
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr "No se ha especificado ninguna columna"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Comando no encontrado\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "No hay comentarios sobre este usuario"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "No hay ningún archivo adjunto"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "No hay descripción para %1"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "No hay grupo especificado"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "No hay contraseña definida"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "No tiene privilegios para crear colas"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "No tiene privilegios para crear tickets en la cola '%1'"
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "No tiene privilegios para crear usuarios"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "No tiene privilegios para mostrar el ticket"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "Sin permiso para ver la actualización del ticket"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "No hay un principal especificado"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "No hay principales seleccionados"
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "No hay colas que concuerden con los criterios de búsqueda"
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr "No se encontraron derechos"
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Sin privilegios concedidos"
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "No hay búsqueda sobre la que operar"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "No se especificó el identificador del ticket"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "No se especificó el tipo de transacción"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "No se especificó email o usuario"
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "No se encontraron usuarios que concuerden con los criterios de búsqueda"
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Usuario no encontrado. El manejador cvs está deshabilitado. Por favor consulte a su administrador.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr "No se envió ningun valor a _Set!\\n"
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr "Nadie"
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr "Campo no existente?"
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr "No autenticado"
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "No autenticado."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "No establecido"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "No se ha implementado."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "No está implementado..."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr "Notas"
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "La notificación no se pudo enviar"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr "Notificar AdminCcs"
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr "Notificar AdminCcs como comentario"
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr "Notificar otros destinatarios"
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr "Notificar otros destinatarios como comentario"
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr "Notificar al propietario"
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr "Notificar al propietario como comentario"
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Notificar propietarios y AdminCcs de nuevos items pendientes de aprobación"
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr "Notificar solicitantes"
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr "Notificar solicitantes y Ccs"
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Notificar solicitantes y Ccs como comentario"
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Notificar solicitantes, Ccs y AdminCcs"
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Notificar solicitantes, Ccs y AdminCcs como comentario"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Nov."
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "Noviembre"
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "No se pudo crear el objeto"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Objeto creado"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Oct."
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "Octubre"
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "en "
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Al comentar"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "On Correspond"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Al crear"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Al cambiar de propietario"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Al cambiar de cola"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Al resolver"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Al cambiar de status"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Al hacer transaccion"
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Solo muestra aprobaciones para solicitudes creadas despues de %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Solo muestra aprobaciones para solicitudes creadas antes de %1"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Abierto"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Abrirlo"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Solicitudes abiertas"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Tickets abiertos (del listado) en una nueva ventana"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Tickets abiertos (del listado) en otra ventana"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr "Open tickets on correspondence"
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Ordenación y clasificación"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organización"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Ticket originario: #%1"
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Pasada la fecha de gracia, la prioridad se mueve a"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr "Tickets poseidos"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr "OwnTicket"
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Propietario"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr "Propietario cambiado de %1 a %2"
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Propietario cambiado forzosamente de %1 a %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "El propietario es"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Buscapersonas"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "Buscapersonas Tel."
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Padres"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Contraseñaa"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Recordatorio de contraseña"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Contraseña demasiado corta"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Contraseña: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Personas"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr "Realizar una acion definida por el usuario"
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "Permiso denegado"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr "Grupos personales"
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Grupos personales"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Grupos personales:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Números de teléfono"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "Placeholder"
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Prefs"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Preparación cortada"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Prev"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Página anterior"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "No se encontró el principal %1"
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Prioridad"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "La prioridad empieza en"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Privilegiado"
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Estado privilegiado: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Usuarios privilegiados:"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Pseudogrupo para uso interno"
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Cola"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Cola %1 no encontrada"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Cola '%1' no encontrada\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr "Selecciones de palabras clave de la cola"
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Nombre de la cola"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Acciones de la cola"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "La cola ya existe"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "La cola no se pudo crear"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "La cola no se pudo cargar"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Cola creada"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr "No se especifico ninguna cola"
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Cola no encontrada"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Colas"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 para %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 de <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Derechos reservados 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "Administración del RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "Error de autenticación en RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "Rechazo del RT: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "Error de configuración del RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "Error crítico en RT. El mensaje no fue grabado!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "Error del RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT recibió correo (%1) de sí mismo."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr "RT recibió correo (%1) de sí mismo."
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT AutoServicio / Tickets cerrados"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr "RT en un vistazo"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT no te pudo autenticar."
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT no pudo encontrar el solicitante a través de una busqueda a la base de datos externa"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT no pudo encontrar la cola: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT no pudo validar esta firma PGP. \\n"
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT para %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "RT para %1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT ha procesado tus comandos"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT es &copy; Copyright 1996-%1 de Jesse Vincent &lt;jesse@bestpractical.com&gt;.  Es distrbuido bajo <a href=\"http://www.gnu.org/copyleft/gpl.html\">la version 2 de la licencia GNU GPL (General Public License)</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT cree que este mensaje puede ser un mensaje rebotado"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT procesará este mensaje como si fuera uno no firmado\\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 "El modo de comandos por correo de RT requiere autenticación PGP. Ya sea que no haya firmado su mensaje, o que su firma no pueda ser verificada."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Nombre real"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "Nombre real"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "Referenciado por"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Hace referencia a"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr "RefersTo"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Refinar"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Refinar la búsqueda"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Refrescar esta página cada %1 minutos"
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Relaciones"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Quitar AdminCc"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Quitar Cc"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Quitar solicitante"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Responder"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr "Responder a los tickets"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr "ReplyToTicket"
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Solicitante"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Dirección de correo del solicitante"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "Solicitante(s)"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "RequestorAddresses"
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Solicitantes"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Las solicitudes entran en vencimiento en"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Borrar"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Residencia"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Resolver"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Resolver ticket #%1 (%2)"
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Resuelto"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Responder a los solicitantes"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Resultados"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Resultados por página"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Confirmar contraseña"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Privilegio %1 no encontrado para %2 %3 referente a %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Privilegio delegado"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Privilegio otorgado"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Privilegio cargado"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Privilegio no pudo ser revocado"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Privilegio no encontrado"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Privilegio no cargado"
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Privilegio revocado"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Privilegios"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "No se pudieron conceder los privilegios a %1"
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "No se pudieron revocar los privilegios de %1"
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Roles"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "RootApproval"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Sab."
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Guardar Cambios"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Guardar cambios"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "Scrip #%1"
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Acción creada"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Acción borrada"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Acciones"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Acciones para %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Acciones que se aplican a todas las colas"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Búsqueda"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Criterios de búsqueda"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr "Buscar aprobaciones"
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Seguridad:"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr "Ver cola"
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Seleccione un grupo"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Seleccione una cola"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Seleccione un usuario"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr "Seleccionar un campo personalizable"
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr "Seleccionar grupo"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr "Seleccionar valores múltiples"
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr "Seleccionar un valor"
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+msgstr "Seleccionar cola"
+
+#: 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 "Seleccionar accion"
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr "Selecionar plantilla"
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr "Seleccionar usuario"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr "SelectMultiple"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr "SelectSingle"
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Autoservicio"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr "Enviar mail a todos los observadores"
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Enviar mail a todos los observadores como comentario"
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr "Enviar mail a los solicitantes y Ccs"
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Enviar mail a los solicitantes y Ccs como comentario"
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr "Envia un mesaje a los solicitantes"
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Enviar mail a los Ccs y Bccs listados explicitamente"
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr "Envia mail a los Ccs administrativos"
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Envia mail a los Ccs administrativos como comentario"
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr "Enviar mail al propietario"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Sep."
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr "Septiembre"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Mostrar resultados"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr "Mostrar peticiones aprobadas"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Mostrar lo básico"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Mostrar solicitudes denegadas"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Mostrar detalles"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Mostrar solicitudes pendientes"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "Mostrar solicitudes esperando otras aprobaciones"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr "Mostrar ticket en un comentario privado"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr "Mostrar resumen del ticket"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr "ShowACL"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr "ShowScrips"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr "ShowTemplate"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr "ShowTicket"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr "ShowTicketComments"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "Validarse como solicitante de ticket o ticket o cola Cc"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "Validarse como ticket o cola AdminCc"
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Firma"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr "Validado como %1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Sencillo"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr "Saltar Menu"
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Clave de ordenación"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Ordenar resultados por"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "Ordenamiento"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Pendiente"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Página de inicio"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Empezado"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "La fecha de inicio '%1' no se pudo leer"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Empieza"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Empezado por"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "La fecha de inicio '%1' no se pudo ser leer"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Estado"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Estado"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr "Cambio de status"
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Estado cambiado de %1 a %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "StatusChange"
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Robar"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Robado de %1"
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Asunto"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Asunto cambiado a %1"
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Enviar"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "Submit Workflow"
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr "Completado"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Dom."
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr "Superusuario"
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "Sistema"
+
+#: 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 "Error del sistema"
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. Right not granted."
+msgstr "Error de sistema. Derecho no concedido"
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. right not granted"
+msgstr "Error de sistema. Derecho no concedido"
+
+#: lib/RT/ACE_Overlay.pm:616
+msgid "System error. Right not delegated."
+msgstr "Error del sistema. Privilegio no delegado."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Error del sistema. Privilegio no otorgado"
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "Error de sistema. Incapaz de conceder permisos"
+
+#: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36
+msgid "System groups"
+msgstr "Grupos del sistema"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "SystemRolegroup for internal use"
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Coger"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Cogido"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Plantilla"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "Plantilla #%1"
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr "Plantilla borrada"
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Plantilla no encontrada"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Plantilla no encontrada\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Plantilla procesada"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Plantillas"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Plantillas de %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr "Ese es el valor actual"
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Ese no es un valor para este campo personalizable"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Este es el mismo valor"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Ese principal ya es un %1 para esta cola"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Ese principal ya es un %1 para este ticket"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Ese principal no es un %1 para esta cola"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Ese principal no es un %1 para este ticket"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Esa cola no existe"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Ese ticket tiene dependencias sin resolver"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Ese usuario ya tiene ese privilegio"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Ese usuario ya posee ese ticket"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Ese usuario no existe"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Ese usuario ya tiene privilegios"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Ese usuario ya está sin privilegios"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Ese usuario ahora tiene privilegios"
+
+#: lib/RT/User_Overlay.pm:344
+msgid "That user is now unprivileged"
+msgstr "Ese usuario ya no tiene privilegios"
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr "Este usuario ya no tiene privilegios"
+
+#: lib/RT/Ticket_Overlay.pm:2944
+msgid "That user may not own tickets in that queue"
+msgstr "Ese usuario puede no poseer tickets en esa cola"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Ese no es un identificador numérico"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Lo básico"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr "El CC de un ticket"
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr "El CC administrativo de un ticket"
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "El comentario ha sido grabado"
+
+#: bin/rt-crontool:198
+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 "El siguiente comando encontrará todos los tickets activos en la cola 'general' y pondra su prioridad a 99 si no han sido tocados en 4 horas:"
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Los siguientes comandos no han sido procesados:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr "Ha sido establecido el nuevo valor"
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr "El propietario de un ticket"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr "El solicitante de un ticket"
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Estos comentarios generalmente no están visibles para el usuario"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Este ticket %1 %2 (%3)"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Esta herramiento permite al usuario ejectutar modulos perl arbitrarios desde dentro de RT"
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Parece que esta transacción no tiene contenido"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "Los %1 tickets de mayor prioridad de este usuario"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "Los 25 casos de mayor prioridad de este usuario"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Jue."
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr "Ticket # %1  %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1 Jumbo update: %2"
+msgstr "Actualizacion Jumbo para el ticket # %1: %2"
+
+#: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "Actualización Jumbo para el ticket #%1: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Ticket #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Ticket %1 creado en la cola '%2'"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Ticket %1 cargado\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Ticket %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Historial del ticket # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Id del ticket:"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr "Ticket resuelto"
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Archivos adjuntos del ticket"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Contenido del ticket"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Tipo de contenido del ticket"
+
+#: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr "No se pudo crear el ticket debido a un error interno"
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Ticket creado"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Creación del ticket fallida"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Ticket borrado"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+msgid "Ticket id not found"
+msgstr "Id de ticket no encontrada"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket killed"
+msgstr "Ticket matado"
+
+#: html/REST/1.0/modify:36 html/REST/1.0/update:41
+msgid "Ticket not found"
+msgstr "Ticket no encontrado"
+
+#: etc/initialdata:289
+msgid "Ticket status changed"
+msgstr "Estado del ticket cambiado"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Observadores del ticket"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr "Tickets"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "Tickets %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Tickets %1 por %2"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Tickets de %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "Tickets que dependen de esta aprobación:"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Tiempo Restante"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Tiempo Trabajado"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Tiempo restante"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Tiempo para mostrar"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Tiempo trabajado"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "TimeLeft"
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr "TimeWorked"
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Para generar una comparación de este cometido:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "Para generar una comparación de este cometido:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Última actualización"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transacción"
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Transacción %1 limpiada"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transacción creada"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Transaction->Create no pudo, ya no no especificó un ID de ticket"
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Las transacciones son inmutables"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Intentando borrar el privilegio: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Mar."
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Tipo"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "No implementado"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Usuario en Unix"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "Usuario en Unix"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Codificación de contenido desconocida: %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Ilimitado"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "No privilegiado"
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "No cogido"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Actualizar"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Id de actualización"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Tipo de actualización"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Actualizar todos estos casos al mismo tiempo"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Actualizar correo"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Actualizar nombre"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Actualización no grabada."
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Actualizar tickets seleccionados"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Actualizar firma"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Actualizar ticket"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Actualización de ticket # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Actualizar ticket #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Actualizar ticket #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "El tipo de actualización no fue ni respuesta ni comentario"
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Actualizado"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Usuario %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Usuario %1 Contraseña: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Usuario '%1' no encontrado"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Usuario '%1' no encontrado\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr "Definido por el usuario"
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "ID de usuario"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Id de usuario"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Privilegios de usuario"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "El usuario no pudo ser creado: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Usuario creado"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Grupos definidos por el usuario"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Usuario notificado"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Vista de usuario"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Usuarios"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Usuarios que concuerdan con los criterios de búsqueda"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "Valor de la cola"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Valores"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr "Observar"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr "WatchAsAdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "Observador cargado"
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Observadores"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "Codificación de Web"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Mie."
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Cuando un ticket ha sido aprobado por todos los aprobadores, añadir correspondencia al ticket original"
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Cuando un ticket ha sido aprobado por cualquier aprobador, añadir correspondencia al ticket original"
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Cuando un ticket se crea"
+
+#: 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 "Cuando una aprobacion de ticket se crea, notifica al propietario y AdminCC del item que espera su aprobación"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Cuando pasa cualquier cosa"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Siempre que un ticket este sin resolver"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Siempre que el propietario de un ticket cambie"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Siempre que la cola de un ticket cambie"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Siempre que el estado de un ticket cambie"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Siempre que ocurra una condicion definida por el usuario"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Siempre que venga algun comentario"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Siempre que venga correspondencia"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Trabajo"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "Tel Trabajo"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Trabajado"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "Usted ya es propietario de este caso"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "Usted no es un usuario autorizado"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Usted solo puede reasignar casos que posee o que no posee nadie³"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "No tiene permiso para ver ese ticket.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "Usted encontró %1 casos en la cola %2"
+
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "Se ha desconectado del sistema RT"
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "No tiene permiso para crear tickets en esa cola."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "No puede crear solicitudes en esa cola."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "Es bienvenido a regresar en cualquier momento."
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Sus solicitudes %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "Su administrador del RT ha desconfigurado el alias de correo que invoca el 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 "Su petición ha sido aprobada por %1. Otras aprobaciones pueden estar pendientes todavia"
+
+#: etc/initialdata:463 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Su peticion ha sido aprobada."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "Su petición ha sido rechazada"
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Su petición ha sido rechazada"
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Nombre o contraseña de usuario incorrectos"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "Zip"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr "[sin asunto]"
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "como priviligiado para %1"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "contiene"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "contenido"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "content-type"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "Respuesta (probablemente) no enviada"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "Correspondencia enviada"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "días"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "muerto"
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "borrar"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "borrado"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "no coincide"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "no contiene"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "igual a"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr "falso"
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "nombre de archivo"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "mayor que"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "grupo '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "horas"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "id"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "es"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "no es"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "menor que"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "contiene"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "minutos"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "modificaciones\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "meses"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "nuevo"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr "sin valor"
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "ninguno"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "no igual a"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr "notlike"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "abierto"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "grupo personal '%1' para usuario '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "Cola %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "rechazado"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "resuelto"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "sec"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "pendiente"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "sistema %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "grupo del sistema '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "el componente que llama no especifica por qué"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "ticket #%1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr "verdadero"
+
+#: lib/RT/Group_Overlay.pm:216
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "grupo sin descripción %1"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr "grupo sin descripción %1"
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "usuario %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "semanas"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "con plantilla %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "años"
+
diff --git a/rt/lib/RT/I18N/fi.po b/rt/lib/RT/I18N/fi.po
new file mode 100644 (file)
index 0000000..ee1ad71
--- /dev/null
@@ -0,0 +1,4750 @@
+# Finnish localization catalog for Request Tracker (RT)
+# First Author: Janne Pirkkanen <jp@oppipoika.net>, Jul 2002
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 2.1.x\n"
+"POT-Creation-Date: 2002-07-08 17:41+0200\n"
+"PO-Revision-Date: 2002-07-09 18:09+0200\n"
+"Last-Translator: Janne Pirkkanen <jp@oppipoika.net>\n"
+"Language-Team: Finnish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr ""
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr ""
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr ""
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %3.%2 %7 %4:%5:%6"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr ""
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1: %2 muutettu arvoon %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+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"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 tässä työpyynnössä\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr ""
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr ""
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr ""
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "ScriptAction %1 ladattu"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 lisätty arvoksi %2lle"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1 aliakset vaativat työpyynnön id:n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "%1 aliakset vaativat työpyynnön id:n "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1 aliakset vaativat työpyynnön id:n (osoite %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 - %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 muutettu arvosta %2 arvoon %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 "%1 ei voinut suorittaa toimintoa (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 ei voinut asettaa tilan arvoa päätetyksi. RT:n tietokanta saattaa olla vioittunut."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr ""
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr ""
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 ei ole enää %2 tälle työjonolle"
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 ei ole enää %2 tälle työpyynnölle"
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 ei ole enää kentän %2 arvo"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 ei ole kelvollinen työjonon id"
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 ei näy"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 onnistui\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "%1 tyyppi tuntematon viestille $MessageId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "%1 tyyppi tuntematon viestille %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."
+msgstr "%1 päättää kaikki päätetyt työpyynnöt -ryhmän työpyynnöt."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr "%1 jäädyttää [paikallisen] BASE jos se riippuu linkitetystä työpyynnöstä [tai on sen jäsen]."
+
+#: lib/RT/Transaction_Overlay.pm:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: liitetiedostoa ei ole määritelty"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' ei kelpaa tilan arvoksi"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "'%1' ei ole tunnettu tapahtuma."
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete group member)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Rastita laatikko poistaaksesi skriptin)"
+
+#: 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 "(Rastita laatikko poistaaksesi)"
+
+#: 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 "(Syötä työpyynnön numerot tai www-osoitteet, välilyönneillä erotettuina)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Ei jäseniä)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Ei skriptejä)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr ""
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Lähettää piilokopion tästä päivityksestä pilkulla erotettuihin sähköpostiosoitteisiin. <b>Ei muuta</b> jatkossa tehtävien lähetysten kohteita.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Lähettää kopion tästä päivityksestä pilkulla erotettuihin sähköpostiosoitteisiin. <b>Ei muuta</b> jatkossa tehtävien lähetysten kohteita.)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(tyhjä)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr ""
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(ei otsikkoa)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(ei arvoa)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(vain yksi työpyyntö)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr ""
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(pakollinen)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr "25 omistamaani korkeimpien prioriteettien työpyyntöä..."
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr "25 tilaamaani korkeimman prioriteetin työpyyntöä..."
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr ""
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Uusi työpyyntö\">&nbsp;%1"
+
+#: 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 ""
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE ei löytynyt"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACE:ja voi vain luoda ja poistaa."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Poistuminen ei-tarkoitettujen työpyyntömuutosten välttämiseksi.\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Pääsynvalvonta"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Tapahtuma"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Tapahtumaa %1 ei löydetty"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr ""
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr ""
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Lisää kopio ylläpidolle"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Lisää kopio"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr ""
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Lisää tilaaja"
+
+#: 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 "Lisää uusi globaali lappu"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Lisää lappu tälle työjonolle"
+
+#: html/Admin/Global/Scrip.html:55
+msgid "Add a scrip which will apply to all queues"
+msgstr "Lisää kaikille työjonoille yhteinen lappu"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Lisää kommentteja tai vastauksia valituille työpyynnöille"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Lisää jäsenä"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Lisää uusia tarkkailijoita"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Lisätty toimeksiantaja %1:ksi tähän työjonoon"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Lisätty toimeksiantaja %1:ksi tälle työpyynnölle"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Osoite1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Osoite2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Kopio ylläpidolle"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr ""
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr ""
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Työjonojen ylläpito"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Käyttäjien ylläpito"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Ylläpito/Globaalit asetukset"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Ylläpito/Ryhmät"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Ylläpito/Työjono/Perustiedot"
+
+#: 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 "Kopio ylläpidolle"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr ""
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Kopio ylläpidolle"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Tarkennettu haku"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Jälkeen"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:96
+msgid "All Custom Fields"
+msgstr ""
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Kaikki työjonot"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr ""
+
+#: html/Elements/Tabs:58
+msgid "Approval"
+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)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr ""
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr ""
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr ""
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr ""
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Huhti"
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "Nouseva"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Liitä"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Liitä tiedosto"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr ""
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Liitteen '%1' lataaminen ei onnistunut"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Liitetiedosto luotu"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Liitetiedoston nimi"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Liitetiedostot"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Elo"
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr ""
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr ""
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Virheellinen PGP allekirjoitus: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Virheellinen liitteen numero. Liitetiedostoa '%1' ei löytynyt\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Virheellistä dataa kentässä %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Virheellinen toiminnon numero liitetiedostolle. %1 pitäisi olla %2\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Perustiedot"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Piilokopio"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Muista tallentaa muutokset"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "Ennen"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr ""
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr ""
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "Osoite tähän kyselyyn (selaimen kirjanmerkkeihin)"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Lyhyet otsikot"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Työpyyntöjen ryhmäpäivitys"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "Systeemikäyttäjien muokkaus ei ole sallittua"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "Kentän lisääminen ilman nimeä ei onnistu"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "Työpyyntöä ei voi linkittää itseensä"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Et voi yhdistää jo yhdistettyyn työpyyntöön. Sinun ei pitäisi saada tätä virhettä koskaan."
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "Sekä basen ja kohteen määritteleminen samalla ei ole mahdollista"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Käyttäjää ei voitu luoda: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Kopio"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Muuta salasana"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Valitse laatikko poistaaksesi oikeuden"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Lapsi"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Kaupunki"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Suljetut työpyynnöt"
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Komentoa ei ymmärretty!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Kommentoi"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Kommenttien osoite"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Kommenttia ei tallennettu"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Kommentit"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Kommentit (Ei lähetetä tilaajille)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Kommentit (Ei lähetetä tilaajille)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Kommentit kohteesta %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Kommentit tästä käyttäjästä"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Kommentit lisätty"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "Suorita tumppi"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Kokoa rajoitukset"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Ehto"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Ehtoa ei löydetty"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Ylläpito"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Varmista"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "Kontaktitietojärjestelmä"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Järjestelmä ei ymmärrä päivää '%1'"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Sisältö"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr ""
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Kirjeenvaihdon osoite"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Kirjeenvaihto lisätty"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Vastausta ei tallennettu"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "Uuden tiedon lisääminen kenttään ei onnistunut"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "Omistajaa ei voitu vaihtaa."
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Uuden kentän lisääminen ei onnistunut"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Ryhmän luominen ei onnistunut"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Ei onnistuttu luomaan pohjaa: "
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "Työpyynön luominen ei onnistunut. Työjonoa ei ole asetettu"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "Käyttäjän luominen ei onnistunut"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Työpyyntöä numero '%1' ei löytynyt."
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Ryhmää '%1' ei löytynyt."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Käyttäjää ei löydetty eikä pystytty luomaan"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Tätä toimeksiantajaa ei löytynyt"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Käyttäjää '%1' ei löytynyt."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Ryhmän lataaminen ei onnistunut"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Ei voinut tehdä toimeksiantajaa %1:ksi tälle työjonolle"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Ei voinut tehdä toimeksiantajaa tälle työpyynnölle: %1"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Ei voinut poistaa toimeksiantajaa tältä työjonolta: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Ei voinut poistaa toimeksiantajaa tältä työpyynnöltä: %1"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Jäsenen lisääminen ryhmään ei onnistunut"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Toiminnon luominen ei onnistunut: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Järjestelmä ei ymmärtänyt mitä tehdä pgp:n vastauksella\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Ryhmää ei löytynyt\\n"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Tätä toimeksiantajaa ei löytynyt"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "Tätä arvoa ei löytynyt"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Käyttäjää ei löytynyt\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Ei onnistuttu lataamaan käytäjää %1 tietokannasta.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "RT asetustiedoston lataaminen ei onnistunut:'%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "Lappujen lataaminen ei onnistunut."
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Ryhmän %1 lataaminen ei onnistunut"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Linkin lataaminen ei onnistunut"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Työjonon lataaminen ei onnistunut"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Työjonon %1 lataaminen ei onnistunut"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Lapun lataaminen ei onnistunut"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Pohjan lataaminen ei onnistunut"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Tämän käyttäjän lataaminen ei onnistunut (%1)"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Työpyynnön '%1' lataaminen ei onnistunut"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "Maa"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Luo"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Luo kenttä"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Luo uusi kenttä"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "Luo uusi globaali lappu"
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Luo uusi ryhmä"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Luo uusi personaali ryhmä"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Luo uusi työjono"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Luo uusi pohja"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Luo uusi työpyyntö"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Luo uusi käyttäjä"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Luo uusi työjono"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Luo työjono nimeltään"
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Luo työpyyntö"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Luo pohja"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr ""
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr ""
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "Luo työpyyntö"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr ""
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Luotu"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "Luotu kenttä %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Luotu pohja %1"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Tämänhetkiset suhteet"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Tämänhetkiset jäsenet"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Tämänhetkiset oikeudet"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr ""
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Tämänhetkiset tarkkailijat"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:35
+msgid "Custom Fields"
+msgstr "Kentät"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Kenttä %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Kentällä %1 on arvo"
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Kentällä %1 ei ole arvoa"
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Kenttää %1 ei löytynyt"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Kenttää ei löytynyt"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "Kenttän arvoa %1 ei löytynyt kentälle %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Kenttän arvo muutettu arvosta %1 arvoon"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "Kenttän arvoa ei pystytty poistamaan"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "Kenttän arvoa ei löydetty"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Kenttän arvo poistettu"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr ""
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Päivät"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Joulu"
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr ""
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr ""
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr ""
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr ""
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr ""
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr ""
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Delegoi oikeuksia"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr ""
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr ""
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "Poista"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Tämän objektin poistaminen saattaa rikkoa tietokannan viitteet"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Tämän objektin poistaminen rikkoo tietokannan viitteet"
+
+#: lib/RT/User_Overlay.pm:430
+msgid "Deleting this object would violate referential integrity"
+msgstr "Tämän objektin poistaminen rikkoo tietokannan viitteet"
+
+#: 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 ""
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "Tästä pyynnöstä riippuu"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Riippuvuudet: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Riippuu pyynnöstä"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "Laskeva"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Työtilauksen kuvaus"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Kuvaus"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Yksityiskohdat"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Näytä"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr ""
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Näkymä"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Näytä työpyyntö #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr ""
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Älä päivitä tätä sivua"
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Lataa"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Mennessä"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "Mennessä -päivää '%1' ei onnistuttu kääntämään järjestelmälle."
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "VIRHE: Työpyynnön '%1' lataaminen ei onnistunut: %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Muokkaa"
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Muokkaa kenttiä: työjono %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Muokkaa suhteita"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "Muokkaa lappuja"
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Muokkaa systeemipohjia"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Muokkaa pohjia: työjono %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Asetusten muokkaus: työjono %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Asetusten muokkaus: käyttäjä %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Kentän %1 muokkaus"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Ryhmän %1 jäsenten muokkaus"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Henkilökohtaisen ryhmän %1 jäsenten muokkaus"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Pohjan %1 muokkaus"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "Joko juuri tai kohde täytyy olla määritelty"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Sähköposti"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "Sähköpostiosoite on jo käytössä"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "Sähköpostiosoite"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "Sähköpostin koodaus"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr ""
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Aktiivinen (Rastin poistaminen asettaa työjonon ei-aktiiviseksi)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr ""
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Aktiiviset työjonot"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Aktivoitu tila %1"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Lisää työpyyntöjen numerot tai www-linkit. Käytä välilyöntiä erottimena syöttäessäsi useampaa numeroa tai linkkiä."
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Virhe"
+
+#: NOT FOUND IN SOURCE
+msgid "Error adding watcher"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Virhe parametreissa: Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Virhe parametreissa: Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Virhe parametreissa: Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Virhe parametreissa: Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr ""
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "Ulkoinen autentikointitunnus"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "Ulkoinen yhteystietotunnus"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Lisatieto"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "'Etuoikeutettu' -pseudoryhmää ei löytynyt"
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Ei-etuoikeutettu' -pseudoryhmää ei löytynyt"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr ""
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Helmi"
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "Fin"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Loppuprioriteetti"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr ""
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr ""
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Etsi uudet/avoimet työpyynnöt"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Etsi käyttäjät joiden"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Ensimmäinen"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Viimeinen sivu"
+
+#: docs/design_docs/string-extraction-guide.txt:33
+msgid "Foo Bar Baz"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:24
+msgid "Foo!"
+msgstr ""
+
+#: html/Search/Bulk.html:87
+msgid "Force change"
+msgstr "Pakota muutos"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "Vapaamuotoiset yhteystiedot"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr ""
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Pe"
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Kokonaiset otsikot"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr ""
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Globaali"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "Globaalit laput"
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Ok!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Hyvä PGP allekirjoitus käyttäjältä %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Siirry sivulle"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Siirry työpyyntöön"
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Ryhmä %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Ryhmän oikeudet"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "Ryhmässä on jo jäsen"
+
+#: 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"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Ryhmä luotu"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Ryhmää ei löydetty"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Ryhmää ei löydetty.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Ryhmää ei määritelty.\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Ryhmät"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Ryhmät eivät voi olla jäsentensä jäseniä"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Hei!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Hei, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Historia"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "Kotipuhelin"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Kotisivu"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Numero"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identiteetti"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr ""
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr ""
+
+#: 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 "Jos olet muuttanut tietoja, muista tallentaa"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr ""
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Sisällytä listaukseen myös ei-aktiiviset työjonot."
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Sisällytä listaukseen myös ei-aktiiviset käyttäjät."
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Alkuprioriteetti"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Virhe syötteessä"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr ""
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Ryhmän tyyppi ei kelpaa"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Omistaja ei kelpaa. Asetetaan oletusasetusten mukaan 'eikukaan'"
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Kelpaamaton työjono"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Kelpaamaton oikeus"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Kelpaamaton arvo kohteelle %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Kelpaamaton arvo kentälle"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Kelpaamaton arvo tilalle"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr ""
+
+#: bin/rt-crontool:192
+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 ""
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr ""
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Tammi"
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr ""
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Heinä"
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Jumbo"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Kesä"
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Avainsana"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Keili"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Viimeinen"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Viimeinen yhteydenotto"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Viimeksi otettu yhteyttä"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr ""
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Viimeksi päivitetty"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Vasen"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Päästä tämä käyttäjä sisään RT:een"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Tälle käyttäjälle voidaan antaa oikeuksia"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Rajoitetaan omistajaa %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Rajoitetaan työjonoa %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "Linkki on jo olemassa"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "Linkkiä ei voitu luoda"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Linkki luotu (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Linkki poistettu (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Linkkiä ei löydetty"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Linkitä työpyyntö #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Linkit"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Sijainti"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Lokihakemistoa %1 ei löytynyt tai kirkoittaminen ei onnistunut.\\n RT ei voi toimia."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Kirjautunut sisään tunnuksella %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Kirjaudu sisään"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Kirjaudu ulos"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Aseta omistaja"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Aseta tila"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Aseta mennessä -aika"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Aseta päätetty -aika"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Aseta aloitettu -aika"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Aseta alkaa -aika"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Aseta oltu yhteydessä -aika"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Aseta prioriteetti"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Aseta työjono"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Aseta otsikko"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr ""
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr ""
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr ""
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr ""
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Maasis"
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr ""
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "Touko"
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Jäsen lisätty"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Jäsen poistettu"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Jäsentä ei poistettu"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Jäsen:"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Jäsenet"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "Yhdistäminen onnistui"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Yhdistäminen epäonnistui. EffectiveId:n arvoa ei pystytty asettamaan"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Yhdistä"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Käsipuhelin"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "Käsipuhelin"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Muokkaa kenttää %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+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 ""
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Scrip.html:48
+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"
+msgstr "Muokkaa työpyynnön #%1 päiviä"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Muokkaa työpyynnön #%1 päiviä"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Muokkaa ryhmien globaaleja oikeuksia"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Muokkaa ryhmien globaaleja oikeuksia."
+
+#: 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 "Muokkaa globaaleja lappuja"
+
+#: html/Admin/Global/UserRights.html:25 html/Admin/Global/UserRights.html:28 html/Admin/Global/index.html:60
+msgid "Modify global user rights"
+msgstr ""
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Muokkaa käyttäjien globaaleja oikeuksia."
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Muokkaa ryhmän %1 oikeuksia."
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Muokkaa ryhmän oikeuksia työjonossa %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr ""
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Muokkaa työjonoon %1 liittyviä käyttäjiä"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Muokkaa työpyyntöön %1 liittyviä käyttäjiä"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Muokkaa työjonoon %1 liittyviä lappuja"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr ""
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Muokkaa pohjaa %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Muokkaa työjonoa %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Muokkaa käyttäjää %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Muokkaa työpyyntöä #%1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Muokkaa työpyyntöä #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr ""
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Muokkaa ryhmän %1 käyttäjien oikeuksia"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Muokkaa työjonoon %1 liittyviä käyttäjien oikeuksia"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Muokkaa työpyynnön %1 katselijoita"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr ""
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Ma"
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Lisätietoa: %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Monta"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "'Nimi' täytyy määritellä"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr ""
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+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"
+msgstr "Nimi"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Nimi on käytössä"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr ""
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Uusi"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Uusi salasana"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Uusi linkki"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+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 ""
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr ""
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Uusi salasana"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Uusi salasana"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Uusi työpyyntö"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Uudet oikeudet"
+
+#: 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 ""
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Uusi haku"
+
+#: 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 ""
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "Uutta työpyyntöä ei löydy"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr ""
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Uusi käyttäjä pyydetty"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Uusi tarkkailija"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Uusi ikkunan asetus"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Seuraava"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Seuraava sivu"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Lempinimi"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Lempinimi"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Ei kenttiä"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Ryhmää ei ole määritelty"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Työjonoa ei ole määritelty"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Käyttäjää ei löydy. Ole hyvä ja ota yhteyttä RT:n ylläpitäjään.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Ei pohjaa"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Työpyyntöä ei määritelty. Poistutaan työpyynnöstä"
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Työpyyntöä ei määritelty. Poistutaan työpyynnön muokkauksesta\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Komentoa ei löytynyt\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Tälle käyttäjälle ei ole annettu kommentteja"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Ei kirjeenvaihtoa liitettynä"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Ei kuvausta kohteelle %1"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "Ryhmää ei ole määritelty"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "Salasanaa ei ole asetettu"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "Ei oikeutta luoda kyselyitä"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "Ei oikeutta luoda käyttäjiä"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "Ei oikeutta tarkastella tätä työpyyntöä"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "Ei oikeutta päivittää tätä työpyyntöä"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Toimeksiantajaa ei ole määritelty"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Johtajia ei ole valittu."
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Yhtään hakukriteerit täyttävää työpyyntöä ei löytynyt."
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Ei oikeuksia"
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Ei hakua jonka kanssa työskennellä"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Työpyynnön numeroa ei ole määritelty"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "Toiminnon tyyppiä ei ole määritelty"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr ""
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Yhtään hakukriteerit täyttävää käyttäjää ei löytynyt."
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Ei kelpaa RT käyttäjäksi. RT cvs käsittelijä irrottautuu. Ole hyvä ja ota yhteyttä RT:n ylläpitäjään.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr ""
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr ""
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr ""
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "Et ole kirjautunut järjestelmään"
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Ei asetettu"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Ei vielä implementoitu."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "Ei vielä implementoitu..."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "Ilmoitusta ei pystytty lähettämään"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr ""
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr ""
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr ""
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr ""
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr ""
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr ""
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr ""
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr ""
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr ""
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr ""
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr ""
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Marras"
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr ""
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr ""
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr ""
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Loka"
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr ""
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "-"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr ""
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr ""
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr ""
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr ""
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr ""
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr ""
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr ""
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr ""
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Avoin"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Avaa"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Avoimet työpyynnöt"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Avoimet työpyynnöt (listasta) uudessa ikkunassa"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Avoimet työpyynnöt (listasta) toisessa ikkunassa"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Järjestäminen"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organisaatio"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Ajan kuluessa prioriteetti muuttuu kohti"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr ""
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Omistaja"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Omistaja pakottamalla muutettu arvosta %1 arvoon %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "Omistaja on"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Hakulaite"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "Hakulaite puhelin"
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Isät"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Salasana"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Salasanan muistuttaja"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Salasana liian lyhyt"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Salasana: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Käyttäjät"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "Pääsy kielletty"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr ""
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Omat ryhmät"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Omat ryhmät:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Puhelinnumerot"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "Paikanpitäjä"
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Asetukset"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Asetukset"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Valmistele tumppi"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Edellinen"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Edellinen sivu"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Prioriteetti"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "Prioriteetti alkaa arvosta"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Etuoikeutuksen tila: &1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Etuoikeutetut käyttäjät"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr ""
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Työjono"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Työjonoa '%1' ei löytynyt"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Työjonon nimi"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Työjonon laput"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "Työjono on jo olemassa"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "Työjonoa ei voitu luoda"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "Työjonoa ei voitu ladata."
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Työjono luotu"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr ""
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Työjonoa ei löytynyt"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Työjonot"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 - %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1, tekijä <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "RT Ylläpito"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "RT Virhe tunnistamisessa"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RT palautus: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "RT Konfiguraatiovirhe"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "RT Kriittinen virhe. Viestiä ei tallennettu!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "RT Virhe"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT Sai sähköpostin (%1) itseltään."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr ""
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT Itsepalvelu / Suljetut työpyynnöt"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT Ei pystynyt tunnistamaan sinua"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT ei löytänyt tilaajaa ulkopuolisesta tietokannasta"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT ei löytänyt työjonoa: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT ei pystynyt tarkistamaan tätä PGP allekirjoitusta.\\n"
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT on prosessoinut antamasi komennot"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT on tekijänoikeuslain alainen, &copy; 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;. Se on jakelussa seuraavalla lisenssillä: <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT luulee että tämä viesti on palautus"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT prosessoi tämän viestin kuten se olisi allekirjoittamaton."
+
+#: 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:n sähköpostiohjaus moodi vaatii PGP tunnistamista. Et allekirjoittanut (PGP) viestiä tai allekirjoitustasi ei pystytty varmistamaan."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Oikea nimi"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "Oikea nimi"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "Viitattu jostakin"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Viittaus johonkin"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Päivitä"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Päivitä haku"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Päivitä tämä sivu %1 minuutin välein"
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Linkit"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Poista kopio ylläpidolle"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Poista kopio"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Poista tilaaja"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Vastaa"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr ""
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Tilaaja"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Tilaajan sähköpostiosoite"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr ""
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Tilaajat"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Työpyyntö tulisi suorittaa mennessä"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Palauta"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Asuinpaikka"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Päätä"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr ""
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Päätetty"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Vastaus tilaajille"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Tulokset"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Tulosta sivulle"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Varmista salasana"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Oikeutta %1 ei löydetty %2  %3 laajuudessa %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Oikeus delegoitu"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Oikeus delegoitu"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Oikeus ladattu"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Oikeutta ei voitu peruuttaa"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Oikeutta ei löydetty"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Oikeutta ei ladattu"
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Oikeus peruutettu"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Oikeudet"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Roolit"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr ""
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "La"
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Tallenna muutokset"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Tallenna muutokset"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Lappu luotu"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Laput"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Laput työjonolle %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr ""
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Hae"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Hakukriteerit"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr ""
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr ""
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Valitse ryhmä"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Valitse työjono"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Valitse käyttäjä"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+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 ""
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr ""
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Itsepalvelu"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr ""
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr ""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr ""
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr ""
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr ""
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr ""
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Syys"
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Näytä tulokset"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr ""
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Näytä perustiedot"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr ""
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Näytä yksityiskohdat"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Allekirjoitus"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Yksittäinen"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Järjestys"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Järjestä tulokset"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "Lajittelujärjestyt"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Jäädytetty"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Etusivu"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Aloitettu"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "Aloitettu -aikaa '%1' ei pystytty tulkitsemaan"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Alkaa"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Alkaa mennessä"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "Alkaa -aikaa '%1' ei pystytty tulkitsemaan"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Tila"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Tila"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Tila muutettu arvosta %1 arvoon %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Kaappaa"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Kaapattu käyttäjältä %1"
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Otsikko"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr ""
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Lähetä"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr ""
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Su"
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+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 "Systeemivirhe"
+
+#: 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 "Systeemivirhe. Oikeutta ei delegoitu."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Systeemivirhe. Oikeutta ei luovutettu."
+
+#: 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 "Systeemiryhmät"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr ""
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "TESTI_STRINGI"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Ota itselle"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Otettu"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Pohja"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr ""
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Pohjaa ei löydetty"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Pohjaa ei löydetty\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Pohja tulkittu"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Pohjat"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Pohjat työjonolle %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Ei ole arvo tälle kentälle"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Tämä on sama arvo"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Tämä toimeksiantaja on jo %1 tälle työjonolle"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Tämä toimeksiantaja on jo %1 tälle työpyynnölle"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Tämä toimeksiantaja ei ole %1 tälle työjonolle"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Tämä toimeksiantaja ei ole %1 tälle työpyynnölle"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Tätä työjonoa ei ole olemassa"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Tämä työpyyntö sisältää ei-päätettyjä riippuvuuksia"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Käyttäjällä on jo tuo oikeus"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Käyttäjä omistaa jo tämän työpyynnön"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Käyttäjää ei ole olemassa"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Tämä käyttäjä on jo etuoikeutettu"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Tämä käyttäjä on jo ei-etuoikeutettu"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Tämä käyttäjä on nyt etuoikeutettu"
+
+#: lib/RT/User_Overlay.pm:344
+msgid "That user is now unprivileged"
+msgstr "Tämä käyttäjä on nyt ei-etuoikeutettu"
+
+#: 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 "Käyttäjä ei voi omistaa työpyyntöjä tuossa työjonossa"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Ei ole numero"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Perustiedot"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "Kommentti on tallennettu"
+
+#: bin/rt-crontool:198
+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 ""
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Seuraavia komentoja ei suoritettu:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr ""
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Nämä kommentit eivät ole yleisesti näkyvillä käyttäjälle"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Tämä työpyyntö %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Tämä toiminto ei näytä sisältävän mitään"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "Tämän käyttäjän 25 korkeimman prioriteetin työpyyntöä"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "To"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr "Työpyyntö # %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"
+msgstr "Työpyyntö #%1 Jumbo päivitys: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Työpyyntö %1 luotu työjonoon '%2'"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Työpyyntö %1 ladattu\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Työpyyntö %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Työpyynnön historia # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Työpyynnön numero"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Työpyynnön liite"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Työpyynnön sisältö"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Työpyynnön sisällön tyyppi"
+
+#: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Työpyyntö luotu"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Työpyynnön luonti epäonnistui"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Työpyyntö poistettu"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+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 ""
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Työpyynnön tarkkailijat"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr ""
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Työpyynnöt %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr ""
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Aikaa jäljellä"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Aikaa käytetty"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Aikaa jäljellä"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Aika"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Aikaa käytetty"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr ""
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Luodaksesi diffin tästä käskystä:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "To generate a diff of this commit:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Oltu yhteydessä"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Toiminto %1 puhdistettu"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Toiminto luotu"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Toiminnot ovat muuttumattomia"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Yritetään poistaa oikeus: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Ti"
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Tyyppi"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Toteuttamaton"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Unix login"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "Käyttäjän Unix-tunnus"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Tuntematon sisällön enkoodaus %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Rajoittamaton"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "Ottamaton"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Päivitä"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Päivitä numero"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Päivitä tyyppi"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Päivitä kaikki nämä työpyynnöt kerralla"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Päivitä sähköposti"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Päivitä nimi"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Päivitystä ei tallennettu"
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Päivitä valitut työpyynnöt"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Päivitä allekirjoitus"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Päivitä työpyyntö"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Päivitä työpyyntö # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Päivitä työpyyntö #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "Päivityksen tyyppi ei ollut kirjeenvaihto eikä kommentti."
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Päivitetty"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Käyttäjä %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Käyttäjä %1 Salasana: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Käyttäjää '%1' ei löydetty"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Käyttäjää '%1' ei löydetty\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "Käyttäjän tunnus"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Käyttäjän tunnus"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Käyttäjän oikeudet"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Käyttäjää ei voitu luoda: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Käyttäjä luotu"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Käyttäjän luomat ryhmät"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Käyttäjää informoitu"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Käyttäjän näkymä"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Käyttäjätunnus"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Käyttäjät"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Hakua vastaavat käyttäjät"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "Työpyynnon arvo"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Arvot"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Tarkkailijat"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "Web Enkoodaus"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Ke"
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr ""
+
+#: 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 ""
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr ""
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr ""
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr ""
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr ""
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr ""
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr ""
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr ""
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Työ"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "Työpuhelin"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Tehty"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "Omistat jo tämän työpyynnön"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "Et ole autorisoitu käyttäjä"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Voit palauttaa vain työpyyntöjä jotka omistat itse tai jotka ovat ilman omistajaa"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "Sinulla ei ole oikeutta tarkastella tätä työpyyntöä.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "Löysit %1 työpyyntöä työjonosta %2"
+
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "Olet kirjautunut ulos RT:stä"
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "Sinulla ei ole oikeutta luoda työpyyntöjä tähän työjonoon."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "Et ehkä voi luoda työpyyntöjä tuohon työjonoon."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "Tervetuloa kirjautumaan järjestelmään uudelleen"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Sinun %1 työpyyntöäsi"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "RT:n ylläpitäjä on konfiguroinut RT:n käynnisävät sähköpostialiakset väärin."
+
+#: etc/initialdata:429 etc/upgrade/2.1.71:146
+msgid "Your request has been approved by %1. Other approvals may still be pending."
+msgstr ""
+
+#: 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 ""
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr ""
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Käyttäjätunnuksesi tai salasanasi on väärä"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "Postinumero"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "sallittu käyttäjälle %1"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "sisältää"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "kirjeenvaihtoa (luultavasti) ei ole asetettu"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "kirjeenvaihto lähetetty"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "päivää"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr ""
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "poista"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "poistettu"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "ei täsmää"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "ei sisällä"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "on yhtäsuuri"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr ""
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "suurempi kuin"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "ryhmä %1"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "tunnit"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "numero"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "on"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "ei ole"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "vähemmän kuin"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "sisältää"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "minuuttia"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "muokkaukset\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "kuukausia"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "uusi"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr ""
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "ei mitään"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "eri suuri kuin"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "avoin"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "oma ryhmä '%1' käyttäjälle '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "työjono %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "hylätty"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "päätetty"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "sec"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "jäädytetty"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "systeemi %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "systeemiryhmä '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "kutsuva komponentti ei eritellyt syytä"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "työpyyntö #%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 "kuvalematon ryhmä %1"
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "käyttäjä %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "viikkoa"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "pohjalla %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "vuosia"
+
diff --git a/rt/lib/RT/I18N/fr.po b/rt/lib/RT/I18N/fr.po
new file mode 100644 (file)
index 0000000..4ef68fb
--- /dev/null
@@ -0,0 +1,4959 @@
+# Copyright (c) 2002 Jesse Vincent <jesse@bestpractical.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 3.0.4pre1\n"
+"POT-Creation-Date: 2002-05-02 11:36+0800\n"
+"PO-Revision-Date: 2003-07-03 02:00+0800\n"
+"Last-Translator: Blaise Thauvin <blaise@fdn.fr>\n"
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:27 html/Elements/MyTickets:27
+msgid "#"
+msgstr "n°"
+
+#: NOT FOUND IN SOURCE
+msgid "#%1"
+msgstr "n°%1"
+
+#: 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
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($Ticket->id, $Ticket->Subject)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "n°%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %2 %3 %4:%5:%6 %7"
+
+#: lib/RT/Ticket_Overlay.pm:3569 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Overlay.pm:599
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%1 %2 ajouté"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "il y a %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:3575 lib/RT/Transaction_Overlay.pm:564
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 changé en %3"
+
+#: lib/RT/Ticket_Overlay.pm:3572 lib/RT/Transaction_Overlay.pm:560 lib/RT/Transaction_Overlay.pm:605
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 supprimé"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 %2 of group %3"
+msgstr "%1 %2 du groupe %3"
+
+#: html/Admin/Elements/EditScrips:43 html/Admin/Elements/ListGlobalScrips:27
+#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name))
+msgid "%1 %2 with template %3"
+msgstr "%1 %2 avec modèle %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 ce ticket\\n"
+
+#: html/Search/Listing.html:56
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "Tickets %1 à %2"
+
+#: bin/rt-crontool:168 bin/rt-crontool:175 bin/rt-crontool:181
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - Un paramètre à passer à %2"
+
+#: bin/rt-crontool:184
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - Ecrit les mises à jour de statuts sur STDOUT"
+
+#: bin/rt-crontool:178
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Précisez l'action que vous voulez utiliser"
+
+#: bin/rt-crontool:172
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Précisez la condition que vous voulez utiliser"
+
+#: bin/rt-crontool:165
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Précisez la recherche que vous voulez utiliser"
+
+#: lib/RT/ScripAction_Overlay.pm:121
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "%1 ScripAction chargée"
+
+#: lib/RT/Ticket_Overlay.pm:3602
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 ajouté(e) comme valeur de %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "les alias %1 nécessitent un TicketId sur lequel travailler"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "les alias %1 nécessitent un TicketId sur lequel travailler "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "les alias %1 nécessitent un TicketId pour fonctionner avec (depuis %2) %3"
+
+#: lib/RT/Link_Overlay.pm:116 lib/RT/Link_Overlay.pm:123
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr "%1 semble être un objet local, mais est introuvable dans la base de données"
+
+#: html/Ticket/Elements/ShowDates:51 lib/RT/Transaction_Overlay.pm:481
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 par %2"
+
+#: lib/RT/Transaction_Overlay.pm:535 lib/RT/Transaction_Overlay.pm:675 lib/RT/Transaction_Overlay.pm:684 lib/RT/Transaction_Overlay.pm:687
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 changé(e) de %2 à %3"
+
+#: lib/RT/Interface/Web.pm:893
+msgid "%1 could not be set to %2."
+msgstr "%1 n'a pas pu être positionné à %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 n'a pas pu initialiser une transaction (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2867
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 ne peut pas mettre le statut à résolu. La base de données RT est peut être incohérente."
+
+#: html/Elements/MyTickets:24
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "Mes %1 tickets à traiter en priorité..."
+
+#: html/Elements/MyRequests:24
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "Mes %1 demandes les plus prioritaires..."
+
+#: bin/rt-crontool:160
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 est un outil agissant sur les tickets depuis un planificateur externe tel que cron"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 n'est plus un %2 pour cette queue."
+
+#: lib/RT/Ticket_Overlay.pm:1587
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 n'est plus un %2 pour ce ticket."
+
+#: lib/RT/Ticket_Overlay.pm:3658
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 n'est plus une valeur pour le champ personnalisé %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 n'est pas un identifiant de queue valide"
+
+#: html/Ticket/Elements/ShowBasics:35
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 non montré"
+
+#: html/User/Elements/DelegateRights:75
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "Droits de %1"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 réussi\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "Type %1 inconnu pour $MessageId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "type %1 inconnu pour %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 was created without a CurrentUser\\n"
+msgstr "%1 a été créé sans utilisateur courant\\n"
+
+#: lib/RT/Action/ResolveMembers.pm:41
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 résoudra tous les membres d'un ticket groupé résolu."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr "%1 va bloquer une base [locale] s'il dépend ou est membre d'une demande liée."
+
+#: lib/RT/Transaction_Overlay.pm:433
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: pas d'attachement spécifié"
+
+#: html/Ticket/Elements/ShowTransaction:88
+#. ($size)
+msgid "%1b"
+msgstr "%1b"
+
+#: html/Ticket/Elements/ShowTransaction:85
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k"
+
+#: lib/RT/Ticket_Overlay.pm:1176
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' est un statut invalide"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "'%1' n'est pas une action connue. "
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete group member)"
+msgstr "(Cocher la case pour supprimer un membre du groupe)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Cocher la case pour supprimer un 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 "(Cocher la case pour supprimer)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check boxes to delete)"
+msgstr "(Cocher la case pour supprimer)"
+
+#: html/Ticket/Create.html:177
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(Entrer les numéros de tickets ou les URLs, séparés par des espaces)"
+
+#: html/Admin/Queues/Modify.html:53 html/Admin/Queues/Modify.html:59
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "Si laissé à blanc, valeur par défaut : %1"
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(Non renseigné)"
+
+#: html/Admin/Elements/EditCustomFields:32 html/Admin/Elements/ListGlobalCustomFields:31
+msgid "(No custom fields)"
+msgstr "Pas de champ personnalisé"
+
+#: html/Admin/Groups/Members.html:49 html/User/Groups/Members.html:52
+msgid "(No members)"
+msgstr "(Aucun membre)"
+
+#: html/Admin/Elements/EditScrips:31 html/Admin/Elements/ListGlobalScrips:31
+msgid "(No scrips)"
+msgstr "(Aucun Scrip)"
+
+#: html/Admin/Elements/EditTemplates:30
+msgid "(No templates)"
+msgstr "Aucun modèle"
+
+#: html/Ticket/Update.html:83
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Envoie une copie cachée de cette mise à jour à une liste d'adresses email séparées par des virgules. Ceci <b>ne changera pas</b> les destinataires des mises à jour suivantes.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Envoie une copie cachée de cette mise à jour à une liste d'adresses email séparées par des virgules. Ceci <b>ne changera pas</b> les destinataires des mises à jour suivantes.)"
+
+#: html/Ticket/Create.html:78
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Envoie une copie de cette mise à jour à une liste d'adresses email séparées par des virgules. Ces personnes <b>recevront</b> les mises à jour suivantes.)"
+
+#: html/Ticket/Update.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Envoie une copie de cette mise à jour à une liste d'adresses email séparées par des virgules. Ceci <b>ne changera pas</b> les destinataires des mises à jour suivantes.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "Envoie une copie de cette mise à jour à une liste d'adresses email séparées par des virgules. Ceci <b>ne changera pas</b> les destinataires des mises à jour suivantes.)"
+
+#: html/Ticket/Create.html:68
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Envoie une copie de cette mise à jour à une liste d'adresses email séparées par des virgules. Ces personnes <b>recevront</b> les mises à jour suivantes.)"
+
+#: html/Admin/Groups/index.html:32 html/User/Groups/index.html:32
+msgid "(empty)"
+msgstr "(vide)"
+
+#: html/Admin/Users/index.html:38
+msgid "(no name listed)"
+msgstr "(aucun nom)"
+
+#: html/Elements/MyRequests:42 html/Elements/MyTickets:44
+msgid "(no subject)"
+msgstr "(pas de sujet)"
+
+#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:60 html/Ticket/Elements/ShowCustomFields:35 lib/RT/Transaction_Overlay.pm:534
+msgid "(no value)"
+msgstr "(non renseigné)"
+
+#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:115
+msgid "(only one ticket)"
+msgstr "(un seul ticket)"
+
+#: html/Elements/MyRequests:51 html/Elements/MyTickets:54
+msgid "(pending approval)"
+msgstr "(en attente d'approbation)"
+
+#: html/Elements/MyRequests:53 html/Elements/MyTickets:56
+msgid "(pending other tickets)"
+msgstr "(en attente d'autres tickets)"
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr "(groupe du demandeur)"
+
+#: html/Admin/Users/Modify.html:49
+msgid "(required)"
+msgstr "(exigé)"
+
+#: html/Ticket/Elements/ShowTransaction:91
+msgid "(untitled)"
+msgstr "(sans titre)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr "Mes 25 tickets à traiter en priorité..."
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr "Mes 25 demandes les plus prioritaires..."
+
+#: html/Ticket/Elements/ShowBasics:31
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Statut%>"
+
+#: html/Elements/SelectTicketTypes:26
+msgid "<% $_ %>"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Créer un ticket dans\">&nbsp;%1"
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "Un modèle vide"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE Supprimé"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE Chargé"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr "l'ACE n'a pu être supprimé"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr "l'ACE n'a pu être trouvé"
+
+#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:180
+msgid "ACE not found"
+msgstr "ACE non trouvé"
+
+#: lib/RT/ACE_Overlay.pm:830
+msgid "ACEs can only be created and deleted."
+msgstr "Les ACE peuvent seulement être créés et effacés."
+
+#: bin/rt-commit-handler:754
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Interruption pour éviter des modifications de ticket involontaires"
+
+#: html/User/Elements/Tabs:31
+msgid "About me"
+msgstr "A propos"
+
+#: html/Admin/Users/Modify.html:79
+msgid "Access control"
+msgstr "contrôle d'accès"
+
+#: html/Admin/Elements/EditScrip:56
+msgid "Action"
+msgstr "Action"
+
+#: lib/RT/Scrip_Overlay.pm:146
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Action %1 non trouvée"
+
+#: bin/rt-crontool:122
+msgid "Action committed."
+msgstr "Action validée"
+
+#: bin/rt-crontool:118
+msgid "Action prepared..."
+msgstr "Action préparée..."
+
+#: html/Search/Bulk.html:95
+msgid "Add AdminCc"
+msgstr "Ajouter AdminCC"
+
+#: html/Search/Bulk.html:91
+msgid "Add Cc"
+msgstr "Ajouter CC"
+
+#: html/Ticket/Create.html:113 html/Ticket/Update.html:98
+msgid "Add More Files"
+msgstr "Ajouter d'autres fichiers"
+
+#: NOT FOUND IN SOURCE
+msgid "Add Next State"
+msgstr "Ajouter étape suivant"
+
+#: html/Search/Bulk.html:87
+msgid "Add Requestor"
+msgstr "Ajouter Demandeur"
+
+#: html/Admin/Elements/AddCustomFieldValue:24
+msgid "Add Value"
+msgstr "Ajouter une valeur"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a keyword selection to this queue"
+msgstr "Ajouter une sélection de mots clé à cette queue"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a new a global scrip"
+msgstr "Ajouter un nouveau scrip global"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Ajouter un scrip à cette queue"
+
+#: html/Admin/Global/Scrip.html:54
+msgid "Add a scrip which will apply to all queues"
+msgstr "Ajouter un scrip qui s'ajoute à toutes les queues"
+
+#: html/Search/Bulk.html:127
+msgid "Add comments or replies to selected tickets"
+msgstr "Ajouter des commentaires ou des réponses aux tickets sélectionnés"
+
+#: html/Admin/Groups/Members.html:41 html/User/Groups/Members.html:38
+msgid "Add members"
+msgstr "Ajouter des membres"
+
+#: html/Admin/Queues/People.html:65 html/Ticket/Elements/AddWatchers:27
+msgid "Add new watchers"
+msgstr "Ajouter de nouveaux observateurs"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr "AjouterEtatSuivant"
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Ajout groupe/utilisateur comme %1 pour cette queue"
+
+#: lib/RT/Ticket_Overlay.pm:1471
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Ajout groupe/utilisateur comme %1 pour ce ticket"
+
+#: html/Admin/Elements/ModifyUser:75 html/Admin/Users/Modify.html:121 html/User/Prefs.html:87
+msgid "Address1"
+msgstr "Adresse1"
+
+#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:89
+msgid "Address2"
+msgstr "Adresse2"
+
+#: html/Ticket/Create.html:73
+msgid "Admin Cc"
+msgstr "Admin Cc"
+
+#: etc/initialdata:280
+msgid "Admin Comment"
+msgstr "Commentaire Admin"
+
+#: etc/initialdata:259
+msgid "Admin Correspondence"
+msgstr "Correspondance Admin "
+
+#: html/Admin/Queues/index.html:24 html/Admin/Queues/index.html:27
+msgid "Admin queues"
+msgstr "Administrateurs de queue"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Gérer les Utilisateurs"
+
+#: html/Admin/Global/index.html:25 html/Admin/Global/index.html:27
+msgid "Admin/Global configuration"
+msgstr "configuration Gestion/Globale"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Gestion/Groupes"
+
+#: html/Admin/Queues/Modify.html:24 html/Admin/Queues/Modify.html:28
+msgid "Admin/Queue/Basics"
+msgstr "Gestion/Queues/Essentiel"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminAllPersonalGroups"
+msgstr "GérerTousGroupesPersonnels"
+
+#: 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 "CommentaireAdministrateur"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "CorrespondanceAdministrateur"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "AdminCustomFields"
+msgstr "GérerChampsPersonnalisés"
+
+#: lib/RT/Group_Overlay.pm:145
+msgid "AdminGroup"
+msgstr "GérerGroupes"
+
+#: lib/RT/Group_Overlay.pm:147
+msgid "AdminGroupMembership"
+msgstr "GérerAppartenanceGroupes"
+
+#: lib/RT/System.pm:58
+msgid "AdminOwnPersonalGroups"
+msgstr "GérerGroupesPersonnelsPropres"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "AdminQueue"
+msgstr "GérerQueues"
+
+#: lib/RT/System.pm:59
+msgid "AdminUsers"
+msgstr "GérerUtilisateurs"
+
+#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53
+msgid "Administrative Cc"
+msgstr "Cc Administratif"
+
+#: NOT FOUND IN SOURCE
+msgid "Admins"
+msgstr "Administrateurs"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Recherche avancée"
+
+#: html/Elements/SelectDateRelation:35
+msgid "After"
+msgstr "Après"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Age"
+
+#: NOT FOUND IN SOURCE
+msgid "Alias"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Alias for"
+msgstr "Alias pour"
+
+#: etc/initialdata:348
+msgid "All Approvals Passed"
+msgstr "Toutes les approbations obtenues"
+
+#: html/Admin/Elements/EditCustomFields:95
+msgid "All Custom Fields"
+msgstr "Tous les champs personnalisés"
+
+#: html/Admin/Queues/index.html:52
+msgid "All Queues"
+msgstr "Toutes les queues"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "Envoie toujours un message au demandeur indépendamment de l'expéditeur"
+
+#: html/Elements/Tabs:55
+msgid "Approval"
+msgstr "Approbation"
+
+#: html/Approvals/Display.html:45 html/Approvals/Elements/ShowDependency:41 html/Approvals/index.html:64
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Approbation n°%1: %2"
+
+#: html/Approvals/index.html:53
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Approbation n°%1: Notes non enregistrées en raison d'une erreur système"
+
+#: html/Approvals/index.html:51
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Approbation n°%1: Notes non enregistrées"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr "Détails de l'approbation"
+
+#: etc/initialdata:336
+msgid "Approval Passed"
+msgstr "Approbations obtenues"
+
+#: etc/initialdata:359
+msgid "Approval Rejected"
+msgstr "Approbations refusées"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr "Diagramme d'approbation"
+
+#: html/Approvals/Elements/Approve:43
+msgid "Approve"
+msgstr "Approuver"
+
+#: etc/initialdata:486 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Notes de l'approbateur: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Avr."
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "Avril"
+
+#: html/Elements/SelectSortOrder:34
+msgid "Ascending"
+msgstr "Croissant"
+
+#: html/Search/Bulk.html:136 html/SelfService/Update.html:32 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:98
+msgid "Attach"
+msgstr "Attaché"
+
+#: html/SelfService/Create.html:64 html/Ticket/Create.html:109
+msgid "Attach file"
+msgstr "Attacher un ficher"
+
+#: html/Ticket/Create.html:97 html/Ticket/Update.html:87
+msgid "Attached file"
+msgstr "Fichier attaché"
+
+#: NOT FOUND IN SOURCE
+msgid "Attachment '%1' could not be loaded"
+msgstr "Attachement '%1' ne peut pas être chargé"
+
+#: lib/RT/Transaction_Overlay.pm:441
+msgid "Attachment created"
+msgstr "Attachement créé"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Nom de fichier de l'attachement"
+
+#: html/Ticket/Elements/ShowAttachments:25
+msgid "Attachments"
+msgstr "Attachements"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Aoû."
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "Août"
+
+#: html/Admin/Elements/ModifyUser:65
+msgid "AuthSystem"
+msgstr "AuthSystem"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "RéponseAuto"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "Réponse automatique aux demandeurs"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "RéponseAutomtiqueAuxDemandeurs"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Signature PGP invalide: %1\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Id d'attachement erroné. Impossible de trouver l'attachement '%1'\\n"
+
+#: bin/rt-commit-handler:826
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Données incorrectes dans %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Numéro de transaction incorrect pour l'attachement. %1 doit être %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 "Essentiel"
+
+#: html/Ticket/Update.html:81
+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:85 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 "Assurez-vous de sauvegarder vos modifications"
+
+#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:321
+msgid "Before"
+msgstr "Avant"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr "Débuter l'approbation"
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Vide"
+
+#: html/Search/Listing.html:78
+msgid "Bookmarkable URL for this search"
+msgstr "URL prédéfinie pour cette recherche"
+
+#: html/Ticket/Elements/ShowHistory:38 html/Ticket/Elements/ShowHistory:44
+msgid "Brief headers"
+msgstr "En-têtes courts"
+
+#: html/Search/Bulk.html:24 html/Search/Bulk.html:25
+msgid "Bulk ticket update"
+msgstr "modification de tickets en masse"
+
+#: lib/RT/User_Overlay.pm:1524
+msgid "Can not modify system users"
+msgstr "Les utilisateurs système ne peuvent être modifiés"
+
+#: lib/RT/Queue_Overlay.pm:66
+msgid "Can this principal see this queue"
+msgstr "Le groupe/utilisateur peut-il voir cette queue"
+
+#: lib/RT/CustomField_Overlay.pm:205
+msgid "Can't add a custom field value without a name"
+msgstr "Impossible d'ajouter une valeur de champ personnalisé sans un nom"
+
+#: lib/RT/Link_Overlay.pm:131
+msgid "Can't link a ticket to itself"
+msgstr "Un ticket ne peut être lié à lui même"
+
+#: lib/RT/Ticket_Overlay.pm:2844
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Impossible de fusionner un ticket à un ticket fusionné. Vous ne devriez jamais obtenir cette erreur"
+
+#: lib/RT/Ticket_Overlay.pm:2646 lib/RT/Ticket_Overlay.pm:2725
+msgid "Can't specifiy both base and target"
+msgstr "Impossible de spécifier à la fois la base et la cible"
+
+#: html/autohandler:113
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Impossible de créer l'utilisateur: %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:76 lib/RT/ACE_Overlay.pm:87
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:30
+msgid "Change password"
+msgstr "Changer le mot de passe"
+
+#: html/Ticket/Create.html:100 html/Ticket/Update.html:90
+msgid "Check box to delete"
+msgstr "Cocher la case pour supprimer"
+
+#: html/Admin/Elements/SelectRights:30
+msgid "Check box to revoke right"
+msgstr "Cocher la case pour retirer le droit"
+
+#: 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
+msgid "Children"
+msgstr "Fils"
+
+#: html/Admin/Elements/ModifyUser:79 html/Admin/Users/Modify.html:131 html/User/Prefs.html:91
+msgid "City"
+msgstr "Ville"
+
+#: html/Ticket/Elements/ShowDates:46
+msgid "Closed"
+msgstr "Fermé"
+
+#: html/SelfService/Closed.html:24
+msgid "Closed Tickets"
+msgstr "Tickets fermés"
+
+#: NOT FOUND IN SOURCE
+msgid "Closed requests"
+msgstr "Demandes closes"
+
+#: html/SelfService/Elements/Tabs:44
+msgid "Closed tickets"
+msgstr "Tickets fermés"
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Commande incomprise! \\n"
+
+#: html/Ticket/Elements/ShowTransaction:165 html/Ticket/Elements/Tabs:152
+msgid "Comment"
+msgstr "Commenter"
+
+#: html/Admin/Elements/ModifyQueue:44 html/Admin/Queues/Modify.html:57
+msgid "Comment Address"
+msgstr "Adresse de commentaire"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Commentaire non enregistré"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Comment on tickets"
+msgstr "Commentaire sur le ticket"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "CommentOnTicket"
+msgstr "CommenterTicket"
+
+#: html/Admin/Elements/ModifyUser:34
+msgid "Comments"
+msgstr "Commentaires"
+
+#: html/Ticket/ModifyAll.html:69 html/Ticket/Update.html:68
+msgid "Comments (Not sent to requestors)"
+msgstr "Commentaires (non envoyés aux demandeurs)"
+
+#: html/Search/Bulk.html:131
+msgid "Comments (not sent to requestors)"
+msgstr "Commentaires (non envoyés aux demandeurs)"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Comments about %1"
+msgstr "Commentaires sur %1"
+
+#: html/Admin/Users/Modify.html:184 html/Ticket/Elements/ShowRequestor:43
+msgid "Comments about this user"
+msgstr "Commentaires sur cet utilisateur"
+
+#: lib/RT/Transaction_Overlay.pm:543
+msgid "Comments added"
+msgstr "Commentaires ajoutés"
+
+#: lib/RT/Action/Generic.pm:139
+msgid "Commit Stubbed"
+msgstr "tr(Commit Stubbed)"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Restrictions de compilation"
+
+#: html/Admin/Elements/EditScrip:40
+msgid "Condition"
+msgstr "Condition"
+
+#: bin/rt-crontool:108
+msgid "Condition matches..."
+msgstr "La condition satisfait..."
+
+#: lib/RT/Scrip_Overlay.pm:159
+msgid "Condition not found"
+msgstr "Condition non trouvée"
+
+#: html/Elements/Tabs:49
+msgid "Configuration"
+msgstr "Configuration"
+
+#: html/SelfService/Prefs.html:32
+msgid "Confirm"
+msgstr "Confirmer"
+
+#: html/Admin/Elements/ModifyUser:59
+msgid "ContactInfoSystem"
+msgstr "ContactInfoSystem"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Date de contact ne peut pas être analysée"
+
+#: html/Admin/Elements/ModifyTemplate:43 html/Ticket/ModifyAll.html:86
+msgid "Content"
+msgstr "Contenu"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr "Le groupe n'a pas pu être créé"
+
+#: etc/initialdata:271
+msgid "Correspondence"
+msgstr "Courrier"
+
+#: html/Admin/Elements/ModifyQueue:38 html/Admin/Queues/Modify.html:50
+msgid "Correspondence Address"
+msgstr "Adresse de correspondance"
+
+#: lib/RT/Transaction_Overlay.pm:539
+msgid "Correspondence added"
+msgstr "Courrier ajouté"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Courrier non enregistré"
+
+#: lib/RT/Ticket_Overlay.pm:3589
+msgid "Could not add new custom field value for ticket. "
+msgstr "Impossible d'ajouter une nouvelle valeur de champ personnalisé pour ce ticket. "
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr "La valeur de champ personnalisé n'a pas pu être ajoutée. %1"
+
+#: lib/RT/Ticket_Overlay.pm:3095 lib/RT/Ticket_Overlay.pm:3103 lib/RT/Ticket_Overlay.pm:3120
+msgid "Could not change owner. "
+msgstr "Impossible de changer l'intervenant. "
+
+#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:165
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Impossible de créer un champ personnalisé CustomField"
+
+#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:473 lib/RT/Group_Overlay.pm:480
+msgid "Could not create group"
+msgstr "Impossible de créer un groupe"
+
+#: html/Admin/Global/Template.html:74 html/Admin/Queues/Template.html:71
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Impossible de créer un modèle : %1"
+
+#: lib/RT/Ticket_Overlay.pm:1109 lib/RT/Ticket_Overlay.pm:352
+msgid "Could not create ticket. Queue not set"
+msgstr "Impossible de créer un ticket. Queue non indiquée"
+
+#: lib/RT/User_Overlay.pm:267 lib/RT/User_Overlay.pm:279 lib/RT/User_Overlay.pm:297 lib/RT/User_Overlay.pm:483
+msgid "Could not create user"
+msgstr "Impossible de créer un utilisateur"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "L'observateur n'a pas pu être crée pour le demandeur"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Impossible de trouver le ticket numéro %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Impossible de trouver le groupe %1."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1439
+msgid "Could not find or create that user"
+msgstr "Impossible de trouver ou créer cet utilisateur"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1518
+msgid "Could not find that principal"
+msgstr "Impossible de trouver ce groupe ou utilisateur"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Impossible de trouver l'utilisateur %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 "Impossible de charger ce groupe"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Impossible de faire de ce groupe/utilisateur un %1 pour cette queue"
+
+#: lib/RT/Ticket_Overlay.pm:1460
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Impossible de faire de ce groupe/utilisateur un %1 pour ce ticket"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Impossible de supprimer ce groupe/utilisateur comme un %1 pour cette queue"
+
+#: lib/RT/Ticket_Overlay.pm:1576
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Impossible de supprimer ce groupe/utilisateur comme un %1 pour ce ticket"
+
+#: lib/RT/Group_Overlay.pm:984
+msgid "Couldn't add member to group"
+msgstr "Impossible d'ajouter un membre à ce groupe"
+
+#: lib/RT/Ticket_Overlay.pm:3599 lib/RT/Ticket_Overlay.pm:3655
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Impossible de créer une transaction : %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Impossible de comprendre ce qu'il faut faire avec cette réponse gpg\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Groupe introuvable\\n"
+
+#: lib/RT/Interface/Web.pm:902
+msgid "Couldn't find row"
+msgstr "Colonne introuvable"
+
+#: lib/RT/Group_Overlay.pm:958
+msgid "Couldn't find that principal"
+msgstr "groupe/utilisateur introuvable"
+
+#: lib/RT/CustomField_Overlay.pm:239
+msgid "Couldn't find that value"
+msgstr "Valeur introuvable"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "L'observateur n'a pas pu être trouvé"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Utilisateur introuvable\\n"
+
+#: lib/RT/CurrentUser.pm:111
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Impossible de charger %1 depuis la base de données des utilisateurs.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "KeywordSelects n'a pas pu être chargé"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "Impossible de charger le fichier de configuration RT '%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "Les scrips n'ont pas pu être chargés"
+
+#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Impossible de charger le groupe %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 "Impossible de charger le lien"
+
+#: html/Admin/Elements/EditCustomFields:146 html/Admin/Queues/People.html:120
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Impossible de charger la queue"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Impossible de charger la queue %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Impossible de charger le Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Impossible de charger le modèle"
+
+#: html/Admin/Users/Prefs.html:78
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Impossible de charger cet utilisateur (%1)"
+
+#: html/SelfService/Display.html:108
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Impossible de charger le ticket '%1'"
+
+#: html/Admin/Elements/ModifyUser:85 html/Admin/Users/Modify.html:148 html/User/Prefs.html:97
+msgid "Country"
+msgstr "Pays"
+
+#: html/Admin/Elements/CreateUserCalled:25 html/Ticket/Create.html:134 html/Ticket/Create.html:194
+msgid "Create"
+msgstr "Ajouter"
+
+#: etc/initialdata:127
+msgid "Create Tickets"
+msgstr "Ajouter des tickets"
+
+#: html/Admin/Elements/EditCustomField:74
+msgid "Create a CustomField"
+msgstr "Ajouter un Champ Personnalisé"
+
+#: html/Admin/Queues/CustomField.html:47
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "Ajouter un champ personnalisé à la queue %1"
+
+#: html/Admin/Global/CustomField.html:47
+msgid "Create a CustomField which applies to all queues"
+msgstr "Ajouter un champ personnalisé à toutes les queues"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Ajouter un nouveaux champ personnalisé"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "Ajouter un nouveau scrip global"
+
+#: html/Admin/Groups/Modify.html:66 html/Admin/Groups/Modify.html:92
+msgid "Create a new group"
+msgstr "Ajouter un nouveau groupe"
+
+#: html/User/Groups/Modify.html:66 html/User/Groups/Modify.html:91
+msgid "Create a new personal group"
+msgstr "Ajouter un nouveau groupe personnel"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Ajouter une nouvelle queue"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Ajouter un nouveau scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Ajouter un nouveau modèle"
+
+#: html/Ticket/Create.html:24 html/Ticket/Create.html:27 html/Ticket/Create.html:35
+msgid "Create a new ticket"
+msgstr "Ajouter un nouveau ticket"
+
+#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:240
+msgid "Create a new user"
+msgstr "Ajouter un nouvel utilisateur"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Ajouter une queue"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Ajouter une nouvelle queue appelée"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a request"
+msgstr "Ajouter une demande"
+
+#: html/Admin/Queues/Scrip.html:58
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Ajouter un scrip pour la queue %1"
+
+#: html/Admin/Global/Template.html:68 html/Admin/Queues/Template.html:64
+msgid "Create a template"
+msgstr "Ajouter un modèle"
+
+#: html/SelfService/Create.html:24
+msgid "Create a ticket"
+msgstr "Ajouter un ticket"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "Echec à la création de: %1 / %2 / %3"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr "Echec à la création de: %1/%2/%3"
+
+#: etc/initialdata:129
+msgid "Create new tickets based on this scrip's template"
+msgstr "Ajouter de nouveaux tickets basés sur le modèle de ce scrip"
+
+#: html/SelfService/Create.html:77
+msgid "Create ticket"
+msgstr "Ajouter un ticket"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Create tickets in this queue"
+msgstr "Ajouter des tickets dans cette queue"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Create, delete and modify custom fields"
+msgstr "Ajouter, supprimer et modifier des champs personnalisés"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Create, delete and modify queues"
+msgstr "Ajouter, supprimer et modifier les queues"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "Ajouter, supprime et modifie les membres des groupe spersonnels de n'importe quel utilisateur"
+
+#: lib/RT/System.pm:58
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Ajouter, supprimer et modifier les membres d'un groupe personnel"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify users"
+msgstr "Ajouter, supprimer et modifier les utilisateurs"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "CreateTicket"
+msgstr "CréerTicket"
+
+#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:26 lib/RT/Ticket_Overlay.pm:1203
+msgid "Created"
+msgstr "Créé"
+
+#: html/Admin/Elements/EditCustomField:87
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "Champ Personnalisé %1 ajouté"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Modèle %1 créé"
+
+#: html/Ticket/Elements/EditLinks:27
+msgid "Current Relationships"
+msgstr "Relations actuelles"
+
+#: html/Admin/Elements/EditScrips:29
+msgid "Current Scrips"
+msgstr "Scrips actuels"
+
+#: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41
+msgid "Current members"
+msgstr "Membres actuels"
+
+#: html/Admin/Elements/SelectRights:28
+msgid "Current rights"
+msgstr "Droits actuels"
+
+#: html/Search/Listing.html:70
+msgid "Current search criteria"
+msgstr "Critères de recherche courants"
+
+#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44
+msgid "Current watchers"
+msgstr "Observateurs actuels"
+
+#: html/Admin/Global/CustomField.html:54
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr "Champ personnalisé 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 "Champs Personnalisés"
+
+#: html/Admin/Elements/EditScrip:72
+msgid "Custom action cleanup code"
+msgstr "Programme de nettoyage d'action personnalisé"
+
+#: html/Admin/Elements/EditScrip:64
+msgid "Custom action preparation code"
+msgstr "Programme de préparation d'action personnalisé "
+
+#: html/Admin/Elements/EditScrip:48
+msgid "Custom condition"
+msgstr "Condition personnalisée"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Champs personnalisés %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Le champ personnalisé %1 a une valeur"
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Le champ personnalisé %1 n'a pas de valeur"
+
+#: lib/RT/Ticket_Overlay.pm:3491
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Le champ personnalisé %1 est introuvable"
+
+#: html/Admin/Elements/EditCustomFields:196
+msgid "Custom field deleted"
+msgstr "Champ personnalisé supprimé"
+
+#: lib/RT/Ticket_Overlay.pm:3641
+msgid "Custom field not found"
+msgstr "Le champ personnalisé est introuvable"
+
+#: lib/RT/CustomField_Overlay.pm:349
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "La valeur du champ personnalisé %1 ne peut pas être trouvée pour le champ personnalisé %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Valeur de champ personnalisé modifié de %1 à %2"
+
+#: lib/RT/CustomField_Overlay.pm:249
+msgid "Custom field value could not be deleted"
+msgstr "La valeur du champ personnalisé ne peut pas être effacée"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Custom field value could not be found"
+msgstr "La valeur du champ personnalisé ne peut par être trouvée"
+
+#: lib/RT/CustomField_Overlay.pm:247 lib/RT/CustomField_Overlay.pm:357
+msgid "Custom field value deleted"
+msgstr "La valeur du champ personnalisé est effacée"
+
+#: lib/RT/Transaction_Overlay.pm:548
+msgid "CustomField"
+msgstr "ChampPersonnalisé"
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "Erreur de données"
+
+#: 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 "Dates"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Déc."
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "Décembre"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "Modèle de réponse automatique par défaut"
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "Modèle de réponse automatique par défaut"
+
+#: etc/initialdata:281
+msgid "Default admin comment template"
+msgstr "Modèle de commentaire administrateur par défaut"
+
+#: etc/initialdata:260
+msgid "Default admin correspondence template"
+msgstr "Modèle de courrier administrateur par défaut"
+
+#: etc/initialdata:272
+msgid "Default correspondence template"
+msgstr "Modèle de courrier par défaut"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Modèle de transaction par défaut"
+
+#: lib/RT/Transaction_Overlay.pm:694
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Par défaut: %1/%2 modifié de %3 à %4"
+
+#: html/User/Delegation.html:24 html/User/Delegation.html:27
+msgid "Delegate rights"
+msgstr "Déléguer les droits"
+
+#: lib/RT/System.pm:62
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Déléguer des droits spécifiques qui vous ont été accordés"
+
+#: lib/RT/System.pm:62
+msgid "DelegateRights"
+msgstr "DéléguerDroits"
+
+#: html/User/Elements/Tabs:37
+msgid "Delegation"
+msgstr "Délégation"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "Supprimer"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Delete tickets"
+msgstr "Supprimer des tickets"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "DeleteTicket"
+msgstr "SupprimerTicket"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Effacer cet objet pourrait briser l'intégrité référentielle"
+
+#: lib/RT/Queue_Overlay.pm:293
+msgid "Deleting this object would break referential integrity"
+msgstr "Effacer cet objet briserait l'intégrité référentielle"
+
+#: lib/RT/User_Overlay.pm:499
+msgid "Deleting this object would violate referential integrity"
+msgstr "Effacer cet objet violerait l'intégrité référentielle"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity."
+msgstr "Effacer cet objet violerait l'intégrité référentielle"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity. That's bad."
+msgstr "Effacer cet objet violerait l'intégrité référentielle, c'est serait facheux!"
+
+#: html/Approvals/Elements/Approve:44
+msgid "Deny"
+msgstr "Refuser"
+
+#: 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
+msgid "Depended on by"
+msgstr "En dépend"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Dépendances : \\n"
+
+#: lib/RT/Transaction_Overlay.pm:626
+#. ($value)
+msgid "Dependency by %1 added"
+msgstr "Ajout de la dépendance par %1"
+
+#: lib/RT/Transaction_Overlay.pm:655
+#. ($value)
+msgid "Dependency by %1 deleted"
+msgstr "Suppression de la dépendance par %1"
+
+#: lib/RT/Transaction_Overlay.pm:624
+#. ($value)
+msgid "Dependency on %1 added"
+msgstr "Ajout de la dépendance de %1"
+
+#: lib/RT/Transaction_Overlay.pm:653
+#. ($value)
+msgid "Dependency on %1 deleted"
+msgstr "Suppression de la dépendance de %1"
+
+#: 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
+msgid "Depends on"
+msgstr "Dépend de"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr "DépendDe"
+
+#: html/Elements/SelectSortOrder:34
+msgid "Descending"
+msgstr "Décroissant"
+
+#: html/SelfService/Create.html:72 html/Ticket/Create.html:118
+msgid "Describe the issue below"
+msgstr "Décrivez la situation ci-dessous"
+
+#: 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 "Description"
+
+#: NOT FOUND IN SOURCE
+msgid "Details"
+msgstr "Détails"
+
+#: html/Ticket/Elements/Tabs:84
+msgid "Display"
+msgstr "Afficher"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Display Access Control List"
+msgstr "Afficher la liste des droits"
+
+#: lib/RT/Queue_Overlay.pm:74
+msgid "Display Scrip templates for this queue"
+msgstr "Afficher les modèles de Scrips pour cette queue"
+
+#: lib/RT/Queue_Overlay.pm:77
+msgid "Display Scrips for this queue"
+msgstr "Afficher les Scrips pour cette queue"
+
+#: html/Ticket/Elements/ShowHistory:34
+msgid "Display mode"
+msgstr "Mode d'affichage"
+
+#: NOT FOUND IN SOURCE
+msgid "Display ticket #%1"
+msgstr "Afficher le ticket n°%1"
+
+#: lib/RT/System.pm:53
+msgid "Do anything and everything"
+msgstr "Faire tout et n'importe quoi"
+
+#: html/Elements/Refresh:29
+msgid "Don't refresh this page."
+msgstr "Ne pas rafraîchir cette page."
+
+#: html/Search/Elements/PickRestriction:113
+msgid "Don't show search results"
+msgstr "Ne pas afficher le résultat de la recherche"
+
+#: html/Ticket/Elements/ShowTransaction:91
+msgid "Download"
+msgstr "Télécharger"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:42 lib/RT/Ticket_Overlay.pm:1207
+msgid "Due"
+msgstr "Echéance"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "Date d'échéance '%1' n'est pas comprise"
+
+#: bin/rt-commit-handler:753
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "ERREUR: impossible de charger le ticket '%1' : %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Modifier"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr "Modifier les conditions"
+
+#: html/Admin/Queues/CustomFields.html:44
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Editer les champs personnalisés pour %1"
+
+#: html/Search/Bulk.html:143 html/Ticket/ModifyLinks.html:35
+msgid "Edit Relationships"
+msgstr "Modifier les relations"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "Modifier les modèles pour la queue %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr "Modifier les mots clé"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "Modifier les scrips"
+
+#: html/Admin/Global/index.html:45
+msgid "Edit system templates"
+msgstr "Modifier les modèles système"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Modifier les modèles pour %1"
+
+#: html/Admin/Elements/ModifyQueue:24 html/Admin/Queues/Modify.html:118
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Modifier la configuration de la queue %1"
+
+#: html/Admin/Elements/ModifyUser:24
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Modifier la configuration de l'utilisateur %1"
+
+#: html/Admin/Elements/EditCustomField:90
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Modifier le ChampPersonnalisé %1"
+
+#: html/Admin/Groups/Members.html:31
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Modifier les membres du groupe %1"
+
+#: html/User/Groups/Members.html:128
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Modifier les membres du groupe personnel %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Modifie le modèle %1"
+
+#: lib/RT/Ticket_Overlay.pm:2660 lib/RT/Ticket_Overlay.pm:2738
+msgid "Either base or target must be specified"
+msgstr "La base ou la cible doivent être spécifiées"
+
+#: 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:247
+msgid "Email address in use"
+msgstr "Adresse email utilisée"
+
+#: html/Admin/Elements/ModifyUser:41
+msgid "EmailAddress"
+msgstr "EmailAddress"
+
+#: html/Admin/Elements/ModifyUser:53
+msgid "EmailEncoding"
+msgstr "EmailEncoding"
+
+#: html/Admin/Elements/EditCustomField:50
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "Activé (Décocher cette case désactive ce champ personnalisé)"
+
+#: html/Admin/Groups/Modify.html:52 html/User/Groups/Modify.html:52
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "Activé (Décocher cette case désactive ce groupe)"
+
+#: html/Admin/Queues/Modify.html:83
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Activé (Décocher cette case désactive cette queue)"
+
+#: html/Admin/Elements/EditCustomFields:98
+msgid "Enabled Custom Fields"
+msgstr "Champs personnalisés actifs"
+
+#: html/Admin/Queues/index.html:55
+msgid "Enabled Queues"
+msgstr "Queues actives"
+
+#: 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
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Statut actif %1"
+
+#: lib/RT/CustomField_Overlay.pm:427
+msgid "Enter multiple values"
+msgstr "Entrer plusieurs valeurs"
+
+#: lib/RT/CustomField_Overlay.pm:424
+msgid "Enter one value"
+msgstr "Entrer une seule valeur"
+
+#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:111
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Saisir les tickets ou URIs pour y lier les tickets. Séparer les saisies par des espaces."
+
+#: html/Elements/Login:39 html/SelfService/Error.html:24 html/SelfService/Error.html:25
+msgid "Error"
+msgstr "Erreur"
+
+#: NOT FOUND IN SOURCE
+msgid "Error adding watcher"
+msgstr "Erreur à l'ajout de l'observateur"
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Erreur de paramètres pour Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Erreur de paramètres pour Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1392
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Erreur de paramètres pour Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1549
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Erreur de paramètres pour Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Tout le monde"
+
+#: bin/rt-crontool:193
+msgid "Example:"
+msgstr "Exemple:"
+
+#: 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 "Info supplémentaire"
+
+#: lib/RT/User_Overlay.pm:363
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Recherche du pseudo groupe d'utilisateurs 'Priviligiés' infructueuse"
+
+#: lib/RT/User_Overlay.pm:370
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Recherche du pseudo groupe d'utilisateurs 'non-privilégiés' infructueuse"
+
+#: bin/rt-crontool:137
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Echec de chargement du module %1. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Fév."
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "Février"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "Fin"
+
+#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Priorité finale"
+
+#: lib/RT/Ticket_Overlay.pm:1198
+msgid "FinalPriority"
+msgstr "PrioritéFinale"
+
+#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33
+msgid "Find group whose"
+msgstr "Trouver un groupe dont"
+
+#: NOT FOUND IN SOURCE
+msgid "Find new/open tickets"
+msgstr "Accéder aux tickets en cours"
+
+#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29
+msgid "Find people whose"
+msgstr "Trouver les gens dont"
+
+#: html/Search/Listing.html:107
+msgid "Find tickets"
+msgstr "Rechercher des tickets"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr "Terminer l'approbation"
+
+#: html/Ticket/Elements/Tabs:57
+msgid "First"
+msgstr "Premier"
+
+#: html/Search/Listing.html:40
+msgid "First page"
+msgstr "Première page"
+
+#: 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 "Forcer la modification"
+
+#: html/Search/Listing.html:105
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "%quant(%1,ticket) trouvés"
+
+#: lib/RT/Interface/Web.pm:904
+msgid "Found Object"
+msgstr "Objet trouvé"
+
+#: html/Admin/Elements/ModifyUser:43
+msgid "FreeformContactInfo"
+msgstr "SaisieLibreInfoContact"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformMultiple"
+msgstr "SaisieLibreMultiple"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "FreeformSingle"
+msgstr "SaisieLibreSimple"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Ven."
+
+#: html/Ticket/Elements/ShowHistory:40 html/Ticket/Elements/ShowHistory:50
+msgid "Full headers"
+msgstr "En-têtes complets"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Obtention de l'utilisateur courant depuis une signature pgp\\n"
+
+#: lib/RT/Transaction_Overlay.pm:593
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "Donné à %1"
+
+#: html/Admin/Elements/Tabs:40 html/Admin/index.html:37
+msgid "Global"
+msgstr "Global"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr "Mots clé globaux"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "Scrips globaux"
+
+#: html/Admin/Elements/SelectTemplate:37
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Modèle global: %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 "Go!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Signature pgp valide pour %1\\n"
+
+#: html/Search/Listing.html:49
+msgid "Goto page"
+msgstr "Aller à la page"
+
+#: html/Elements/GotoTicket:24 html/SelfService/Elements/GotoTicket:24
+msgid "Goto ticket"
+msgstr "Aller au ticket"
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr "Accorder"
+
+#: html/Ticket/Elements/AddWatchers:45 html/User/Elements/DelegateRights:77
+msgid "Group"
+msgstr "Groupe"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Groupe %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 "Droits de groupe"
+
+#: lib/RT/Group_Overlay.pm:964
+msgid "Group already has member"
+msgstr "Le groupe a déjà un membre"
+
+#: NOT FOUND IN SOURCE
+msgid "Group could not be created."
+msgstr "Le groupe n'a pas pu être créé"
+
+#: html/Admin/Groups/Modify.html:76
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "Le groupe %1 n'a pu être créé"
+
+#: lib/RT/Group_Overlay.pm:496
+msgid "Group created"
+msgstr "Groupe ajouté"
+
+#: lib/RT/Group_Overlay.pm:1132
+msgid "Group has no such member"
+msgstr "Un tel membre n'appartient pas au groupe"
+
+#: lib/RT/Group_Overlay.pm:944 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1446 lib/RT/Ticket_Overlay.pm:1524
+msgid "Group not found"
+msgstr "Groupe introuvable"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Groupe introuvable.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Groupe non spécifié.\\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 "Groupes"
+
+#: lib/RT/Group_Overlay.pm:970
+msgid "Groups can't be members of their members"
+msgstr "Les groupes ne peuvent pas être membres de leurs membres"
+
+#: lib/RT/Interface/CLI.pm:72 lib/RT/Interface/CLI.pm:72
+msgid "Hello!"
+msgstr "Bonjour!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Bonjour, %1"
+
+#: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:87
+msgid "History"
+msgstr "Historique"
+
+#: html/Admin/Elements/ModifyUser:67
+msgid "HomePhone"
+msgstr "Téléphone domicile"
+
+#: html/Elements/Tabs:43
+msgid "Homepage"
+msgstr "Page d'accueil"
+
+#: lib/RT/Base.pm:73
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "J'ai %quant (%1, toupie à béton)"
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "J'ai %quant (%1, toupie à béton)"
+
+#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Identifiant"
+
+#: html/Admin/Users/Modify.html:43 html/User/Prefs.html:38
+msgid "Identity"
+msgstr "Identité"
+
+#: etc/initialdata:411 etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Si une approbation est refusée, rejette l'original et supprime les approbations en attente"
+
+#: 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 "Si cet outil était setgid, un utilisateur local mal intentionné pourrait l'utiliser pour obtenir un access administrateur à 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 "Si vous avez fait une modification, assurez vous de"
+
+#: lib/RT/Interface/Web.pm:896
+msgid "Illegal value for %1"
+msgstr "Valeur incorrecte pour %1"
+
+#: lib/RT/Interface/Web.pm:899
+msgid "Immutable field"
+msgstr "Champ non modifiable"
+
+#: html/Admin/Elements/EditCustomFields:73
+msgid "Include disabled custom fields in listing."
+msgstr "Inclure les champs personnalisés désactivés dans la liste"
+
+#: html/Admin/Queues/index.html:42
+msgid "Include disabled queues in listing."
+msgstr "Afficher les queues inactives."
+
+#: html/Admin/Users/index.html:46
+msgid "Include disabled users in search."
+msgstr "Inclure les utilisateurs désactivés dans le résultat"
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Priorité initiale"
+
+#: lib/RT/Ticket_Overlay.pm:1197 lib/RT/Ticket_Overlay.pm:1199
+msgid "InitialPriority"
+msgstr "PrioritéInitiale"
+
+#: lib/RT/ScripAction_Overlay.pm:104
+msgid "Input error"
+msgstr "Erreur à l'entrée"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr "Votre intéret est noté"
+
+#: lib/RT/Ticket_Overlay.pm:3866
+msgid "Internal Error"
+msgstr "Erreur interne"
+
+#: lib/RT/Record.pm:142
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Erreur interne: %1"
+
+#: lib/RT/Group_Overlay.pm:643
+msgid "Invalid Group Type"
+msgstr "Type de groupe invalide"
+
+#: lib/RT/Principal_Overlay.pm:127
+msgid "Invalid Right"
+msgstr "Droit invalide"
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "Type invalide"
+
+#: lib/RT/Interface/Web.pm:901
+msgid "Invalid data"
+msgstr "Données invalides"
+
+#: lib/RT/Ticket_Overlay.pm:457
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Intervenant invalide, affectation à 'personne'"
+
+#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:250
+msgid "Invalid queue"
+msgstr "Queue invalide"
+
+#: 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 "Droit invalide"
+
+#: lib/RT/Record.pm:117
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Queue invalide pour %1"
+
+#: lib/RT/Ticket_Overlay.pm:3498
+msgid "Invalid value for custom field"
+msgstr "Valeur incorrecte pour le champ personnalisé"
+
+#: lib/RT/Ticket_Overlay.pm:364
+msgid "Invalid value for status"
+msgstr "Valeur de statut invalide"
+
+#: bin/rt-crontool:190
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Il est extrêmement important que les utilisateurs non authorisés n'aient pas accès à cet outil"
+
+#: 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 "Il est suggéré de créer un utilisateur unix non privilégié appartenant au bon groupe et ayant accès à RT pour utiliser cet outil"
+
+#: bin/rt-crontool:162
+msgid "It takes several arguments:"
+msgstr "Il faut plusieurs paramètres:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Eléments attendant mon approbation"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Jan."
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "Janvier"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Join or leave this group"
+msgstr "Rejoignez ou quittez ce groupe"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Jul."
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "Juillet"
+
+#: html/Ticket/Elements/Tabs:98
+msgid "Jumbo"
+msgstr "Tout"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Jun."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "Juin"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Mot Clé"
+
+#: html/Admin/Elements/ModifyUser:51
+msgid "Lang"
+msgstr "Lang"
+
+#: html/Ticket/Elements/Tabs:72
+msgid "Last"
+msgstr "Dernier"
+
+#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:38
+msgid "Last Contact"
+msgstr "Dernier contact"
+
+#: html/Elements/SelectDateType:28
+msgid "Last Contacted"
+msgstr "Date dernier contact"
+
+#: html/Search/Elements/TicketHeader:40
+msgid "Last Notified"
+msgstr "Dernière notification"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Updated"
+msgstr "Date dernière MAJ"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr "DernièreMAJ"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Restant"
+
+#: html/Admin/Users/Modify.html:82
+msgid "Let this user access RT"
+msgstr "Donner accès à RT à cet utilisateur"
+
+#: html/Admin/Users/Modify.html:86
+msgid "Let this user be granted rights"
+msgstr "Autoriser cet utilisateur à recevoir des droits"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Limitation des intervenants à %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Limitation de la queue à %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2752
+msgid "Link already exists"
+msgstr "Le lien existe déja"
+
+#: lib/RT/Ticket_Overlay.pm:2764
+msgid "Link could not be created"
+msgstr "Le lien ne peut être ajouté"
+
+#: lib/RT/Ticket_Overlay.pm:2772 lib/RT/Ticket_Overlay.pm:2784
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Le lien est ajouté (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2685
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Le lien est effacé (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2691
+msgid "Link not found"
+msgstr "Lien introuvable"
+
+#: html/Ticket/ModifyLinks.html:24 html/Ticket/ModifyLinks.html:28
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Lier le ticket n°%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr "Lier au ticket %1"
+
+#: html/Ticket/Elements/Tabs:96
+msgid "Links"
+msgstr "Relations"
+
+#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:84
+msgid "Location"
+msgstr "Localisation"
+
+#: lib/RT.pm:162
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Le répertoire de log %1 est introuvable ou en lecture seule. \\n RT ne peut pas démarrer"
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Connecté en tant que %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54
+msgid "Login"
+msgstr "Connexion"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Déconnexion"
+
+#: html/Search/Bulk.html:85
+msgid "Make Owner"
+msgstr "Attribuer"
+
+#: html/Search/Bulk.html:109
+msgid "Make Status"
+msgstr "Appliquer Statut"
+
+#: html/Search/Bulk.html:117
+msgid "Make date Due"
+msgstr "Appliquer date d'échéance"
+
+#: html/Search/Bulk.html:119
+msgid "Make date Resolved"
+msgstr "Appliquer date de résolution"
+
+#: html/Search/Bulk.html:113
+msgid "Make date Started"
+msgstr "Appliquer date de début"
+
+#: html/Search/Bulk.html:111
+msgid "Make date Starts"
+msgstr "Appliquer date d'ouverture"
+
+#: html/Search/Bulk.html:115
+msgid "Make date Told"
+msgstr "Appliquer Age"
+
+#: html/Search/Bulk.html:105
+msgid "Make priority"
+msgstr "Appliquer priorité"
+
+#: html/Search/Bulk.html:107
+msgid "Make queue"
+msgstr "Appliquer queue"
+
+#: html/Search/Bulk.html:103
+msgid "Make subject"
+msgstr "Changer le sujet"
+
+#: html/Admin/index.html:32
+msgid "Manage groups and group membership"
+msgstr "Gérer les groupes et leurs membres"
+
+#: html/Admin/index.html:38
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Gérer les propriétés et configurations générales des queues"
+
+#: html/Admin/index.html:35
+msgid "Manage queues and queue-specific properties"
+msgstr "Gérer les queues et leurs propriétés individuelles"
+
+#: html/Admin/index.html:29
+msgid "Manage users and passwords"
+msgstr "Gérer les utilisateurs et mots de passe"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Mar."
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "Mars"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "Mai"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "Mai."
+
+#: lib/RT/Transaction_Overlay.pm:635
+#. ($value)
+msgid "Member %1 added"
+msgstr "Membre %1 ajouté"
+
+#: lib/RT/Transaction_Overlay.pm:664
+#. ($value)
+msgid "Member %1 deleted"
+msgstr "Membre %1 supprimé"
+
+#: lib/RT/Group_Overlay.pm:981
+msgid "Member added"
+msgstr "Membre ajouté"
+
+#: lib/RT/Group_Overlay.pm:1139
+msgid "Member deleted"
+msgstr "Membre supprimé"
+
+#: lib/RT/Group_Overlay.pm:1143
+msgid "Member not deleted"
+msgstr "Membre non supprimé"
+
+#: html/Elements/SelectLinkType:25
+msgid "Member of"
+msgstr "Membre de"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "MembreDe"
+
+#: html/Admin/Elements/GroupTabs:41 html/User/Elements/GroupTabs:41
+msgid "Members"
+msgstr "Membres"
+
+#: lib/RT/Transaction_Overlay.pm:633
+#. ($value)
+msgid "Membership in %1 added"
+msgstr "Appartenance à %1 ajoutée"
+
+#: lib/RT/Transaction_Overlay.pm:662
+#. ($value)
+msgid "Membership in %1 deleted"
+msgstr "Appartenance à %1 supprimée"
+
+#: lib/RT/Ticket_Overlay.pm:2941
+msgid "Merge Successful"
+msgstr "Fusion réussie"
+
+#: lib/RT/Ticket_Overlay.pm:2861
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Echec de fusion. Ne peut appliquer EffectiveId"
+
+#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:114
+msgid "Merge into"
+msgstr "Fusionner dans"
+
+#: html/Search/Bulk.html:137 html/Ticket/Update.html:100
+msgid "Message"
+msgstr "Message"
+
+#: lib/RT/Interface/Web.pm:903
+msgid "Missing a primary key?: %1"
+msgstr "Clé primaire manquante? : %1"
+
+#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:53
+msgid "Mobile"
+msgstr "Mobile"
+
+#: html/Admin/Elements/ModifyUser:71
+msgid "MobilePhone"
+msgstr "MobilePhone"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Modify Access Control List"
+msgstr "Modifier la liste de droits"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Modifier champ personnalisé %1"
+
+#: html/Admin/Global/CustomFields.html:43 html/Admin/Global/index.html:50
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "Modifier les champs personnalisés globaux"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Modify Scrip templates for this queue"
+msgstr "Modifier les modèles de Scrips pour cette queue"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Modify Scrips for this queue"
+msgstr "Modifier les Scrips pour cette queue"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify System ACLS"
+msgstr "Modifier ACLs système"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr "Modifier le modèle %1"
+
+#: html/Admin/Queues/CustomField.html:44
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "Modifier un champ personnalisé pour la queue %1"
+
+#: html/Admin/Global/CustomField.html:52
+msgid "Modify a CustomField which applies to all queues"
+msgstr "Modifier un champ personnalisé global"
+
+#: html/Admin/Queues/Scrip.html:53
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Modifier le scrip pour la queue %1"
+
+#: html/Admin/Global/Scrip.html:47
+msgid "Modify a scrip which applies to all queues"
+msgstr "Modiier le scrip qui s'applique à toutes les queues"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "Modifier les dates pur n°%1"
+
+#: html/Ticket/ModifyDates.html:24 html/Ticket/ModifyDates.html:28
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Modifier les dates pour n°%1"
+
+#: html/Ticket/ModifyDates.html:34
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Modifier les dates du 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 "Modifier les droits de groupe globaux"
+
+#: html/Admin/Global/GroupRights.html:32
+msgid "Modify global group rights."
+msgstr "Modifier les droits de groupe globaux"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for groups"
+msgstr "Modifier les droits globaux des groupes"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for users"
+msgstr "Modifier les droits globaux des utilisateurs"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global scrips"
+msgstr "Modifier les scrips globaux"
+
+#: html/Admin/Global/UserRights.html:24 html/Admin/Global/UserRights.html:27 html/Admin/Global/index.html:59
+msgid "Modify global user rights"
+msgstr "Modifier les droits utilisateurs globaux"
+
+#: html/Admin/Global/UserRights.html:32
+msgid "Modify global user rights."
+msgstr "Modifier les droits utilisateurs globaux"
+
+#: lib/RT/Group_Overlay.pm:145
+msgid "Modify group metadata or delete group"
+msgstr "Modifier les métadonnées ou supprimer le groupe"
+
+#: html/Admin/Groups/GroupRights.html:24 html/Admin/Groups/GroupRights.html:28 html/Admin/Groups/GroupRights.html:34
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Modifier les droits du groupe %1"
+
+#: html/Admin/Queues/GroupRights.html:24 html/Admin/Queues/GroupRights.html:28
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Modifier les droits de groupe pour la queue %1"
+
+#: lib/RT/Group_Overlay.pm:147
+msgid "Modify membership roster for this group"
+msgstr "Modifier le membership roster pour ce groupe"
+
+#: lib/RT/System.pm:60
+msgid "Modify one's own RT account"
+msgstr "Modifier son propre profile RT"
+
+#: html/Admin/Queues/People.html:24 html/Admin/Queues/People.html:28
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Modifier les utilisateurs de la queue %1"
+
+#: html/Ticket/ModifyPeople.html:24 html/Ticket/ModifyPeople.html:28 html/Ticket/ModifyPeople.html:34
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Modifier les utilisateurs du ticket n°%1"
+
+#: html/Admin/Queues/Scrips.html:45
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Modifier les scrips de la queue %1"
+
+#: html/Admin/Global/Scrips.html:43 html/Admin/Global/index.html:41
+msgid "Modify scrips which apply to all queues"
+msgstr "Modifier les scrips s'appliquant à toutes les queues"
+
+#: html/Admin/Global/Template.html:24 html/Admin/Global/Template.html:29 html/Admin/Global/Template.html:80 html/Admin/Queues/Template.html:77
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Modifier le modèle %1"
+
+#: html/Admin/Global/Templates.html:43
+msgid "Modify templates which apply to all queues"
+msgstr "Modifier les modèles globaux"
+
+#: html/Admin/Groups/Modify.html:86 html/User/Groups/Modify.html:85
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Modifier le groupe %1"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify the queue watchers"
+msgstr "Modifier les observateurs de la queue"
+
+#: html/Admin/Users/Modify.html:235
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Modifier l'utilisateur %1"
+
+#: html/Ticket/ModifyAll.html:36
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Modifier le ticket # %1"
+
+#: html/Ticket/Modify.html:24 html/Ticket/Modify.html:27 html/Ticket/Modify.html:33
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Modifier le ticket n°%1"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Modify tickets"
+msgstr "Modifier les tickets"
+
+#: html/Admin/Groups/UserRights.html:24 html/Admin/Groups/UserRights.html:28 html/Admin/Groups/UserRights.html:34
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Modifier les droits utilisateurs pour le groupe %1"
+
+#: html/Admin/Queues/UserRights.html:24 html/Admin/Queues/UserRights.html:28
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Modifier les droits utilisateurs pour la queue %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Modifier les observateurs dela queue '%1'"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ModifyACL"
+msgstr "ModifierACL"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "ModifyOwnMembership"
+msgstr "ModifierPropresAppartenances"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyQueueWatchers"
+msgstr "ModifierObservateurs"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ModifyScrips"
+msgstr "ModifierScrips"
+
+#: lib/RT/System.pm:60
+msgid "ModifySelf"
+msgstr "ModifierDonnéesPerso"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "ModifyTemplate"
+msgstr "ModifierModèle"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "ModifyTicket"
+msgstr "ModifierTicket"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Lun."
+
+#: html/Ticket/Elements/ShowRequestor:41
+#. ($name)
+msgid "More about %1"
+msgstr "Plus d'info sur %1"
+
+#: html/Admin/Elements/EditCustomFields:60
+msgid "Move down"
+msgstr "Aller en bas"
+
+#: html/Admin/Elements/EditCustomFields:52
+msgid "Move up"
+msgstr "Aller en haut"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Multiple"
+msgstr "Multiple"
+
+#: lib/RT/User_Overlay.pm:238
+msgid "Must specify 'Name' attribute"
+msgstr "Attribut 'Nom' obligatoire"
+
+#: html/SelfService/Elements/MyRequests:48
+#. ($friendly_status)
+msgid "My %1 tickets"
+msgstr "Mes %1 tickets"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Mes approbations"
+
+#: html/Approvals/index.html:24 html/Approvals/index.html:25
+msgid "My approvals"
+msgstr "Mes approbations"
+
+#: 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 "Nom"
+
+#: lib/RT/User_Overlay.pm:245
+msgid "Name in use"
+msgstr "Nom utilisé"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "Approbation de l'administrateur système nécessaire"
+
+#: html/Ticket/Elements/ShowDates:51
+msgid "Never"
+msgstr "Jamais"
+
+#: html/Elements/Quicksearch:29
+msgid "New"
+msgstr "Nouveau"
+
+#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/User/Prefs.html:64
+msgid "New Password"
+msgstr "Nouveau mot de passe"
+
+#: etc/initialdata:317 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Nouvelles approbations en attente"
+
+#: html/Ticket/Elements/EditLinks:110
+msgid "New Relationships"
+msgstr "Nouvelles relations"
+
+#: html/Ticket/Elements/Tabs:35
+msgid "New Search"
+msgstr "Nouvelle recherche"
+
+#: 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 "Nouveau champ personnalisé"
+
+#: html/Admin/Elements/GroupTabs:53 html/User/Elements/GroupTabs:51
+msgid "New group"
+msgstr "Nouveau groupe"
+
+#: html/SelfService/Prefs.html:31
+msgid "New password"
+msgstr "Nouveau mot de passe"
+
+#: lib/RT/User_Overlay.pm:764
+msgid "New password notification sent"
+msgstr "Notification de nouveau mot de passe envoyée"
+
+#: html/Admin/Elements/QueueTabs:69
+msgid "New queue"
+msgstr "Nouvelle queue"
+
+#: NOT FOUND IN SOURCE
+msgid "New request"
+msgstr "Nouvelle demande"
+
+#: html/Admin/Elements/SelectRights:41
+msgid "New rights"
+msgstr "Nouveaux droits"
+
+#: html/Admin/Global/Scrip.html:39 html/Admin/Global/Scrips.html:38 html/Admin/Queues/Scrip.html:42 html/Admin/Queues/Scrips.html:54
+msgid "New scrip"
+msgstr "Nouveau scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Nouvelle recherche"
+
+#: 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 "Nouveau modèle"
+
+#: html/SelfService/Elements/Tabs:47
+msgid "New ticket"
+msgstr "Nouveau ticket"
+
+#: lib/RT/Ticket_Overlay.pm:2828
+msgid "New ticket doesn't exist"
+msgstr "Nouveau ticket inconnu"
+
+#: html/Admin/Elements/UserTabs:51
+msgid "New user"
+msgstr "Nouvel utilisateur"
+
+#: html/Admin/Elements/CreateUserCalled:25
+msgid "New user called"
+msgstr "Nouvel utilisateur appelé"
+
+#: html/Admin/Queues/People.html:54 html/Ticket/Elements/EditPeople:28
+msgid "New watchers"
+msgstr "Nouveaux observateurs"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "New window setting"
+msgstr "Nouveaux paramètres d'affichage"
+
+#: html/Ticket/Elements/Tabs:68
+msgid "Next"
+msgstr "Suivant"
+
+#: html/Search/Listing.html:47
+msgid "Next page"
+msgstr "Page suivante"
+
+#: html/Admin/Elements/ModifyUser:49
+msgid "NickName"
+msgstr "Surnom"
+
+#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:45
+msgid "Nickname"
+msgstr "Surnom"
+
+#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:104
+msgid "No CustomField"
+msgstr "Pas de CustomField"
+
+#: html/Admin/Groups/GroupRights.html:83 html/Admin/Groups/UserRights.html:70
+msgid "No Group defined"
+msgstr "Aucun groupe défini"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:67
+msgid "No Queue defined"
+msgstr "Aucune queue définie"
+
+#: bin/rt-crontool:55
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Aucun utilisateur RT trouvé. Merci de consulter votre administrateur RT"
+
+#: html/Admin/Global/Template.html:78 html/Admin/Queues/Template.html:75
+msgid "No Template"
+msgstr "Pas de modèle"
+
+#: bin/rt-commit-handler:763
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Aucun ticket spécifié. Annulation de ticket"
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Aucun ticket spécifié. Annulation des modifications de tickets\\n\\n"
+
+#: html/Approvals/Elements/Approve:45
+msgid "No action"
+msgstr "Pas d'action"
+
+#: lib/RT/Interface/Web.pm:898
+msgid "No column specified"
+msgstr "Aucune colonne spécifiée"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Commande introuvable\\n"
+
+#: html/Elements/ViewUser:35 html/Ticket/Elements/ShowRequestor:44
+msgid "No comment entered about this user"
+msgstr "Pas de commentaires concernant cet utilisateur"
+
+#: lib/RT/Ticket_Overlay.pm:2220 lib/RT/Ticket_Overlay.pm:2288
+msgid "No correspondence attached"
+msgstr "Pas de texte dans le courrier"
+
+#: lib/RT/Action/Generic.pm:149 lib/RT/Condition/Generic.pm:175 lib/RT/Search/ActiveTicketsInQueue.pm:55 lib/RT/Search/Generic.pm:112
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Aucune description disponible pour %1"
+
+#: lib/RT/Users_Overlay.pm:150
+msgid "No group specified"
+msgstr "Aucun groupe spécifié"
+
+#: lib/RT/User_Overlay.pm:982
+msgid "No password set"
+msgstr "Pas de mot de passe configuré"
+
+#: lib/RT/Queue_Overlay.pm:260
+msgid "No permission to create queues"
+msgstr "Permission refusée pour la création de queue"
+
+#: lib/RT/Ticket_Overlay.pm:360
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "Vous n'êtes pas autorisé à créer un ticket dans cette queue '%1'"
+
+#: lib/RT/User_Overlay.pm:211
+msgid "No permission to create users"
+msgstr "Permission refusée pour la création d'utilisateurs"
+
+#: html/SelfService/Display.html:117
+msgid "No permission to display that ticket"
+msgstr "Pas de permission pour afficher ce ticket"
+
+#: html/SelfService/Update.html:51
+msgid "No permission to view update ticket"
+msgstr "Pas de permission pour afficher le ticket mis à jour"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1505
+msgid "No principal specified"
+msgstr "Aucun groupe/utilisateur spécifié"
+
+#: html/Admin/Queues/People.html:153 html/Admin/Queues/People.html:163
+msgid "No principals selected."
+msgstr "Aucun groupe/utilisateur sélectionné"
+
+#: html/Admin/Queues/index.html:34
+msgid "No queues matching search criteria found."
+msgstr "Pas de queue correspondant aux critères de recherche"
+
+#: html/Admin/Elements/SelectRights:80
+msgid "No rights found"
+msgstr "Aucun droit trouvé"
+
+#: html/Admin/Elements/SelectRights:32
+msgid "No rights granted."
+msgstr "Aucun droit accordé"
+
+#: html/Search/Bulk.html:160
+msgid "No search to operate on."
+msgstr "Pas de critère de recherche."
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Aucun numéro de ticket spécifié."
+
+#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516
+msgid "No transaction type specified"
+msgstr "Aucun type de transaction spécifié."
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "Aucun utilisateur ou adresse email spécifié"
+
+#: html/Admin/Users/index.html:35
+msgid "No users matching search criteria found."
+msgstr "Aucun utilisateur ne correspond aux critères de recherche."
+
+#: bin/rt-commit-handler:643
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Aucun utilisateur RT valide trouvé. Gestionnaire de cvs RT inaccessible. Merci de contacter votre administrateur RT.\\n"
+
+#: lib/RT/Interface/Web.pm:895
+msgid "No value sent to _Set!\\n"
+msgstr "Aucune valeur envoyée à _Set!\\n"
+
+#: html/Search/Elements/TicketRow:36
+msgid "Nobody"
+msgstr "Personne"
+
+#: lib/RT/Interface/Web.pm:900
+msgid "Nonexistant field?"
+msgstr "Champ inexistant?"
+
+#: NOT FOUND IN SOURCE
+msgid "Not logged in"
+msgstr "Non loggé"
+
+#: html/Elements/Header:59
+msgid "Not logged in."
+msgstr "Non connecté"
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Non renseigné"
+
+#: html/NoAuth/Reminder.html:26
+msgid "Not yet implemented."
+msgstr "Fonction pas encore disponible"
+
+#: NOT FOUND IN SOURCE
+msgid "Not yet implemented...."
+msgstr "Fonction pas encore disponible..."
+
+#: html/Approvals/Elements/Approve:48
+msgid "Notes"
+msgstr "Notes"
+
+#: lib/RT/User_Overlay.pm:767
+msgid "Notification could not be sent"
+msgstr "Impossible d'envoyer la notification"
+
+#: etc/initialdata:93
+msgid "Notify AdminCcs"
+msgstr "Avertir les AdminCCs"
+
+#: etc/initialdata:89
+msgid "Notify AdminCcs as Comment"
+msgstr "Avertir les AdminCCs par un commentaire"
+
+#: etc/initialdata:120
+msgid "Notify Other Recipients"
+msgstr "Avertir les autres destinataires"
+
+#: etc/initialdata:116
+msgid "Notify Other Recipients as Comment"
+msgstr "Avertir les autres destinataires par un commentaire"
+
+#: etc/initialdata:85
+msgid "Notify Owner"
+msgstr "Avertir l'intervenant"
+
+#: etc/initialdata:81
+msgid "Notify Owner as Comment"
+msgstr "Avertir l'intervenant par un commentaire"
+
+#: etc/initialdata:361
+msgid "Notify Owner of their rejected ticket"
+msgstr "Avertir l'Intervenant du rejet de son ticket"
+
+#: etc/initialdata:350
+msgid "Notify Owner of their ticket has been approved by all approvers"
+msgstr "Avertir l'Intervenant de l'approbation de son ticket par tous les approbateurs"
+
+#: etc/initialdata:338
+msgid "Notify Owner of their ticket has been approved by some approver"
+msgstr "Avertir l'Intervenant de l'approbation de son ticket par un des approbateurs"
+
+#: etc/initialdata:319 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Avertir les intervenants et les AdminCCs de nouveaux éléments attendant leur approbation"
+
+#: etc/initialdata:77
+msgid "Notify Requestors"
+msgstr "Avertir les demandeurs"
+
+#: etc/initialdata:103
+msgid "Notify Requestors and Ccs"
+msgstr "Avertir les demandeurs et les Ccs"
+
+#: etc/initialdata:98
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Avertir les demandeurs et les CC par un commentaire"
+
+#: etc/initialdata:112
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Avertir les demandeurs, CCs et AdminCCs"
+
+#: etc/initialdata:108
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Avertir les demandeurs, CCs et AdminCCs par un commentaire"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Nov."
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "Novembre"
+
+#: lib/RT/Record.pm:156
+msgid "Object could not be created"
+msgstr "L'objet n'a pas pu être ajouté"
+
+#: lib/RT/Record.pm:175
+msgid "Object created"
+msgstr "Objet ajouté"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Oct."
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "Octobre"
+
+#: html/Elements/SelectDateRelation:34
+msgid "On"
+msgstr "Le"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Lors d'un commentaire"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "Lors d'un courrier"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Lors d'une création"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Lors d'un changement d'intervenant"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Lors d'un changement de queue"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Lors de la résolution/clôture"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Lors d'un changement de statut"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Lors d'une transaction"
+
+#: html/Approvals/Elements/PendingMyApproval:49
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Ne montrer que les approbations pour les demandes créées après %1"
+
+#: html/Approvals/Elements/PendingMyApproval:47
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Ne montrer que les approbations pour les demandes créées avant %1"
+
+#: html/Elements/Quicksearch:30
+msgid "Open"
+msgstr "Ouvert"
+
+#: html/Ticket/Elements/Tabs:135
+msgid "Open it"
+msgstr "Ouvrir"
+
+#: NOT FOUND IN SOURCE
+msgid "Open requests"
+msgstr "Ouvrir les demandes"
+
+#: html/SelfService/Elements/Tabs:41
+msgid "Open tickets"
+msgstr "Ouvrir les tickets"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in a new window"
+msgstr "Ouvrir les tickets (depuis une liste) dans une nouvelle fenêtre."
+
+#: html/Admin/Users/Prefs.html:39
+msgid "Open tickets (from listing) in another window"
+msgstr "Ouvrir les tickets (depuis une liste) dans une autre fenêtre."
+
+#: etc/initialdata:132
+msgid "Open tickets on correspondence"
+msgstr "Ouvrir les tickets lors d'une correspondance"
+
+#: html/Search/Elements/PickRestriction:100
+msgid "Ordering and sorting"
+msgstr "Ranger et classer"
+
+#: html/Admin/Elements/ModifyUser:45 html/Admin/Users/Modify.html:116 html/Elements/SelectUsers:28 html/User/Prefs.html:85
+msgid "Organization"
+msgstr "Organisation"
+
+#: html/Approvals/Elements/Approve:32
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Ticket source: n°%1"
+
+#: html/Admin/Elements/ModifyQueue:54 html/Admin/Queues/Modify.html:68
+msgid "Over time, priority moves toward"
+msgstr "Temps dépassé, priorité déplacée"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Own tickets"
+msgstr "Tickets propres"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "OwnTicket"
+msgstr "PrendreTicket"
+
+#: 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:1244
+msgid "Owner"
+msgstr "Intervenant"
+
+#: NOT FOUND IN SOURCE
+msgid "Owner changed from %1 to %2"
+msgstr "Intervenant changé de %1 en %2"
+
+#: lib/RT/Transaction_Overlay.pm:582
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Intervenant forcé de %1 à %2"
+
+#: html/Search/Elements/PickRestriction:30
+msgid "Owner is"
+msgstr "L'intervenant est"
+
+#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:55
+msgid "Pager"
+msgstr "Bipeur"
+
+#: html/Admin/Elements/ModifyUser:73
+msgid "PagerPhone"
+msgstr "PagerPhone"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Parents"
+msgstr "Parents"
+
+#: html/Elements/Login:52 html/User/Prefs.html:60
+msgid "Password"
+msgstr "Mot de passe"
+
+#: html/NoAuth/Reminder.html:24
+msgid "Password Reminder"
+msgstr "Pense-bête pour votre mot de passe"
+
+#: lib/RT/User_Overlay.pm:228 lib/RT/User_Overlay.pm:985
+msgid "Password too short"
+msgstr "Mot de passe trop court"
+
+#: html/Admin/Users/Modify.html:290 html/User/Prefs.html:171
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Mot de passe: %1"
+
+#: html/Admin/Users/Modify.html:292
+msgid "Passwords do not match."
+msgstr "Les mots de passes sont différents"
+
+#: html/User/Prefs.html:173
+msgid "Passwords do not match. Your password has not been changed"
+msgstr "Les mots de passe sont différents. Votre mot de passe n'a pas été modifié"
+
+#: html/Ticket/Elements/ShowSummary:44 html/Ticket/Elements/Tabs:95 html/Ticket/ModifyAll.html:50
+msgid "People"
+msgstr "Personnes"
+
+#: etc/initialdata:125
+msgid "Perform a user-defined action"
+msgstr "Réaliser une action définie par l'utilisateur"
+
+#: 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: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:1377 lib/RT/Ticket_Overlay.pm:1387 lib/RT/Ticket_Overlay.pm:1401 lib/RT/Ticket_Overlay.pm:1535 lib/RT/Ticket_Overlay.pm:1544 lib/RT/Ticket_Overlay.pm:1557 lib/RT/Ticket_Overlay.pm:1906 lib/RT/Ticket_Overlay.pm:2044 lib/RT/Ticket_Overlay.pm:2208 lib/RT/Ticket_Overlay.pm:2275 lib/RT/Ticket_Overlay.pm:2634 lib/RT/Ticket_Overlay.pm:2715 lib/RT/Ticket_Overlay.pm:2819 lib/RT/Ticket_Overlay.pm:2834 lib/RT/Ticket_Overlay.pm:3033 lib/RT/Ticket_Overlay.pm:3043 lib/RT/Ticket_Overlay.pm:3048 lib/RT/Ticket_Overlay.pm:3270 lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3630 lib/RT/Ticket_Overlay.pm:3682 lib/RT/Ticket_Overlay.pm:3860 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
+msgid "Permission Denied"
+msgstr "Accès refusé"
+
+#: html/User/Elements/Tabs:34
+msgid "Personal Groups"
+msgstr "Groupes personnels"
+
+#: html/User/Groups/index.html:29 html/User/Groups/index.html:39
+msgid "Personal groups"
+msgstr "Groupes personnels"
+
+#: html/User/Elements/DelegateRights:36
+msgid "Personal groups:"
+msgstr "Groupes personnels:"
+
+#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:48
+msgid "Phone numbers"
+msgstr "Numéros de téléphone"
+
+#: NOT FOUND IN SOURCE
+msgid "Placeholder"
+msgstr "Paramètre fictif"
+
+#: 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 "Préférences"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Préférences"
+
+#: lib/RT/Action/Generic.pm:159
+msgid "Prepare Stubbed"
+msgstr "Préparation interrompue"
+
+#: html/Ticket/Elements/Tabs:60
+msgid "Prev"
+msgstr "Précédent"
+
+#: html/Search/Listing.html:43
+msgid "Previous page"
+msgstr "Page précédente"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri."
+
+#: lib/RT/ACE_Overlay.pm:132 lib/RT/ACE_Overlay.pm:207 lib/RT/ACE_Overlay.pm:551
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "Principal %1 non trouvé"
+
+#: 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:1042
+msgid "Priority"
+msgstr "Priorité"
+
+#: html/Admin/Elements/ModifyQueue:50 html/Admin/Queues/Modify.html:64
+msgid "Priority starts at"
+msgstr "La priorité débute à "
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Privilégié"
+
+#: html/Admin/Users/Modify.html:270 html/User/Prefs.html:162
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Statuts privilégiés : %1"
+
+#: html/Admin/Users/index.html:61
+msgid "Privileged users"
+msgstr "Utilisateurs privilégiés"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Pseudo groupe pour usage interne"
+
+#: 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:883
+msgid "Queue"
+msgstr "Queue"
+
+#: html/Admin/Queues/CustomField.html:41 html/Admin/Queues/Scrip.html:49 html/Admin/Queues/Scrips.html:47 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Queue %1 non trouvée"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Queue '%1' inconnue\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr "Sélection des mots clé de queue"
+
+#: html/Admin/Elements/ModifyQueue:30 html/Admin/Queues/Modify.html:42
+msgid "Queue Name"
+msgstr "Nom de la queue"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Scrips de queue"
+
+#: lib/RT/Queue_Overlay.pm:264
+msgid "Queue already exists"
+msgstr "Queue déjà créée"
+
+#: lib/RT/Queue_Overlay.pm:273 lib/RT/Queue_Overlay.pm:279
+msgid "Queue could not be created"
+msgstr "Impossible de créer la queue"
+
+#: html/Ticket/Create.html:204
+msgid "Queue could not be loaded."
+msgstr "Queue ne pouvant être chargée"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283
+msgid "Queue created"
+msgstr "Queue créée"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr "Queue non spécifié"
+
+#: html/SelfService/Display.html:70 lib/RT/CustomField_Overlay.pm:97
+msgid "Queue not found"
+msgstr "Queue inconnue"
+
+#: html/Admin/Elements/Tabs:37 html/Admin/index.html:34
+msgid "Queues"
+msgstr "Queues"
+
+#: html/Elements/Quicksearch:24
+msgid "Quick search"
+msgstr "Recherche rapide"
+
+#: html/Elements/Login:44
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 pour %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:24 html/Admin/index.html:25
+msgid "RT Administration"
+msgstr "Administration RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "Erreur d'authentification RT."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "Avis de rejet RT: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "Erreur de configuration RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "Erreur critique RT. Courrier non enregistré !"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:40
+msgid "RT Error"
+msgstr "Erreur RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT a reçu un e-mail (%1) de lui-même."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr "RT a reçu du courrier (%1) de lui même"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT Self Service / Tickets résolus"
+
+#: html/index.html:24 html/index.html:27
+msgid "RT at a glance"
+msgstr "RT en un coup d'oeil"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT n'a pas réussi à vous identifier"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT n'a pas pu trouver de demandeur par sa recherche dans une base externe"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT n'a pas trouvé la queue"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT n'a pas réussi à valider cette signature PGP. \\n"
+
+#: html/Elements/PageLayout:85
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT pour %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "RT pour %1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT a exécuté vos commandes"
+
+#: html/Elements/Login:94
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT est &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;. Distribué sous <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 de la licence générale GNU.</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT est &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;. Distribué sous <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 de la licence générale GNU.</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT pense que ce courrier peut être un avis de non-distribution"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT va traiter ce courrier comme s'il n'était pas signé.\\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 "L'interface d'utilisation de RT par email utilise une authentification PGP. Soit vous n'avez pas signé votre courrier, soit la signature est n'a pas pu être vérifiée"
+
+#: html/Admin/Users/Modify.html:57 html/Admin/Users/Prefs.html:51 html/User/Prefs.html:43
+msgid "Real Name"
+msgstr "Nom"
+
+#: html/Admin/Elements/ModifyUser:47
+msgid "RealName"
+msgstr "RealName"
+
+#: lib/RT/Transaction_Overlay.pm:631
+#. ($value)
+msgid "Reference by %1 added"
+msgstr "Ajout d'une référence par %1"
+
+#: lib/RT/Transaction_Overlay.pm:660
+#. ($value)
+msgid "Reference by %1 deleted"
+msgstr "Suppression de la référence par %1"
+
+#: lib/RT/Transaction_Overlay.pm:629
+#. ($value)
+msgid "Reference to %1 added"
+msgstr "Ajout d'une reference à %1"
+
+#: lib/RT/Transaction_Overlay.pm:658
+#. ($value)
+msgid "Reference to %1 deleted"
+msgstr "Suppression d'une reference à %1"
+
+#: 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
+msgid "Referred to by"
+msgstr "Mentionné par"
+
+#: 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
+msgid "Refers to"
+msgstr "Se rapporte à"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr "SeRapporteA"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Affiner"
+
+#: html/Search/Elements/PickRestriction:26
+msgid "Refine search"
+msgstr "Affiner la recherche"
+
+#: html/Elements/Refresh:35
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Rafraîchir cette page toutes les %1 minutes."
+
+#: html/Ticket/Create.html:173 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56
+msgid "Relationships"
+msgstr "Relations"
+
+#: html/Search/Bulk.html:97
+msgid "Remove AdminCc"
+msgstr "Enlever AdminCc "
+
+#: html/Search/Bulk.html:93
+msgid "Remove Cc"
+msgstr "Enlever Cc"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Enlever Demandeur"
+
+#: html/Ticket/Elements/ShowTransaction:159 html/Ticket/Elements/Tabs:121
+msgid "Reply"
+msgstr "Répondre"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Reply to tickets"
+msgstr "Répondre aux tickets"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "ReplyToTicket"
+msgstr "RépondreTicket"
+
+#: etc/initialdata:44 html/Ticket/Update.html:39 lib/RT/ACE_Overlay.pm:86
+msgid "Requestor"
+msgstr "Demandeur"
+
+#: html/Search/Elements/PickRestriction:37
+msgid "Requestor email address"
+msgstr "Adresse email du demandeur"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "Demandeur(s)"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "AdresseDuDemandeur"
+
+#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30
+msgid "Requestors"
+msgstr "Demandeurs"
+
+#: html/Admin/Elements/ModifyQueue:60 html/Admin/Queues/Modify.html:74
+msgid "Requests should be due in"
+msgstr "Le demande doit être résolue dans"
+
+#: html/Elements/Submit:61
+msgid "Reset"
+msgstr "Remise à zéro"
+
+#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:49
+msgid "Residence"
+msgstr "Domicile"
+
+#: html/Ticket/Elements/Tabs:131
+msgid "Resolve"
+msgstr "Résoudre"
+
+#: html/Ticket/Update.html:137
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Résoudre ticket n°%1 (%2)"
+
+#: etc/initialdata:308 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1206
+msgid "Resolved"
+msgstr "Résolu"
+
+#: html/Search/Bulk.html:132 html/Ticket/ModifyAll.html:72 html/Ticket/Update.html:71
+msgid "Response to requestors"
+msgstr "Réponse aux demandeurs"
+
+#: html/Elements/ListActions:25
+msgid "Results"
+msgstr "Résultats"
+
+#: html/Search/Elements/PickRestriction:104
+msgid "Results per page"
+msgstr "Nb tickets par page"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:99 html/User/Prefs.html:71
+msgid "Retype Password"
+msgstr "Saisissez à nouveau votre mot de passe"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Le droit %1 introuvable pour %2 %3 dans le périmètre %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:612
+msgid "Right Delegated"
+msgstr "Droit délégué"
+
+#: lib/RT/ACE_Overlay.pm:302
+msgid "Right Granted"
+msgstr "Droit accordé"
+
+#: lib/RT/ACE_Overlay.pm:160
+msgid "Right Loaded"
+msgstr "Droit activé"
+
+#: lib/RT/ACE_Overlay.pm:677 lib/RT/ACE_Overlay.pm:692
+msgid "Right could not be revoked"
+msgstr "Droit irrévocable"
+
+#: html/User/Delegation.html:63
+msgid "Right not found"
+msgstr "Droit inconnu"
+
+#: lib/RT/ACE_Overlay.pm:542 lib/RT/ACE_Overlay.pm:637
+msgid "Right not loaded."
+msgstr "Droit non activé"
+
+#: lib/RT/ACE_Overlay.pm:688
+msgid "Right revoked"
+msgstr "Droit révoqué"
+
+#: html/Admin/Elements/UserTabs:40
+msgid "Rights"
+msgstr "Droits"
+
+#: lib/RT/Interface/Web.pm:794
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "Les droits n'on pas pu être attribués à %1"
+
+#: lib/RT/Interface/Web.pm:827
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "Les droits n'ont pas pu être révoqués pour %1"
+
+#: html/Admin/Global/GroupRights.html:50 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Rôles"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "ApprobationDeRoot"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Sam."
+
+#: 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 "Enregistrer les modifications"
+
+#: NOT FOUND IN SOURCE
+msgid "Save changes"
+msgstr "Enregistrer les modifications"
+
+#: html/Admin/Global/Scrip.html:48 html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->id)
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "Scrip n°%1"
+
+#: lib/RT/Scrip_Overlay.pm:175
+msgid "Scrip Created"
+msgstr "Scrip ajouté"
+
+#: html/Admin/Elements/EditScrips:83
+msgid "Scrip deleted"
+msgstr "Scrip supprimé"
+
+#: 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 pour %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Scrips s'appliquant à toutes les queues"
+
+#: html/Elements/SimpleSearch:26 html/Search/Elements/PickRestriction:125 html/Ticket/Elements/Tabs:158
+msgid "Search"
+msgstr "Rechercher"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Critère de recherche"
+
+#: html/Approvals/Elements/PendingMyApproval:38
+msgid "Search for approvals"
+msgstr "Chercher des approbations"
+
+#: bin/rt-crontool:187
+msgid "Security:"
+msgstr "Sécurité:"
+
+#: lib/RT/Queue_Overlay.pm:66
+msgid "SeeQueue"
+msgstr "VoirQueue"
+
+#: html/Admin/Groups/index.html:39
+msgid "Select a group"
+msgstr "Sélectionner un groupe"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Choisir une queue"
+
+#: html/Admin/Users/index.html:24 html/Admin/Users/index.html:27
+msgid "Select a user"
+msgstr "Sélectionner un utilisateur"
+
+#: html/Admin/Global/CustomField.html:37 html/Admin/Global/CustomFields.html:35
+msgid "Select custom field"
+msgstr "Selectionner le champ personnalisé"
+
+#: html/Admin/Elements/GroupTabs:51 html/User/Elements/GroupTabs:49
+msgid "Select group"
+msgstr "Sélectionner le groupe"
+
+#: lib/RT/CustomField_Overlay.pm:421
+msgid "Select multiple values"
+msgstr "Choisir plusieurs valeurs"
+
+#: lib/RT/CustomField_Overlay.pm:418
+msgid "Select one value"
+msgstr "Choisir une valeur"
+
+#: html/Admin/Elements/QueueTabs:66
+msgid "Select queue"
+msgstr "Selectionner la queue"
+
+#: html/Admin/Global/Scrip.html:36 html/Admin/Global/Scrips.html:35 html/Admin/Queues/Scrip.html:39 html/Admin/Queues/Scrips.html:51
+msgid "Select scrip"
+msgstr "Selectionner le 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 "Selectionner le modèle"
+
+#: html/Admin/Elements/UserTabs:48
+msgid "Select user"
+msgstr "Selectionner l'utilisateur"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectMultiple"
+msgstr "ChoixMultiples"
+
+#: lib/RT/CustomField_Overlay.pm:34
+msgid "SelectSingle"
+msgstr "ChoixSimple"
+
+#: NOT FOUND IN SOURCE
+msgid "Self Service"
+msgstr "Self Service"
+
+#: etc/initialdata:113
+msgid "Send mail to all watchers"
+msgstr "Envoyer un courrier à tous les observateurs"
+
+#: etc/initialdata:109
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Envoyer un courrier à tous les observateurs en tant que \"commentaire\""
+
+#: etc/initialdata:104
+msgid "Send mail to requestors and Ccs"
+msgstr "Envoyer un courrier aux demandeurs et aux CCs"
+
+#: etc/initialdata:99
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Envoyer un courrier aux demandeurs et aux CCs en tant que commentaire"
+
+#: etc/initialdata:78
+msgid "Sends a message to the requestors"
+msgstr "Envoyer un courrier aux demandeurs"
+
+#: etc/initialdata:117 etc/initialdata:121
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Envoyer un courrier aux CCs et Bccs explicitement indiqués"
+
+#: etc/initialdata:94
+msgid "Sends mail to the administrative Ccs"
+msgstr "Envoyer un mail aux AdminCCs"
+
+#: etc/initialdata:90
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Envoyer un mail aux AdminCCs en tant que commentaire"
+
+#: etc/initialdata:82 etc/initialdata:86
+msgid "Sends mail to the owner"
+msgstr "Envoyer un courrier à l'intervenant"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Sep."
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr "Septembre"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Afficher les résultats"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show approved requests"
+msgstr "Afficher les requêtes approuvées"
+
+#: html/Ticket/Create.html:143 html/Ticket/Create.html:33
+msgid "Show basics"
+msgstr "Affichage court"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show denied requests"
+msgstr "Afficher les requêtes refusées"
+
+#: html/Ticket/Create.html:143 html/Ticket/Create.html:33
+msgid "Show details"
+msgstr "Affichage long"
+
+#: html/Approvals/Elements/PendingMyApproval:42
+msgid "Show pending requests"
+msgstr "Afficher les requêtes en attente"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show requests awaiting other approvals"
+msgstr "Afficher les requêtes attendant d'autres approbations"
+
+#: lib/RT/Queue_Overlay.pm:80
+msgid "Show ticket private commentary"
+msgstr "Afficher les commentaires privés du ticket"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Show ticket summaries"
+msgstr "Afficher les résumés de tickets"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "ShowACL"
+msgstr "AfficherACL"
+
+#: lib/RT/Queue_Overlay.pm:77
+msgid "ShowScrips"
+msgstr "AfficherScrips"
+
+#: lib/RT/Queue_Overlay.pm:74
+msgid "ShowTemplate"
+msgstr "AfficherModèle"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowTicket"
+msgstr "AfficherTicket"
+
+#: lib/RT/Queue_Overlay.pm:80
+msgid "ShowTicketComments"
+msgstr "AfficherCommentairesTickets"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "S'identifier en tant que demandeur ou CC de queue ou de ticket"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "S'identifier en tant qu'AdminCC de ticket ou de queue"
+
+#: 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 "Signature"
+
+#: NOT FOUND IN SOURCE
+msgid "Signed in as %1"
+msgstr "Connecté en tant que %1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:25
+msgid "Single"
+msgstr "Unique"
+
+#: html/Elements/Header:50
+msgid "Skip Menu"
+msgstr "Passer le menu"
+
+#: html/Admin/Elements/AddCustomFieldValue:27
+msgid "Sort"
+msgstr "Trier"
+
+#: NOT FOUND IN SOURCE
+msgid "Sort key"
+msgstr "Ordre de tri"
+
+#: html/Search/Elements/PickRestriction:108
+msgid "Sort results by"
+msgstr "Trier les résultats par"
+
+#: NOT FOUND IN SOURCE
+msgid "SortOrder"
+msgstr "SortOrder"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Bloqué"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Page de début"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:34
+msgid "Started"
+msgstr "Ouvert le"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "La date de démarrage '%1' n'a pas pu être analysée"
+
+#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:30
+msgid "Starts"
+msgstr "Débute"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Débute le"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "La date de début '%1' n'a pas pu être analysée"
+
+#: html/Admin/Elements/ModifyUser:81 html/Admin/Users/Modify.html:137 html/User/Prefs.html:93
+msgid "State"
+msgstr "Etat"
+
+#: 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:1200 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Statut"
+
+#: etc/initialdata:294
+msgid "Status Change"
+msgstr "Changement de statut"
+
+#: lib/RT/Transaction_Overlay.pm:528
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Statut modifié de %1 à %2 "
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "ChangementDeStatut"
+
+#: html/Ticket/Elements/Tabs:146
+msgid "Steal"
+msgstr "Voler"
+
+#: lib/RT/Queue_Overlay.pm:91
+msgid "Steal tickets"
+msgstr "Voler les tickets "
+
+#: lib/RT/Queue_Overlay.pm:91
+msgid "StealTicket"
+msgstr "VolerTicket"
+
+#: lib/RT/Transaction_Overlay.pm:587
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Volé à %1"
+
+#: 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 lib/RT/Ticket_Overlay.pm:1196 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Sujet"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Sujet modifié en %1"
+
+#: html/Elements/Submit:58
+msgid "Submit"
+msgstr "Valider"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "Soumettre flux de travail"
+
+#: lib/RT/Group_Overlay.pm:748
+msgid "Succeeded"
+msgstr "Réussi"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Dim."
+
+#: lib/RT/System.pm:53
+msgid "SuperUser"
+msgstr "SuperUtilisateur"
+
+#: html/User/Elements/DelegateRights:76
+msgid "System"
+msgstr "Système"
+
+#: html/Admin/Elements/SelectRights:80 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:793 lib/RT/Interface/Web.pm:826
+msgid "System Error"
+msgstr "Erreur système"
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. Right not granted."
+msgstr "Erreur Système. Droit non délégué."
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. right not granted"
+msgstr "Erreur Système. Droit non délégué"
+
+#: lib/RT/ACE_Overlay.pm:615
+msgid "System error. Right not delegated."
+msgstr "Erreur système. Droit non délégué."
+
+#: 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 "Erreur système. Droit non accordé"
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "Erreur Système. Imposible de déléguer les droits"
+
+#: html/Admin/Global/GroupRights.html:34 html/Admin/Groups/GroupRights.html:36 html/Admin/Queues/GroupRights.html:35
+msgid "System groups"
+msgstr "Groupes système"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "SystemRolegroup à usage interne"
+
+#: lib/RT/CurrentUser.pm:319
+msgid "TEST_STRING"
+msgstr "Chaîne_de_test"
+
+#: html/Ticket/Elements/Tabs:142
+msgid "Take"
+msgstr "Prendre"
+
+#: lib/RT/Queue_Overlay.pm:89
+msgid "Take tickets"
+msgstr "Prendre les tickets"
+
+#: lib/RT/Queue_Overlay.pm:89
+msgid "TakeTicket"
+msgstr "PrendreTicket"
+
+#: lib/RT/Transaction_Overlay.pm:573
+msgid "Taken"
+msgstr "Pris"
+
+#: html/Admin/Elements/EditScrip:80
+msgid "Template"
+msgstr "Modèle"
+
+#: html/Admin/Global/Template.html:90 html/Admin/Queues/Template.html:89
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "Modèle n°%1"
+
+#: html/Admin/Elements/EditTemplates:88
+msgid "Template deleted"
+msgstr "Modèle supprimé"
+
+#: lib/RT/Scrip_Overlay.pm:152
+msgid "Template not found"
+msgstr "Modèle inconnu"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Modèle inconnu\\n"
+
+#: lib/RT/Template_Overlay.pm:352
+msgid "Template parsed"
+msgstr "Modèle analysé"
+
+#: html/Admin/Elements/QueueTabs:48 html/Admin/Elements/SystemTabs:35 html/Admin/Global/index.html:44
+msgid "Templates"
+msgstr "Modèles"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Modèles pour %1\\n "
+
+#: lib/RT/Interface/Web.pm:894
+msgid "That is already the current value"
+msgstr "Ceci est déjà la valeur actuelle"
+
+#: lib/RT/CustomField_Overlay.pm:242
+msgid "That is not a value for this custom field"
+msgstr "Valeur incorrecte pour ce champ personnalisé."
+
+#: lib/RT/Ticket_Overlay.pm:1917
+msgid "That is the same value"
+msgstr "Valeur identique"
+
+#: lib/RT/ACE_Overlay.pm:287 lib/RT/ACE_Overlay.pm:596
+msgid "That principal already has that right"
+msgstr "Ce groupe/utilisateur dispose déjà de ce droit"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Ce groupe/utilisateur est déjà un %1 pour cette queue"
+
+#: lib/RT/Ticket_Overlay.pm:1451
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Ce groupe/utilisateur est déjà un %1 pour ce ticket"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Ce groupe/utilisateur n'est pas un %1 pour cette queue"
+
+#: lib/RT/Ticket_Overlay.pm:1568
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Ce groupe/utilisateur n'est pas un %1 pour ce ticket"
+
+#: lib/RT/Ticket_Overlay.pm:1913
+msgid "That queue does not exist"
+msgstr "Queue inconnue"
+
+#: lib/RT/Ticket_Overlay.pm:3274
+msgid "That ticket has unresolved dependencies"
+msgstr "Ticket ayant des tickets fils ou dépendants non résolus"
+
+#: NOT FOUND IN SOURCE
+msgid "That user already has that right"
+msgstr "Cet utilisateur possède déjà ce droit."
+
+#: lib/RT/Ticket_Overlay.pm:3084
+msgid "That user already owns that ticket"
+msgstr "Cet utilisateur possède déjà ce ticket."
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "That user does not exist"
+msgstr "Utilisateur inconnu"
+
+#: lib/RT/User_Overlay.pm:376
+msgid "That user is already privileged"
+msgstr "Utilisateur possédant déjà un statut privilégié."
+
+#: lib/RT/User_Overlay.pm:397
+msgid "That user is already unprivileged"
+msgstr "Utilisateur déjà sans privilèges."
+
+#: lib/RT/User_Overlay.pm:389
+msgid "That user is now privileged"
+msgstr "Utilisateur bénéficiant à présent du statut privilégié"
+
+#: lib/RT/User_Overlay.pm:410
+msgid "That user is now unprivileged"
+msgstr "Utilisateur à présent sans statut privilégié "
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr "Cet utilisateur a perdu ses droits"
+
+#: lib/RT/Ticket_Overlay.pm:3077
+msgid "That user may not own tickets in that queue"
+msgstr "Cet utilisateur peut ne pas avoir de ticket dans cette queue."
+
+#: lib/RT/Link_Overlay.pm:205
+msgid "That's not a numerical id"
+msgstr "ID non numérique"
+
+#: html/SelfService/Display.html:31 html/Ticket/Create.html:149 html/Ticket/Elements/ShowSummary:27
+msgid "The Basics"
+msgstr "Eléments de base"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The CC of a ticket"
+msgstr "Le CC d'un ticket"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The administrative CC of a ticket"
+msgstr "L'AdminCC d'un ticket"
+
+#: lib/RT/Ticket_Overlay.pm:2244
+msgid "The comment has been recorded"
+msgstr "Commentaire enregistré"
+
+#: 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 "Cette commande trouve tous les tickets actifs de la queue 'general' et positionne leur priorité à 99 s'ils n'ont pas été touchés depuis quatre heures:"
+
+#: bin/rt-commit-handler:755 bin/rt-commit-handler:765
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Les commandes suivantes n'ont pas été traitées :\\n\\n"
+
+#: lib/RT/Interface/Web.pm:897
+msgid "The new value has been set."
+msgstr "La nouvelle valeur est enregistrée"
+
+#: lib/RT/ACE_Overlay.pm:85
+msgid "The owner of a ticket"
+msgstr "L'intervenant d'un ticket"
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The requestor of a ticket"
+msgstr "Le demandeur d'un ticket"
+
+#: html/Admin/Elements/EditUserComments:25
+msgid "These comments aren't generally visible to the user"
+msgstr "Ces commentaires ne sont généralement pas accessibles par l'utilisateur"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Ce ticket %1 %2 (%3)\\n "
+
+#: bin/rt-crontool:188
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Cet outil permet à l'utilisateur de lancer un module perl quelconque depuis RT"
+
+#: lib/RT/Transaction_Overlay.pm:251
+msgid "This transaction appears to have no content"
+msgstr "Cette opération semble ne pas avoir de contenu"
+
+#: html/Ticket/Elements/ShowRequestor:46
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "Les %1 tickets de plus haute priorité de cet utilisateur"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "Les 25 tickets prioritaires de cet utilisateur"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Jeu."
+
+#: 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 Jumbo update: %2"
+
+#: html/Ticket/ModifyAll.html:24 html/Ticket/ModifyAll.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "Ticket n°%1 mise à jour globale: %2"
+
+#: html/Approvals/Elements/ShowDependency:45
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Ticket n°%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:623 lib/RT/Ticket_Overlay.pm:644
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Ticket %1 créé dans la queue '%2'"
+
+#: bin/rt-commit-handler:759
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Ticket %1 chargé\\n "
+
+#: html/Search/Bulk.html:212
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Ticket %1: %2"
+
+#: html/Ticket/History.html:24 html/Ticket/History.html:27
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Historique ticket # %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Id"
+msgstr "N° ticket"
+
+#: etc/initialdata:309
+msgid "Ticket Resolved"
+msgstr "Ticket résolu/clos"
+
+#: html/Search/Elements/PickRestriction:62
+msgid "Ticket attachment"
+msgstr "Pièce jointe au ticket"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Contenu du ticket."
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Type du contenu du ticket"
+
+#: lib/RT/Ticket_Overlay.pm:514 lib/RT/Ticket_Overlay.pm:523 lib/RT/Ticket_Overlay.pm:533 lib/RT/Ticket_Overlay.pm:633
+msgid "Ticket could not be created due to an internal error"
+msgstr "Une erreur interne a empêché l'ajout du ticket"
+
+#: lib/RT/Transaction_Overlay.pm:520
+msgid "Ticket created"
+msgstr "Ticket ajouté"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Création de ticket échouée."
+
+#: lib/RT/Transaction_Overlay.pm:525
+msgid "Ticket deleted"
+msgstr "Ticket supprimé."
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket id not found"
+msgstr "Id de ticket non trouvée"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket killed"
+msgstr "Ticket effacé"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket not found"
+msgstr "Ticket non trouvé"
+
+#: etc/initialdata:295
+msgid "Ticket status changed"
+msgstr "Statut de ticket modifié"
+
+#: html/Ticket/Update.html:38
+msgid "Ticket watchers"
+msgstr "Observateurs du ticket"
+
+#: html/Elements/Tabs:46
+msgid "Tickets"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Tickets %1 par %2"
+
+#: html/Elements/ViewUser:25
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Tickets depuis %2"
+
+#: html/Approvals/Elements/ShowDependency:26
+msgid "Tickets which depend on this approval:"
+msgstr "Tickets dépendant de cette approbation:"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47
+msgid "Time Left"
+msgstr "Temps restant"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42
+msgid "Time Worked"
+msgstr "Temps passé"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Temps restant"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Temps de calcul"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Temps passé"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "TempsRestant"
+
+#: lib/RT/Ticket_Overlay.pm:1201
+msgid "TimeWorked"
+msgstr "TempsPassé"
+
+#: bin/rt-commit-handler:401
+msgid "To generate a diff of this commit:"
+msgstr "Pour conserver les modifications de cette transaction"
+
+#: bin/rt-commit-handler:390
+msgid "To generate a diff of this commit:\\n"
+msgstr "Pour conserver les modifications de cette transaction :\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1204
+msgid "Told"
+msgstr "Annoncé"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transaction"
+
+#: lib/RT/Transaction_Overlay.pm:691
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "La transaction%1 est supprimée"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transaction ajoutée"
+
+#: lib/RT/Transaction_Overlay.pm:88
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Transaction->Create n'a pas fonctionné car vous n'avez pas spécifié d'identifiant de ticket"
+
+#: lib/RT/Transaction_Overlay.pm:750
+msgid "Transactions are immutable"
+msgstr "Les transactions ne peuvent être transférées"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Tentative de délégation d'un droit : %1"
+
+#: lib/RT/Date.pm:389
+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:1202 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Type"
+
+#: lib/RT/ScripCondition_Overlay.pm:103
+msgid "Unimplemented"
+msgstr "Fonction non disponible"
+
+#: html/Admin/Users/Modify.html:67
+msgid "Unix login"
+msgstr "Identifiant Unix"
+
+#: html/Admin/Elements/ModifyUser:61
+msgid "UnixUsername"
+msgstr "UnixUsername"
+
+#: lib/RT/Attachment_Overlay.pm:266 lib/RT/Attachment_Overlay.pm:298
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Type d'encodage de courrier inconnu: %1"
+
+#: html/Elements/SelectResultsPerPage:36
+msgid "Unlimited"
+msgstr "Illimité"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "Non privilégié"
+
+#: lib/RT/Transaction_Overlay.pm:569
+msgid "Untaken"
+msgstr "Non pris"
+
+#: html/Elements/MyTickets:63 html/Search/Bulk.html:32
+msgid "Update"
+msgstr "Mettre à jour"
+
+#: html/Admin/Users/Prefs.html:61
+msgid "Update ID"
+msgstr "Mettre à jour l'ID"
+
+#: html/Search/Bulk.html:129 html/Ticket/ModifyAll.html:65 html/Ticket/Update.html:65
+msgid "Update Type"
+msgstr "Mettre à jour le type"
+
+#: html/Search/Listing.html:60
+msgid "Update all these tickets at once"
+msgstr "Mise à jour des tickets en masse"
+
+#: html/Admin/Users/Prefs.html:48
+msgid "Update email"
+msgstr "Mettre à jour l'email"
+
+#: html/Admin/Users/Prefs.html:54
+msgid "Update name"
+msgstr "Mettre à jour le nom"
+
+#: lib/RT/Interface/Web.pm:409
+msgid "Update not recorded."
+msgstr "Mise à jour non enregistrée"
+
+#: html/Search/Bulk.html:80
+msgid "Update selected tickets"
+msgstr "Mettre à jour les tickets sélectionnés"
+
+#: html/Admin/Users/Prefs.html:35
+msgid "Update signature"
+msgstr "Mettre à jour la signature"
+
+#: html/Ticket/ModifyAll.html:62
+msgid "Update ticket"
+msgstr "Mettre à jour le ticket"
+
+#: NOT FOUND IN SOURCE
+msgid "Update ticket # %1"
+msgstr "Mettre à jour le ticket n°%1"
+
+#: html/SelfService/Update.html:24 html/SelfService/Update.html:46
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Mettre à jour le ticket n°%1"
+
+#: html/Ticket/Update.html:139
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Mettre à jour le ticket n°%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:407
+msgid "Update type was neither correspondence nor comment."
+msgstr "Le type de mise à jour n'était ni un commentaire ni un courrier."
+
+#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:50 lib/RT/Ticket_Overlay.pm:1205
+msgid "Updated"
+msgstr "Mis(e) à jour"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Utilisateur %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Mot de passe de l'utilisateur %1 : %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Utilisateur '%1' non trouvé"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Utilisateur '%1' non trouvé\\n"
+
+#: etc/initialdata:124 etc/initialdata:191
+msgid "User Defined"
+msgstr "Utilisateur défini"
+
+#: html/Admin/Users/Prefs.html:58
+msgid "User ID"
+msgstr "Id utilisateur"
+
+#: html/Elements/SelectUsers:25
+msgid "User Id"
+msgstr "Id utilisateur"
+
+#: 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 "Droits utilisateurs"
+
+#: html/Admin/Users/Modify.html:225
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Utilisateur ne peut pas être créé : %1"
+
+#: lib/RT/User_Overlay.pm:321
+msgid "User created"
+msgstr "Utilisateur créé"
+
+#: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Groupes utilisateur"
+
+#: lib/RT/User_Overlay.pm:575 lib/RT/User_Overlay.pm:592
+msgid "User loaded"
+msgstr "Utilisateur chargé"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Utilisateur informé"
+
+#: html/Admin/Users/Prefs.html:24 html/Admin/Users/Prefs.html:28
+msgid "User view"
+msgstr "Vue utilisateur"
+
+#: html/Admin/Users/Modify.html:47 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:34
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: 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 "Utilisateurs"
+
+#: html/Admin/Users/index.html:64
+msgid "Users matching search criteria"
+msgstr "Utilisateurs correspondants aux critères de recherche"
+
+#: html/Search/Elements/PickRestriction:50
+msgid "ValueOfQueue"
+msgstr "ValueOfQueue"
+
+#: html/Admin/Elements/EditCustomField:56
+msgid "Values"
+msgstr "Valeurs"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Watch"
+msgstr "Observer"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "WatchAsAdminCc"
+msgstr "ObserverCommeAdminCC"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "Observateur chargé"
+
+#: html/Admin/Elements/QueueTabs:41
+msgid "Watchers"
+msgstr "Observateurs"
+
+#: html/Admin/Elements/ModifyUser:55
+msgid "WebEncoding"
+msgstr "WebEncoding"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Mer."
+
+#: etc/initialdata:503 etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Quand un ticket a été approuvé par tous les approbateurs, ajoute le courrier au ticket source"
+
+#: etc/initialdata:467 etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Quand un ticket a été approuvé par au moins un approbateur, ajoute le courrier au ticket source "
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Quand un ticket est créé"
+
+#: etc/initialdata:400 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 "Quand un ticket d'approbation est créé, informer l'intervenant et l'AdminCC de l'élément attendant leur approbation"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Quand quelque chose arrive"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Lorsqu'un ticket quelconque est résolu/clos"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Lorsqu'un ticket quelconque change d'intervenant"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Lorsqu'un ticket quelconque change de queue"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Lorsqu'un ticket quelconque change de statut"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Lorsqu'une condition définie par l'utilisateur est satisfaite"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Lorsque un commentaire arrive"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Lorsque un courrier arrive"
+
+#: html/Admin/Users/Modify.html:163 html/User/Prefs.html:51
+msgid "Work"
+msgstr "Travail"
+
+#: html/Admin/Elements/ModifyUser:69
+msgid "WorkPhone"
+msgstr "Tel. bureau"
+
+#: html/Ticket/Elements/ShowBasics:34 html/Ticket/Update.html:64
+msgid "Worked"
+msgstr "Travaillé"
+
+#: lib/RT/Ticket_Overlay.pm:3187
+msgid "You already own this ticket"
+msgstr "Vous êtes déjà intervenant de ce ticket"
+
+#: html/autohandler:122
+msgid "You are not an authorized user"
+msgstr "Vous n'êtes pas un utilisateur autorisé"
+
+#: lib/RT/Ticket_Overlay.pm:3069
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Vous pouvez seulement réaffecter vos ticket ou ceux qui ne sont pas affectés"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "Vous n'êtes pas autorisé à voir ce ticket.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "%1 tickets trouvés dans la queue %2"
+
+#: html/NoAuth/Logout.html:30
+msgid "You have been logged out of RT."
+msgstr "Vous avez été déconnecté de RT."
+
+#: html/SelfService/Display.html:77
+msgid "You have no permission to create tickets in that queue."
+msgstr "Vous n'avez pas l'autorisation de créer des tickets dans cette queue."
+
+#: lib/RT/Ticket_Overlay.pm:1926
+msgid "You may not create requests in that queue."
+msgstr "Vous ne pouvez pas créer de demandes dans cette queue."
+
+#: html/NoAuth/Logout.html:34
+msgid "You're welcome to login again"
+msgstr "Vous êtes invité à vous identifier à nouveau"
+
+#: NOT FOUND IN SOURCE
+msgid "Your %1 requests"
+msgstr "Vos %1 requêtes"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "Votre administrateur RT a mal configuré l'alias de mail qui appelle RT"
+
+#: etc/initialdata:484 etc/upgrade/2.1.71:146
+msgid "Your request has been approved by %1. Other approvals may still be pending."
+msgstr "Votre demande a été approuvée par %1. D'autres approbations sont peut être toujours en attente"
+
+#: etc/initialdata:522 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Votre demande a été approuvée"
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "Votre demande a été rejetée"
+
+#: etc/initialdata:427 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Votre demande a été rejetée."
+
+#: html/autohandler:144
+msgid "Your username or password is incorrect"
+msgstr "Votre nom d'utilisateur ou votre mot de passe est incorrect"
+
+#: html/Admin/Elements/ModifyUser:83 html/Admin/Users/Modify.html:143 html/User/Prefs.html:95
+msgid "Zip"
+msgstr "Code Postal"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr "[Pas de sujet]"
+
+#: html/User/Elements/DelegateRights:58
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "comme accordé à %1"
+
+#: html/SelfService/Closed.html:27
+msgid "closed"
+msgstr "fermé"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:33
+msgid "contains"
+msgstr "contient"
+
+#: html/Elements/SelectAttachmentField:25
+msgid "content"
+msgstr "Contenu"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content-type"
+msgstr "Type de contenu"
+
+#: lib/RT/Ticket_Overlay.pm:2313
+msgid "correspondence (probably) not sent"
+msgstr "courrier (probablement) non envoyé"
+
+#: lib/RT/Ticket_Overlay.pm:2323
+msgid "correspondence sent"
+msgstr "courrier envoyé"
+
+#: html/Admin/Elements/ModifyQueue:62 html/Admin/Queues/Modify.html:76 lib/RT/Date.pm:319
+msgid "days"
+msgstr "jours"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "effacé"
+
+#: html/Search/Listing.html:74
+msgid "delete"
+msgstr "effacer"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "deleted"
+msgstr "effacé"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "does not match"
+msgstr "ne correspond pas"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:34
+msgid "doesn't contain"
+msgstr "ne contient pas"
+
+#: html/Elements/SelectEqualityOperator:37
+msgid "equal to"
+msgstr "égal à"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr "faux"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "filename"
+msgstr "Nom de fichier"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37
+msgid "greater than"
+msgstr "supérieur à"
+
+#: lib/RT/Group_Overlay.pm:193
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "groupe '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "heures"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "n°"
+
+#: 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 "est"
+
+#: 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 "n'est pas"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37
+msgid "less than"
+msgstr "inférieur à"
+
+#: html/Search/Elements/PickRestriction:66
+msgid "matches"
+msgstr "correspond"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:64
+msgid "minutes"
+msgstr "minutes"
+
+#: bin/rt-commit-handler:764
+msgid "modifications\\n\\n"
+msgstr "modifications\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "mois"
+
+#: lib/RT/Queue_Overlay.pm:57
+msgid "new"
+msgstr "nouveau"
+
+#: html/Admin/Elements/EditScrips:42
+msgid "no value"
+msgstr "Non renseigné"
+
+#: html/Admin/Elements/EditQueueWatchers:26 html/Ticket/Elements/EditWatchers:27
+msgid "none"
+msgstr "aucun"
+
+#: html/Elements/SelectEqualityOperator:37
+msgid "not equal to"
+msgstr "différent de"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr "necontientpas"
+
+#: html/SelfService/Elements/MyRequests:60 lib/RT/Queue_Overlay.pm:58
+msgid "open"
+msgstr "ouvert"
+
+#: lib/RT/Group_Overlay.pm:198
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "groupe personnel '%1' pour l'utilisateur '%2'"
+
+#: lib/RT/Group_Overlay.pm:206
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "queue %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "rejected"
+msgstr "rejeté"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "resolved"
+msgstr "résolu"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "sec"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "stalled"
+msgstr "bloqué"
+
+#: lib/RT/Group_Overlay.pm:201
+#. ($self->Type)
+msgid "system %1"
+msgstr "système %1"
+
+#: lib/RT/Group_Overlay.pm:212
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "groupe système '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:41
+msgid "the calling component did not specify why"
+msgstr "le composant appelant n'a pas spécifié pourquoi"
+
+#: lib/RT/URI/fsck_com_rt.pm:234
+#. ($self->Object->Id)
+msgid "ticket #%1"
+msgstr "ticket n°%1"
+
+#: lib/RT/Group_Overlay.pm:209
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "ticket n°%1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr "vrai"
+
+#: lib/RT/Group_Overlay.pm:215
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "Groupe %1 non décrit"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr "Groupe non décrit %1"
+
+#: lib/RT/Group_Overlay.pm:190
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "utilisateur %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "semaines"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "Avec modèle %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "années"
+
diff --git a/rt/lib/RT/I18N/he.po b/rt/lib/RT/I18N/he.po
new file mode 100644 (file)
index 0000000..d3ef20e
--- /dev/null
@@ -0,0 +1,4871 @@
+# Hebrew Translation of the RT interface by Shimi.
+# Comments: shimi@shimi.net
+
+msgid ""
+msgstr ""
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:50 html/SelfService/Display.html:25 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($Ticket->id, $Ticket->Subject)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr ""
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr ""
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3505 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Overlay.pm:599
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 הוסף"
+msgstr ""
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 לפני %2 ימים"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3511 lib/RT/Transaction_Overlay.pm:564
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 שונה ל %3"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3508 lib/RT/Transaction_Overlay.pm:560 lib/RT/Transaction_Overlay.pm:605
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 נמחק"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 %2 מקבוצה %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 עם תבנית %3"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 פנייה זו\\n"
+msgstr ""
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "%1 - %2 מוצגים"
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - ארגומנט להעביר אל %2"
+msgstr ""
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr ""
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 פעולת-סקריפ נטענה"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3538
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 הוסף כערך עבור %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 כינויים דורשים מזהה פנייה כדי לעבוד עליהם"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 כינויים דורשים מזהה פנייה כדי לעבוד עליהם "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 כינויים דורשים מזהה פנייה כדי לעבוד עליהם (מ %2) %3"
+msgstr ""
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 נראה כמו אובייקט מקומי, אבל הוא אינו נמצא במסד הנתונים"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:481
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 על ידי %2"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:535 lib/RT/Transaction_Overlay.pm:624 lib/RT/Transaction_Overlay.pm:633 lib/RT/Transaction_Overlay.pm:636
+#. ($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)
+msgid "%1 שונה מ %2 ל %3"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:891
+msgid "%1 could not be set to %2."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2817
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr ""
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "%1 הפניות עם העדיפות הגבוהה ביותר בטיפולי..."
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "%1 הפניות עם העדיפות הגבוהה ביותר שאני פתחתי..."
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3594
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "זכויות"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr ""
+
+#: 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."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:433
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr ""
+
+#: 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/EditCustomFieldValues:25 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 ""
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr ""
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr ""
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr ""
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+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 <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr ""
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr ""
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr ""
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:534
+msgid "(no value)"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(רק פנייה אחת)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr ""
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr ""
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"פנייה חדשה ב\">&nbsp;%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 ""
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr ""
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr ""
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr "מידע אודותי"
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr ""
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr ""
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr ""
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "הוסף העתק ניהולי"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+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 ""
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "הוסף מבקש"
+
+#: html/Admin/Elements/AddCustomFieldValue:26
+msgid "Add Value"
+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"
+msgstr ""
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "הוסף הערות או תגובות לפניות הנבחרות"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr ""
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+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"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "כתובת1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "כתובת2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr ""
+
+#: etc/initialdata:280
+msgid "Admin Comment"
+msgstr ""
+
+#: etc/initialdata:259
+msgid "Admin Correspondence"
+msgstr ""
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr ""
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr ""
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+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 ""
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr ""
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+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 ""
+
+#: 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:56
+msgid "Approval"
+msgstr "אישור"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr ""
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr ""
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:44
+msgid "Approve"
+msgstr ""
+
+#: etc/initialdata:437 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr ""
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "אפריל"
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "אפריל"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "עולה"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:33 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "צרף"
+
+#: html/SelfService/Create.html:65 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr ""
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "קובץ מצורף"
+
+#: NOT FOUND IN SOURCE
+msgid "Attachment '%1' could not be loaded"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:441
+msgid "Attachment created"
+msgstr "קובץ צורף"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "שם קובץ מצורף"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "קבצים מצורפים"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "אוגוסט"
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "אוגוסט"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr ""
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr ""
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr ""
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "בסיסי"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "אל תשכח לשמור את השינויים"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:320
+msgid "Before"
+msgstr "לפני"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr ""
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr ""
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "הוסף כתובת זו לספר הכתובות כדי לחזור על אותו חיפוש"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "תקציר כותרים"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "עדכון פניות מרוכז"
+
+#: lib/RT/User_Overlay.pm:1352
+msgid "Can not modify system users"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:206
+msgid "Can't add a custom field value without a name"
+msgstr ""
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2794
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2612 lib/RT/Ticket_Overlay.pm:2681
+msgid "Can't specifiy both base and target"
+msgstr ""
+
+#: html/autohandler:99
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr ""
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:49 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "העתק"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr ""
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "סמן תיבה כדי למחוק"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "סמן תיבה כדי לבטל זכות"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:57
+msgid "Children"
+msgstr "ילדים"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "עיר"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr "נסגר"
+
+#: html/SelfService/Closed.html:25
+msgid "Closed Tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Closed requests"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:45
+msgid "Closed tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "הערה"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr ""
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "הערות (לא נשלחות אל המבקשים)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "הערות (לא נשלחות אל המבקשים)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "הערות לגבי %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "הערות לגבי משתמש זה"
+
+#: lib/RT/Transaction_Overlay.pm:543
+msgid "Comments added"
+msgstr "הערות נוספו"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr ""
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr ""
+
+#: html/Elements/Tabs:50
+msgid "Configuration"
+msgstr "הגדרות"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr ""
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "תוכן"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr ""
+
+#: etc/initialdata:271
+msgid "Correspondence"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:539
+msgid "Correspondence added"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3525
+msgid "Could not add new custom field value for ticket. "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3031 lib/RT/Ticket_Overlay.pm:3039 lib/RT/Ticket_Overlay.pm:3055
+msgid "Could not change owner. "
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:85 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr ""
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr ""
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:334
+msgid "Could not create ticket. Queue not set"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:422
+msgid "Could not create user"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr ""
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3535 lib/RT/Ticket_Overlay.pm:3591
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:900
+msgid "Couldn't find row"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:240
+msgid "Couldn't find that value"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr ""
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr ""
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr ""
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr ""
+
+#: html/SelfService/Display.html:109
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "ארץ"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "צור"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "צור פניות"
+
+#: html/Admin/Elements/EditCustomField:75
+msgid "Create a CustomField"
+msgstr ""
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr ""
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "צור קבוצה פרטית חדשה"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "צור תור חדש"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "צור סקריפ חדש"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "צור תבנית חדשה"
+
+#: html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "צור פנייה חדשה"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "צור משתמש חדש"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "צור תור חדש"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "צור תור שנקרא"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a request"
+msgstr "צור בקשה"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr ""
+
+#: html/SelfService/Create.html:25
+msgid "Create a ticket"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr ""
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr ""
+
+#: html/SelfService/Create.html:78
+msgid "Create ticket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr ""
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "נוצר"
+
+#: html/Admin/Elements/EditCustomField:88
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "יחסים נוכחיים"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr ""
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr "קריטריוני החיפוש הנוכחיים"
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "צופים נוכחיים"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:36
+msgid "Custom Fields"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3427
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3577
+msgid "Custom field not found"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:350
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:250
+msgid "Custom field value could not be deleted"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:356
+msgid "Custom field value could not be found"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:248 lib/RT/CustomField_Overlay.pm:358
+msgid "Custom field value deleted"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:548
+msgid "CustomField"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr ""
+
+#: html/SelfService/Display.html:39 html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:55 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "תאריכים"
+
+#: lib/RT/Date.pm:422
+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 ""
+
+#: etc/initialdata:281
+msgid "Default admin comment template"
+msgstr ""
+
+#: etc/initialdata:260
+msgid "Default admin correspondence template"
+msgstr ""
+
+#: etc/initialdata:272
+msgid "Default correspondence template"
+msgstr ""
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:643
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr ""
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr ""
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr ""
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr ""
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr "דלגציות"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "מחק"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:438
+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:45
+msgid "Deny"
+msgstr ""
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:37
+msgid "Depended on by"
+msgstr "תלויים בו"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr ""
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "תלוי ב"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "יורד"
+
+#: html/SelfService/Create.html:73 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr ""
+
+#: html/Admin/Elements/AddCustomFieldValue:37 html/Admin/Elements/EditCustomField:39 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "תיאור"
+
+#: NOT FOUND IN SOURCE
+msgid "Details"
+msgstr "פרטים"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "הצג"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr ""
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "מצב תצוגה"
+
+#: NOT FOUND IN SOURCE
+msgid "Display ticket #%1"
+msgstr "הצג פנייה #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr ""
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "אל תרענן דף זה."
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr "אל תראה את תוצאות החיפוש"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "הורד"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "תאריך יעד"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr ""
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr ""
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr ""
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr ""
+
+#: html/Admin/Queues/Templates.html:42
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr ""
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:118
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:91
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr ""
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2622 lib/RT/Ticket_Overlay.pm:2690
+msgid "Either base or target must be specified"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "אי-מייל"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:51
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "מופעל (מחיקת סימון תיבה זו מבטלת את קבוצה זו)"
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr ""
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:107 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:428
+msgid "Enter multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:425
+msgid "Enter one value"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "הכנס פניות או כתובות כדי לקשר פניות אליהן. הפרד ערכים רבים באמצעות רווחים."
+
+#: html/Elements/Login:39 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+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 ""
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr ""
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr ""
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr ""
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr ""
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "פברואר"
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "פברואר"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr ""
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "עדיפות סופית"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr ""
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Find new/open tickets"
+msgstr ""
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "מצא אנשים ש"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr "מצא פניות"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr ""
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "עמוד ראשון"
+
+#: docs/design_docs/string-extraction-guide.txt:33
+msgid "Foo Bar Baz"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:24
+msgid "Foo!"
+msgstr ""
+
+#: html/Search/Bulk.html:87
+msgid "Force change"
+msgstr "הכרח שינוי"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "נמצאו %1 פניות"
+
+#: lib/RT/Interface/Web.pm:902
+msgid "Found Object"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr ""
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "שישי"
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "כותרים מלאים"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:593
+#. ($New->Name)
+msgid "Given to %1"
+msgstr ""
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "גלובאלי"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr ""
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "חפש"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr ""
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr ""
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr ""
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "קבוצה"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "קבוצה %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "זכויות קבוצה"
+
+#: lib/RT/Group_Overlay.pm:965
+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"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr ""
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "קבוצות"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr ""
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr ""
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "הסטוריה"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr ""
+
+#: html/Elements/Tabs:44
+msgid "Homepage"
+msgstr "דף הבית"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "זהות"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr ""
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr ""
+
+#: 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 "אם עדכנת משהו לעיל, אל תשכח ל"
+
+#: lib/RT/Interface/Web.pm:894
+msgid "Illegal value for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:897
+msgid "Immutable field"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr ""
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr ""
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3796
+msgid "Internal Error"
+msgstr ""
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr ""
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:899
+msgid "Invalid data"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:439
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr ""
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3434
+msgid "Invalid value for custom field"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:346
+msgid "Invalid value for status"
+msgstr ""
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr ""
+
+#: bin/rt-crontool:192
+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 ""
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr ""
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "ינואר"
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "ינואר"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr ""
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "יולי"
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "יולי"
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "ג'מבו"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "יוני"
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "יוני"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr ""
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "מגע אחרון"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "קשר אחרון"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr "נודע לאחרונה"
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "עדכון אחרון"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "נותרה"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "תן למשתמש זה לגשת ל R"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "תן אפשרות להעניק זכויות למשתמש זה"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2704
+msgid "Link already exists"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2716
+msgid "Link could not be created"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2724 lib/RT/Ticket_Overlay.pm:2734
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2645
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2651
+msgid "Link not found"
+msgstr ""
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "קישורים"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "מיקום"
+
+#: lib/RT.pm:159
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr ""
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+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
+msgid "Login"
+msgstr "כניסה"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "יציאה"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "שנה בעלות ל"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "שנה סטטוס"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "שנה תאריך יעד"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "שנה תאריך פתרון"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "שנה תאריך 'הותחל'"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "שנה תאריך התחלה"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "שנע תאריך מגע אחרון"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "שנה עדיפות"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "שנה תור"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "שנה נושא"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "נהל קבוצות וחברות בקבוצות"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "נהל מאפיינים והגדרות שתקפים לכל התורות"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "נהל תורות ומאפיינים ספציפיים לתורות"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "נהל משתמשים וספריות"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "מרץ"
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "מרץ"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "מאי"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "מאי"
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "חבר הוסף"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "חבר נמחק"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "חבר לא נמחק"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "חבר ב"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "חברים"
+
+#: lib/RT/Ticket_Overlay.pm:2891
+msgid "Merge Successful"
+msgstr "מיזוג הצליח"
+
+#: lib/RT/Ticket_Overlay.pm:2811
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "מיזוג נכשל. לא יכולתי להגדיר מזהה אפקטיבי"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "מזג לתוך"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "הודעה"
+
+#: lib/RT/Interface/Web.pm:901
+msgid "Missing a primary key?: %1"
+msgstr "חסר מפתח ראשי?: %1"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "נייד"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "טלפון נייד"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "שנה רשימת בקרת גישה"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr ""
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+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 ""
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Scrip.html:48
+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"
+msgstr ""
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:33
+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 ""
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr ""
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr ""
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr ""
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr ""
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr ""
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr ""
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr ""
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "שנה פנייה מספר %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "שינוי פנוייה מספר %1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "שינוי פניות"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr ""
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr ""
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "שני"
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "עוד לגבי %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr ""
+
+#: html/SelfService/Elements/MyRequests:49
+#. ($friendly_status)
+msgid "My %1 tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "האישורים שלי"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+msgstr "האישורים שלי"
+
+#: html/Admin/Elements/AddCustomFieldValue:33 html/Admin/Elements/EditCustomField:34 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"
+msgstr "שם"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "שם בשימוש"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr ""
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "חדש"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "סיסמא חדשה"
+
+#: etc/initialdata:317 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "יחסים חדשים"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+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 ""
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr "קבוצה חדשה"
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "סיסמא חדשה"
+
+#: lib/RT/User_Overlay.pm:647
+msgid "New password notification sent"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr "תור חדש"
+
+#: NOT FOUND IN SOURCE
+msgid "New request"
+msgstr "בקשה חדשה"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+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 "סקריפ חדש"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "חיפוש חדש"
+
+#: html/Admin/Global/Template.html:60 html/Admin/Global/Templates.html:39 html/Admin/Queues/Template.html:58 html/Admin/Queues/Templates.html:50
+msgid "New template"
+msgstr "תבנית חדשה"
+
+#: html/SelfService/Elements/Tabs:48
+msgid "New ticket"
+msgstr "פנייה חדשה"
+
+#: lib/RT/Ticket_Overlay.pm:2778
+msgid "New ticket doesn't exist"
+msgstr "פנייה חדשה לא קיימת"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr "משתמש חדש"
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "משתמש חדש שנקרא"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "צופים חדשים"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "הבא"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "דף הבא"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "כינוי"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "כינוי"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr ""
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr ""
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr ""
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr ""
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:46
+msgid "No action"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:896
+msgid "No column specified"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr ""
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr ""
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr ""
+
+#: lib/RT/Users_Overlay.pm:145
+msgid "No group specified"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:865
+msgid "No password set"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:342
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:152
+msgid "No permission to create users"
+msgstr ""
+
+#: html/SelfService/Display.html:118
+msgid "No permission to display that ticket"
+msgstr ""
+
+#: html/SelfService/Update.html:52
+msgid "No permission to view update ticket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr ""
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr ""
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr ""
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516
+msgid "No transaction type specified"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr ""
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr ""
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:893
+msgid "No value sent to _Set!\\n"
+msgstr ""
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr "אף אחד"
+
+#: lib/RT/Interface/Web.pm:898
+msgid "Nonexistant field?"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Not logged in"
+msgstr "לא בתוך המערכת"
+
+#: html/Elements/Header:59
+msgid "Not logged in."
+msgstr "לא בתוך המערכת."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "לא הוזן"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Not yet implemented...."
+msgstr ""
+
+#: html/Approvals/Elements/Approve:49
+msgid "Notes"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:650
+msgid "Notification could not be sent"
+msgstr ""
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr ""
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr ""
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr ""
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr ""
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr ""
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr ""
+
+#: etc/initialdata:319 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr ""
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr ""
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr ""
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr ""
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr ""
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "נובמבר"
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "נובמבר"
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr ""
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr ""
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "אוקטובר"
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "אוקטובר"
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "ב"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr ""
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr ""
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr ""
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr ""
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr ""
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr ""
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr ""
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "הצג רק אישורים עבור בקשות שנוצרו אחרי %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "הצג רק אישורים עבור בקשות שנוצרו לפני %1"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "פתוח"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "פתח"
+
+#: NOT FOUND IN SOURCE
+msgid "Open requests"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:42
+msgid "Open tickets"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr ""
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "סידור ומיון"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "ארגון"
+
+#: html/Approvals/Elements/Approve:33
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr ""
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "בעלים"
+
+#: lib/RT/Ticket_Overlay.pm:3071
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:582
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "הבעלים"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "ביפר"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Parent"
+msgstr ""
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:47
+msgid "Parents"
+msgstr "הורים"
+
+#: html/Elements/Login:52 html/User/Prefs.html:61
+msgid "Password"
+msgstr "סיסמא"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "מזכיר סיסמא"
+
+#: lib/RT/User_Overlay.pm:169 lib/RT/User_Overlay.pm:868
+msgid "Password too short"
+msgstr "סיסמא קצרה מדי"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "סיסמא: %1"
+
+#: html/Admin/Users/Modify.html:293
+msgid "Passwords do not match."
+msgstr "הסיסמאות אינן תואמות"
+
+#: html/User/Prefs.html:174
+msgid "Passwords do not match. Your password has not been changed"
+msgstr ""
+
+#: html/Ticket/Elements/ShowSummary:45 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "אנשים"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:101 lib/RT/CustomField_Overlay.pm:202 lib/RT/CustomField_Overlay.pm:234 lib/RT/CustomField_Overlay.pm:511 lib/RT/CustomField_Overlay.pm:91 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2603 lib/RT/Ticket_Overlay.pm:2675 lib/RT/Ticket_Overlay.pm:2769 lib/RT/Ticket_Overlay.pm:2784 lib/RT/Ticket_Overlay.pm:2978 lib/RT/Ticket_Overlay.pm:3206 lib/RT/Ticket_Overlay.pm:3404 lib/RT/Ticket_Overlay.pm:3566 lib/RT/Ticket_Overlay.pm:3618 lib/RT/Ticket_Overlay.pm:3783 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:1355 lib/RT/User_Overlay.pm:570 lib/RT/User_Overlay.pm:605 lib/RT/User_Overlay.pm:861 lib/RT/User_Overlay.pm:962
+msgid "Permission Denied"
+msgstr ""
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr "קבוצות אישיות"
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "קבוצות אישיות"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "קבוצות אישיות"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "מספרי טלפון"
+
+#: NOT FOUND IN SOURCE
+msgid "Placeholder"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr ""
+
+#: html/Elements/Header:52 html/Elements/Tabs:53 html/SelfService/Elements/Tabs:51 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "מאפיינים"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr ""
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "הקודם"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "דף קודם"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:54 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "עדיפות"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr ""
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr ""
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr ""
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr ""
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:33 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "תור"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:44
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr ""
+
+#: html/Ticket/Create.html:205
+msgid "Queue could not be loaded."
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr ""
+
+#: html/SelfService/Display.html:71 lib/RT/CustomField_Overlay.pm:98
+msgid "Queue not found"
+msgstr ""
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "תורים"
+
+#: html/Elements/Quicksearch:25
+msgid "Quick search"
+msgstr "חיפוש מהיר"
+
+#: html/Elements/Login:44
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr ""
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr ""
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "ניהול RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr ""
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT Self Service / Closed Tickets"
+msgstr ""
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr "RT ממבט כולל"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr ""
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT / %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr ""
+
+#: html/Elements/Login:92
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr ""
+
+#: 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 ""
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "שם אמיתי"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "שם אמיתי"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:71
+msgid "Referred to by"
+msgstr "מתייחסים אליו"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:61
+msgid "Refers to"
+msgstr "מתייחס ל"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "חדד את החיפוש"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "רענן דף זה כל %1 דקות."
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:62 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "יחסים עם פניות אחרות"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "הסר העתק ניהולי"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "הסר העתק"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "הסר מבקש"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "הגב"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr "מענה לפנייה"
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "מבקש"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "כתובת האי-מייל של המבקש"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "מבקש(ים)"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "כתובת הפונה"
+
+#: html/SelfService/Create.html:41 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "מבקשים"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr ""
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "אפס נתונים"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "בית"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "פתור"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "פתור פנייה #%1 (%2)"
+
+#: etc/initialdata:308 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "נפתר"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "תגובה למבקשים"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "תוצאות"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "תוצאות לעמוד"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "הקלד שנית:"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr ""
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:792
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:825
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr ""
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "שבת"
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyLinks.html:39 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "שמור שינויים"
+
+#: NOT FOUND IN SOURCE
+msgid "Save changes"
+msgstr "שמור שינויים"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr ""
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr ""
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr ""
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "חיפוש"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr ""
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr ""
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr ""
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr "בחר קבוצה"
+
+#: lib/RT/CustomField_Overlay.pm:422
+msgid "Select multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:419
+msgid "Select one value"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+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 ""
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55 html/Admin/Queues/Templates.html:47
+msgid "Select template"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Self Service"
+msgstr ""
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr ""
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr ""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr ""
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr ""
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr ""
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr ""
+
+#: lib/RT/Date.pm:419
+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 "הצג בקשות שאושרו"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "הצג בקשות שנדחו"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "הצג בקשות ממתינות"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "הצג בקשות שממתינות לאישורים אחרים"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "חתימה"
+
+#: NOT FOUND IN SOURCE
+msgid "Signed in as %1"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr ""
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr ""
+
+#: html/Admin/Elements/AddCustomFieldValue:29
+msgid "Sort"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Sort key"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "סדר תוצאות על פי"
+
+#: NOT FOUND IN SOURCE
+msgid "SortOrder"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "מושהה"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr ""
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "התחיל"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr ""
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "מתחיל ב"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "מדינה"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "מצב"
+
+#: etc/initialdata:294
+msgid "Status Change"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:528
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "גנוב"
+
+#: lib/RT/Transaction_Overlay.pm:587
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "נגנב מ %1"
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:57 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:32 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "נושא"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609
+#. ($self->Data)
+msgid "Subject changed to %1"
+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 "הצליח"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "ראשון"
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr "סופר-משתמש"
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "מערכת"
+
+#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:567 lib/RT/Interface/Web.pm:791 lib/RT/Interface/Web.pm:824
+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 ""
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+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 ""
+
+#: lib/RT/CurrentUser.pm:318
+msgid "TEST_STRING"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "קח"
+
+#: lib/RT/Transaction_Overlay.pm:573
+msgid "Taken"
+msgstr "נלקחה"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr ""
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr ""
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr ""
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:892
+msgid "That is already the current value"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:243
+msgid "That is not a value for this custom field"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That principal already has that right"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3210
+msgid "That ticket has unresolved dependencies"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "That user already has that right"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3020
+msgid "That user already owns that ticket"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2986
+msgid "That user does not exist"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:336
+msgid "That user is already unprivileged"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:328
+msgid "That user is now privileged"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:349
+msgid "That user is now unprivileged"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3012
+msgid "That user may not own tickets in that queue"
+msgstr ""
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr ""
+
+#: html/SelfService/Display.html:32 html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "מידע בסיסי"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr ""
+
+#: bin/rt-crontool:198
+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 ""
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:895
+msgid "The new value has been set."
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr ""
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr ""
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:251
+msgid "This transaction appears to have no content"
+msgstr ""
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr ""
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "חמישי"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket"
+msgstr "פנייה"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1 Jumbo update: %2"
+msgstr "פנייה מספר %1 עדכון ג'מבו: %2"
+
+#: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "פנייה מספר %1 עדכון ג'מבו: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:587 lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr ""
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr ""
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr ""
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Id"
+msgstr ""
+
+#: etc/initialdata:309
+msgid "Ticket Resolved"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "מצורף לפנייה"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:496 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:520
+msgid "Ticket created"
+msgstr "פנייה נוצרה"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:525
+msgid "Ticket deleted"
+msgstr "פנייה נמחקה"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+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:295
+msgid "Ticket status changed"
+msgstr "סטטוס פנייה שונה"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "צופי הפנייה"
+
+#: html/Elements/Tabs:47
+msgid "Tickets"
+msgstr "פניות"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr ""
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr ""
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr ""
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "זמן נותר"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "זמן עבודה"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "זמן נותר"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "זמן להציג"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "זמן עבודה"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr ""
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr ""
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr ""
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:640
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:699
+msgid "Transactions are immutable"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr ""
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "שלישי"
+
+#: html/Admin/Elements/EditCustomField:44 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "סוג"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "לא מייושם"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr ""
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr ""
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "לא מוגבל"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:569
+msgid "Untaken"
+msgstr ""
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "עדכן"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr ""
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "סוג עדכון"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "עדכן את כל הפניות לעיל בבת אחת"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "עדכן אי-מייל"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "עדכן שם"
+
+#: lib/RT/Interface/Web.pm:409
+msgid "Update not recorded."
+msgstr ""
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "עדכן פניות נבחרות"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "עדכן חתימה"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "עדכן פנייה"
+
+#: NOT FOUND IN SOURCE
+msgid "Update ticket # %1"
+msgstr ""
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:47
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr ""
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:407
+msgid "Update type was neither correspondence nor comment."
+msgstr ""
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "עודכן"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr ""
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "מזהה המשתמש"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "מזהה המשתמש"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "זכויות המשתמש"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "שם משתמש"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "משתמשים"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:57
+msgid "Values"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "VrijevormEnkele"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr ""
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "רביעי"
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr ""
+
+#: 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 ""
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "בכל פעם שדבר כלשהוא קורה"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "בכל פעם שפנייה נסגרת"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "בכל פעם שבעלי הפנייה משתנה"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "בכל מצב שתור הפנייה משתנה"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "בכל פעם שמצב הפנייה משתנה"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "בכל פעם שמצב מוגדר על ידי משתמש קורה"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "בכל פעם שהערה מגיעה ב"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "בכל פעם שתכתובת מגיעה ב"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "עבודה"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "טלפון בעבודה"
+
+#: html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "זמן טיפול"
+
+#: lib/RT/Ticket_Overlay.pm:3123
+msgid "You already own this ticket"
+msgstr "אתה כבר הבעלים של פנייה זו"
+
+#: html/autohandler:108
+msgid "You are not an authorized user"
+msgstr "אינך משתמש מורשה"
+
+#: lib/RT/Ticket_Overlay.pm:2998
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "אתה יכול להציב פניה רק אם אתה הבעלים שלה, או שאין לה בעלים"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "אין לך הרשאה כדי לראות את פנייה זו.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "מצאת %1 פניות בתור %2"
+
+#: html/NoAuth/Logout.html:31
+msgid "You have been logged out of RT."
+msgstr "התנתקת מהמערכת."
+
+#: html/SelfService/Display.html:78
+msgid "You have no permission to create tickets in that queue."
+msgstr "אין לך הרשאות ליצור פניות בתור זה."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "אינך מורשה ליצור פניות בתור זה."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "הנך מוזמן להיכנס שנית"
+
+#: NOT FOUND IN SOURCE
+msgid "Your %1 requests"
+msgstr "%1 הבקשות שלך"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "מנהל המערכת לא הגדיר את כתובות הדואר שמפעילות את התוכנה כמו שצריך"
+
+#: etc/initialdata:435 etc/upgrade/2.1.71:146
+msgid "Your request has been approved by %1. Other approvals may still be pending."
+msgstr "בקשתך אושרה על ידי %1. ייתכן שאישורים נוספים עדיין ממתינים."
+
+#: etc/initialdata:469 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "בקשתך אושרה."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "בקשתך נדחתה"
+
+#: etc/initialdata:390 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "בקשתך נדחתה."
+
+#: html/autohandler:127
+msgid "Your username or password is incorrect"
+msgstr "שם המשתמש ו/או הסיסמא אינם נכונים"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+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"
+msgstr "שהוענק ל%1"
+
+#: html/SelfService/Closed.html:28
+msgid "closed"
+msgstr "סגור"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "מכיל"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "תוכן"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "סוג התוכן"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "התכתבות (כנראה) לא נשלחה"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "התכתבות נשלחה"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "ימים"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr ""
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "מחק"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "מחוק"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "לא מכיל"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "לא מכיל"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "שווה ל"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "שם קובץ"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "גדול מ"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "קבוצה %1"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "שעות"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "מזהה"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "הוא"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "הוא לא"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "פחות מ"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "מכיל"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "דקות"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "דקות"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr ""
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "חודשים"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "חדש"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr "אין ערך"
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "אין"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "לא שווה ל"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr ""
+
+#: html/SelfService/Elements/MyRequests:61 lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "פתוח"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "נדחה"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "פתור"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "מושהה"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr ""
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr ""
+
+#: 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 ""
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr ""
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr ""
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr ""
diff --git a/rt/lib/RT/I18N/i_default.pm b/rt/lib/RT/I18N/i_default.pm
new file mode 100644 (file)
index 0000000..1547026
--- /dev/null
@@ -0,0 +1,86 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::i_default;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::I18N);
+
+eval "require RT::I18N::i_default_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/I18N/i_default_Vendor.pm});
+eval "require RT::I18N::i_default_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/I18N/i_default_Local.pm});
+
+1;
+
+__END__
+
+This class just zero-derives from the project base class, which
+is English for this project.  i-default is "English at least".  It
+wouldn't be a bad idea to make our i-default messages be English
+plus, say, French -- i-default is meant to /contain/ English, not
+be /just/ English.  If you have all your English messages in
+Whatever::en and all your French messages in Whatever::fr, it
+would be straightforward to define Whatever::i_default's as a subclass
+of Whatever::en, but for every case where a key gets you a string
+(as opposed to a coderef) from %Whatever::en::Lexicon and
+%Whatever::fr::Lexicon, you could make %Whatever::i_default::Lexicon 
+be the concatenation of them both.  So: "file '[_1]' not found.\n" and
+"fichier '[_1]' non trouve\n" could make for an
+%Whatever::i_default::Lexicon entry of
+"file '[_1]' not found\nfichier '[_1]' non trouve.\n".
+
+There may be entries, however, where that is undesirable.
+And in any case, it's not feasable once you have an _AUTO lexicon
+in the mix, as wo do here.
+
+
+
+RFC 2277 says: 
+
+4.5.  Default Language
+
+   When human-readable text must be presented in a context where the
+   sender has no knowledge of the recipient's language preferences (such
+   as login failures or E-mailed warnings, or prior to language
+   negotiation), text SHOULD be presented in Default Language.
+
+   Default Language is assigned the tag "i-default" according to the
+   procedures of RFC 1766. It is not a specific language, but rather
+   identifies the condition where the language preferences of the user
+   cannot be established.
+
+   Messages in Default Language MUST be understandable by an English-
+   speaking person, since English is the language which, worldwide, the
+   greatest number of people will be able to get adequate help in
+   interpreting when working with computers.
+
+   Note that negotiating English is NOT the same as Default Language;
+   Default Language is an emergency measure in otherwise unmanageable
+   situations.
+
+   In many cases, using only English text is reasonable; in some cases,
+   the English text may be augumented by text in other languages.
+
+
diff --git a/rt/lib/RT/I18N/ja.po b/rt/lib/RT/I18N/ja.po
new file mode 100644 (file)
index 0000000..c0401f8
--- /dev/null
@@ -0,0 +1,4822 @@
+# Japanese translation by Interactive Artists LLC 
+# 0.1 2002 08 15
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 2.1.x\n"
+"POT-Creation-Date: 2002-05-02 11:36+0800\n"
+"PO-Revision-Date: 2002-05-13 02:00+0800\n"
+"Last-Translator: Jesse Vincent <jesse@bestpractical.com>\n"
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr ""
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr ""
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr ""
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %2 %3 %4:%5:%6 %7"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr ""
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%3に変更された%1 %2 "
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+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"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 このチケット\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr ""
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr ""
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr ""
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "%1スクリプトアクションロードしました"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%2と同じバリューの%1が追加されました"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1aliasesを動かすためにチケットIDが必要です"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "%1aliasesを動かすためにチケットIDが必要です "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1aliasesを動かすためにチケットIDが必要です(%2から) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%2による%1"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+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 "%1はトランザクションをはじめることができませんでした(%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1は分解するステータスを設定できませんでした。RTのデータベースに一貫性がない可能性があります。"
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr ""
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr ""
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1はこのキューでは%2ではありません"
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1はこのチケットでは%2ではありません"
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+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 "%1は有効なキューIDではありません。"
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1分"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1表示されません"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 成功しました\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "%1タイプは$MessageIdIDでは不明です"
+
+#: NOT FOUND IN SOURCE
+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."
+msgstr "%1は分解されたグループチケットのすべてのメンバーを分解します。"
+
+#: NOT FOUND IN SOURCE
+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:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1:アタッチメントが特定できません"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "%1'はステータスに無効名バリューです"
+
+#: NOT FOUND IN SOURCE
+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 "(チケットIDまたはURLsを空欄で区切って入力してください)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(メンバーなし)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(スクリプトなし)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr ""
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Eメールアドレスにおけるカンマで区切られたリストへの正確なアップデートのブラインドコピーを送る。今後のアップデートを誰が受信するかは<b>変更できません</b>)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Eメールアドレスにおけるカンマで区切られたリストへの正確なアップデートのコピーを送る。今後のアップデートを誰が受信するかは<b>変更できません</b>)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(空)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr ""
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(サブジェクトなし)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(バリューなし)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(ひとつのチケットのみ)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr ""
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(必要です)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+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の最も重要な優先権"
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr ""
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"新しいチケット\">&nbsp;%1"
+
+#: 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 ""
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "エースはみつかりません"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "エースは作成、削除のみです。"
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "意図的でないチケットの修正を防ぐために強制終了します。\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "アクセスコントロール"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "アクション"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "アクション%1は見つかりません"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr ""
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr ""
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "管理Ccを追加する"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Ccを追加する"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Add Next State"
+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"
+msgstr "すべてのキューに適応するスクリプトを追加する"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "選択されたチケットへのコメントまたは返事を追加する"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "メンバーを追加する"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+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"
+msgstr "このキューに%1の責任者を追加しました"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "このチケットに%1の責任者を追加しました"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "住所1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "住所2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "管理Cc"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr ""
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr ""
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "管理キュー"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "管理ユーザー"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "管理/グローバル設定"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "管理/グループ"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+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 "管理Cc"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr ""
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "管理者Cc"
+
+#: 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 ""
+
+#: 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 ""
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr ""
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr ""
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr ""
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr ""
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr ""
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "四月"
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "昇順"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "添付"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "添付ファイル"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr ""
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "添付ファイル%1は見つかりません"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "添付ファイルが作成されました"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "添付ファイル名"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "添付ファイル"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "八月"
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "自動システム"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr ""
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "悪いPGP署名: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "悪い添付IDです。添付ファイルが見つかりません'%1'\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "%1の悪いデータです"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "添付ファイルにとって悪いトランザクションナンバーです。%1は%2\\nのはずです"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "基本"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Bcc"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "本当に変更を保存してもよろしいですか"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "前"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr ""
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr ""
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "この検索にブックマークのできるURLです"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "短いヘッダー"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "チケットの一括アップデート"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "システムユーザーを修正できません"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "氏名なしにカスタムフィールドバリューの追加はできません"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "チケット自体にはリンクできません"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "すでに結合したチケットには結合できません。このエラーは決して出さないでください"
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "ベースとターゲットを特定できません"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "ユーザー: %1を作成できません"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "パスワードを変更する"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "権利を無効にするチェックボックス"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "子供"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "町"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "終了したリクエストです"
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "理解していないコマンド!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "コメント"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "コメントアドレス"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "記録されていないコメント"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "コメント"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "コメント(リクエスとした人には送信されません)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "コメント(リクエスとした人には送信されません)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "%1についてのコメント"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "このユーザーについてのコメント"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "コメントが追加されました"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "コメントが短くされました"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "コンパイル規制"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "コンディション"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "コンディションが見つかりません"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "設定"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "確認"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "コンタクト情報"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "コンタクトされた日にち'%1'を解析できませんでした"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "情報"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr ""
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "メールアドレス"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "通信が追加されました"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "記録されていない通信"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "チケットの新しいカスタムフィールドバリューを追加できませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "オーナー変更ができませんでした"
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "カスタムフィールドの作成ができませんでした"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "グループの作成ができませんでした"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "テンプレート: %1の作成ができませんでした"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "チケットの作成ができませんでした。キューがセットされていません"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "ユーザーの作成ができませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "チケットとそのID%1が見つかりませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "グループ %1が見つかりませんでした"
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "そのユーザーを作成または見つけることができませんでした"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "その責任者を見つけることができませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "ユーザー%1を見つけることができませんでした"
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "グループをロードできませんでした"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "このキューでその責任者を%1にすることができませんでした"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "このチケットでその責任者を%1にすることができませんでした"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "このキューでその責任者を%1として削除することができませんでした"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "このチケットでその責任者を%1として削除することができませんでした"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "グループにメンバーの追加ができませんでした"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "トランザクション: %1の作成ができませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "GPGの返事\\nから何を行ったらよいのかわかりませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "グループ\\nが見つかりませんでした"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "責任者が見つかりませんでした"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "そのバリューが見つかりませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "ユーザー\\nが見つかりませんでした"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "ユーザーデータベース\\nから%1をロードできませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "RT設定ファイル'%1' %2をロードできませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "スクリプトをロードできませんでした"
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "グループ%1をロードできませんでした"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "リンクをロードできませんでした"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "キューをロードできませんでした"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "キュー%1をロードできませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "スクリプトをロードできませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "テンプレートをロードできませんでした"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "そのユーザー(%1)をロードできませんでした"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "チケット'%1'をロードできませんでした"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "国"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "作成"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "カスタムフィールドの作成"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "新しいカスタムフィールドの作成"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "新しいグローバルスクリプトの作成"
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "新しいグループの作成"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "新しい個人グループの作成"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "新しいキューの作成"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "新しいテンプレートの作成"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "新しいチケットの作成"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "新しいユーザーの作成"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "キューの作成"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "呼び出されたキューの作成"
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "リクエストの作成"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "テンプレートの作成"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr ""
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr ""
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "チケットの作成"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr ""
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "作成しました"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "カスタムフィールド%1を作成しました"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "テンプレート%1を作成しました"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "現在の関係"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "現在のメンバー"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "現在の権利"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr ""
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "現在のウォッチャー"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:35
+msgid "Custom Fields"
+msgstr "カスタムフィールド"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr ""
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "カスタムフィールド%1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "カスタムフィールド%1はバリューがあります"
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "カスタムフィールド%1はバリューがありません"
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "カスタムフィールド%1が見つかりません"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "カスタムフィールドが見つかりません"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "カスタムフィールド%2のためのカスタムフィールドバリュー%1が見つかりません"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "カスタムフィールドが%1から%2に変更されました"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "カスタムフィールドバリューは削除されません"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "カスタムフィールドバリューが見つかりません"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "カスタムフィールドバリューが削除されました"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr ""
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "日付"
+
+#: lib/RT/Date.pm:422
+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 ""
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr ""
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr ""
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr ""
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr ""
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "代表者の権利"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr ""
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr ""
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "削除"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "このオブジェクトを削除すると指示の完全性がくずされる可能性があります"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "このオブジェクトを削除すると指示の完全性がくずされます"
+
+#: lib/RT/User_Overlay.pm:430
+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 ""
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "次のもの次第である"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "従属チケット: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "による"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "降順する"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "下の問題点を表す"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "記述"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "詳細"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "表す"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr ""
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "モードを表す"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "チケット#%1を表す"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr ""
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "このページを更新しないでください"
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "ダウンロード"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "期限切れ"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "期限が切れる日'%1'は解析されません"
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "ERROR: はチケット '%1': %2.\\nをロードできませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "編集"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr ""
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "%1のカスタムフィールドを編集する"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "関係を編集する"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "スクリプトを編集する"
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "システムテンプレートを編集する"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "%1のテンプレートを編集する"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "キュー%1の設定を編集する"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "ユーザー%1の設定を編集する"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "カスタムフィールド%1を編集する"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "グループ%1の会員を編集する"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "個人グループ%1の会員を編集する"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "テンプレート%1を編集する"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "ベースもしくはターゲットを特定しなければなりません"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Eメール"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "お使いのEメールアドレス"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "Eメールアドレス"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "Eメールエンコーディング"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr ""
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "有効になりました(もう一度このボックスをチェックするとこのキューは有効でなくなります)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr ""
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "有効なキュー"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "有効なステータス%1"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "チケットをリンクするチケットまたはURLsを入力してください。入力する項目がいくつかある場合にはスペースで区切ってください。"
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+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"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "パラメーターのエラーQueue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "パラメーターのエラーTicket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "パラメーターのエラーTicket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr ""
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "外部の認証ID"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "外部のコンタクト情報ID"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "その他の情報"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "'特権のある'ユーザーの擬似グループの検索が失敗しました"
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "'特権のない'ユーザーの擬似グループの検索が失敗しました"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr ""
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "二月"
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "終了"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "最終優先順位"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr ""
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr ""
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "新しい/開くチケットを見つける"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "人々を見つける"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "最初の"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "最初のページ"
+
+#: 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 "ばか!"
+
+#: html/Search/Bulk.html:87
+msgid "Force change"
+msgstr "変更を強制します"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "フリーフォームコンタクト情報"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr ""
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "金曜日"
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "フルヘッダー"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "pgp sig\\nから現在のユーザーを得る"
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr ""
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "グローバル"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "グローバルスクリプト"
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "行く!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "%1\\nからの良いpgp sig"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "ページへ行く"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "チケットに行く"
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr ""
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "グループ%1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "グループ権利"
+
+#: lib/RT/Group_Overlay.pm:965
+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"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "グループが作成されました"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "グループが見つかりません"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "グループが見つかりません。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "グループが特定できません。\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "グループ"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "グループは彼らのメンバーにはなれません"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "こんにちは!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "こんにちは、%1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "ヒストリー"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "自宅の電話"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "ホームページ"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "私は[quant,_1,concrete mixer]があります。"
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "ID"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "身分証明書"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr ""
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr ""
+
+#: 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 "上の何かをアップデートしたなら、次のことを確認してください"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr ""
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "リストの無効なキューを含む"
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "検索の無効なユーザーを含む"
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "最初の優先権"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "入力エラー"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr ""
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "無効なグループタイプです"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "無効なオーナーです。 '誰でもない'に初期設定します."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "無効なキューです"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "無効な権利です"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "%1には無効なバリューです"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "カスタムフィールドには無効なバリューです"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "ステータスには無効なバリューです"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr ""
+
+#: bin/rt-crontool:192
+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 ""
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr ""
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "一月"
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr ""
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "七月"
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "大きい"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "六月"
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "キーワード"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "長い"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "最後の"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "最後のコンタクト"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "最後にコンタクトした"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr ""
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "最後にアップデートした"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "残った"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "このユーザーをRTにアクセスします"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "このユーザーの権利を認めます"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "オーナーを%1 %2に制限します"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "キューを%1 %2に制限します"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "リンクはすでに存在しています"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "リンクが作成されませんでした"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "リンクが作成されました(%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "リンクが削除されました(%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "リンクが見つかりません"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "リンクチケット#%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "リンク"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "場所"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "ログディレクトリー%1が見つからない、または書き出せません。\\n RTが動きません"
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "%1としてサインする"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "ログイン"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "ログアウト"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "オーナーを決める"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "ステータスを決める"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "期限期日を決める"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "解析期日を決める"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "開始した日を決める"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "開始日を決める"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "いわれた日を決める"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "優先順位を決める"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "キューを決める"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "サブジェクトを決める"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr ""
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr ""
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr ""
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr ""
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "三月"
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr ""
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "五月"
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "メンバーが追加されました"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "メンバーが削除されました"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "メンバーが削除されていません"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "のメンバー"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "メンバー"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "結合が成功しました"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "結合が失敗しました。有効なIDが設定できませんでした"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "に結合"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "携帯"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "携帯電話"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "カスタムフィールド%1を修正する"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+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 ""
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr ""
+
+#: html/Admin/Global/Scrip.html:48
+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"
+msgstr "#%1の期日を修正する"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "チケット#%1の期日を修正する"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "グローバルグループの権利を修正する"
+
+#: html/Admin/Global/GroupRights.html:33
+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 ""
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "グローバルユーザーの権利を修正する"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "%1のグループ権利を修正する"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "キュー%1のグループ権利を修正する"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr ""
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "キュー%1に関係のある人々を修正する"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "チケット#%1に関係のある人々を修正する"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "キュー%1のスクリプトを修正する"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr ""
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "テンプレート%1を修正する"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "グループ%1を修正する"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "ユーザー%1を修正する"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "チケット# %1を修正する"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "チケット#%1を修正する"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr ""
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "グループ%1のユーザー権利を修正する"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "キュー%1のユーザー権利を修正する"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "キュー'%1'のウォッチャーを修正する"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr ""
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "月曜日"
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "さらに%1について"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "多くの"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "'名前'の属性を特定してください"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr ""
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+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"
+msgstr "名前"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "現在お使いの名前"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr ""
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "新しい"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "新しいパスワード"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "新しい関係"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+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 ""
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr ""
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "新しいパスワード"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "新しいパスワード情報が送られました"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "新しいリクエスト"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+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 ""
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+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 ""
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "新しいチケットはありません"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr ""
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "新しいユーザーが呼ばれました"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "新しいウォッチャー"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "新しいウインドウ設定"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "次へ"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "次のページ"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "ニックネーム"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "カスタムフィールドがありません"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "グループが定義されません"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "キューが定義されません"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "RTユーザーが見つかりません。RT管理者に相談してください。\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "テンプレートがありません"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "チケットが特定できません。チケットを終了します"
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "チケットが特定できません。チケットの修正を終了します\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "コマンドが見つかりません\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "このユーザーに関してのコメントは入力されていません"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "通信文書の添付はありません"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "%1記述はありません"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "グループが特定できません"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "パスワードが設定されません"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "キューを作成する許可がされていません"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "ユーザーを作成する許可がされていません"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "そのチケットを表示する許可がありません"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "アップデートチケットを見る許可がさありません"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "責任者が特定できません"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "責任者が選択されていません"
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "検索基準にあったキューが見つかりません"
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "権利が許可されていません"
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "操作のための検索ができません"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "チケットIDが特定できません"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "トランザクションタイプが特定できません"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr ""
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "検索基準にあったユーザーが見つかりません"
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "有効なRTユーザーが見つかりません。RT cvcハンドラが分離しています。RT管理者に相談してください。\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr ""
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr ""
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr ""
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "ログインできません"
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "セットできません"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "まだ実行できません"
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "まだ実行できません。。。"
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "お知らせを送ることができませんでした"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr ""
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr ""
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr ""
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr ""
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr ""
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr ""
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr ""
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr ""
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr ""
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr ""
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr ""
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "十一月"
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr ""
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr ""
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr ""
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "十月"
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr ""
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "に"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr ""
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr ""
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr ""
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr ""
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr ""
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr ""
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr ""
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr ""
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "開く"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "それを開く"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "リクエストを開く"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "チケットを(リストから)新しいウインドウから開く"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "チケットを(リストから)ほかのウインドウから開く"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "整列と並び替え"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "組織"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "時間切れです、優先順位がうつりました"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr ""
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "オーナー"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "オーナーは強制的に%1から%2を変更しました"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "オーナーは"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "ポケットベル"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "ポケットベル電話"
+
+#: NOT FOUND IN SOURCE
+msgid "Parent"
+msgstr ""
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "両親"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "パスワード"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "パスワードのお知らせ"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "パスワードが短すぎます"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "パスワード: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "人々"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "許可が下りませんでした"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr ""
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "個人グループ"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "個人グループ:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "電話番号"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "代替物"
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr "お気に入り"
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "お気に入り"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr ""
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Prepare Stubbed"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "前の"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "前のページ"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "優先権"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "優先権"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "優先順位は次のように始まります"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "特権ステータス: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "特権のあるユーザー"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr ""
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "キュー"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "キュー'%1'は見つかりませんでした\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "キューの名前"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "キュースクリプト"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "キューはすでに存在しています"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "キューの作成ができませんでした"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "キューのロードができませんでした"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "キューが作成されました"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr ""
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "キューが見つかりません"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "キュー"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "%2のRT %1"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "<a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>からのRT%1。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr ""
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "RT管理"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "RT認証エラー"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RTバウンス:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "RT設定エラー"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "RT重大なエラー。メッセージが記録されません"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "RTエラー"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT受信メール(%1)自身からのメール "
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr ""
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "RTセルフサービス/クローズされたチケット"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RTでは、ただいまお使いの方の認証ができませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RTは外部のデータベースルックアップを使ってリクエストする人を見つけることができませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RTはキュー: %1を見つけることができませんでした"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+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 ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RTはあなたののコマンドを処理しました"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RTは&コピー; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;。これは<a href=\"http://www.gnu.org/copyleft/gpl.html\">GNUジェネラルパブリックライセンスのバージョン2で配信されています。</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RTによるとこのメッセージはバウンスする可能性があります"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RTはこのメッセージがまるでサインされていないように処理します。\\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のEメールコマンドモードではPGP認証が必要になります。貴方のメッセージにサインしなかった、もしくははサインが有効でありません"
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "本名"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "本名"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "次のものによって参照した"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "参照する"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "絞り込む"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "絞込み検索"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "このページを%1分おきに更新してください"
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "関係"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "管理Ccを削除する"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Ccを削除する"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "リクエストする人を削除する"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "返信"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr ""
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "リクエストする人"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "リクエストする人のEメールアドレス"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr ""
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "リクエストする人"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "リクエストは次の日までに行われなければなりません"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "リセット"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "住所"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "分解する"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr ""
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "分解した"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "リクエストする人に返答する"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "結果"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "ページごとの結果"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "パスワードの再入力"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "%2 %3の権利%1が領域%4 %5\\nで見つかりませんでした"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "権利が委託されました"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "権利が許可されました"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "権利がロードされました"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "権利を無効にできませんでした"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "権利が見つかりませんでした"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "権利がロードできませんでした"
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "権利が無効になりました"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "権利"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "役割"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr ""
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "土曜日"
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "変更を保存する"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "変更を保存する"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "スクリプトが作成されました"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "スクリプト"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "%1\\nのスクリプト"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr ""
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "検索"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "検索基準"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr ""
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr ""
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "グループの選択"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "キューの選択"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "ユーザーの選択"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+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 ""
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr ""
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "セルフサービス"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr ""
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr ""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr ""
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr ""
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr ""
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr ""
+
+#: lib/RT/Date.pm:419
+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 ""
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "基本を見る"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr ""
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "詳細を見る"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "サイン"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "ひとつの"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "並べ替えのキー"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "次の項目ごとの並び替え"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "並び順"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "停止しています"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "開始ページ"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "開始した"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "開始日'%1'は見つかりませんでした"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "開始する"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "次の日時までに開始する"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "開始日'%1'を解析できませんでした"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "状態"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "ステータス"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+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 "盗用する"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "%1から盗用した"
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "サブジェクト"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr ""
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "提出"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr ""
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "日曜日"
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+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 "システムエラー。権利が委任されていません"
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+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 ""
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "テスト_ストリング"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "とる"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "とられた"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "テンプレート"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr ""
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "テンプレートが見つかりません"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "テンプレートが見つかりません\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "テンプレートが解析されました"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "テンプレート"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "%1\\nのテンプレート"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "それはこのカスタムフィールドのバリューではありません"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "それは同じバリューです"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "その責任者はすでにこのキューの%1です"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "その責任者はすでにこのチケットの%1です"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "その責任者はこのキューの%1ではありません"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "その責任者はこのチケットの%1ではありません"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "そのキューはありません"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "そのチケットは従属物をすでに分解しました"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "そのユーザーはすでに権利があります"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "そのユーザーはすでにチケットを所有しています"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "そのユーザーは存在しません"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "そのユーザーはすでに特権が与えられています"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "そのユーザーにはすでに特権がありません"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "そのユーザーは今特権を与えられました"
+
+#: lib/RT/User_Overlay.pm:344
+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 "そのユーザーはこのキューではチケットを所有していない可能性があります"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "それは数字のIDではありません"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "基本"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "コメントは記録されました"
+
+#: bin/rt-crontool:198
+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 ""
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "次のコマンドは処理されませんでした:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr ""
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "それらのコメントは実際ユーザーには見ることができません"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "このチケット%1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "このトランザクションにはコンテンツがありません"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "このユーザーの25のもっとも高い優先チケット"
+
+#: lib/RT/Date.pm:391
+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"
+msgstr "チケット #%1 大きいアップデート: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "チケット %1がキュー '%2'で作成されました"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "チケット%1がロードされました\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "チケット %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "チケットヒストリー # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "チケットID"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "チケット添付"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "チケットコンテンツ"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+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 ""
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "チケットが作成されました"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "チケットの作成が失敗しました"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "チケットが削除されました"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+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 ""
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "チケットウォッチャー"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr ""
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "%1からのチケット"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr ""
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "時間が残っています"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "使った時間"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "残っている時間"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "表示する時間"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "使った時間"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr ""
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "このコミットのディフをつくるために:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "このコミットのディフをつくるために:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "言った"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "トランザクション%1が消去されました"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "トランザクションが作成されました"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "トランザクションは変更されることはありません"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "権利: %1を削除しています"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "火曜日"
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "タイプ"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "導入されていない"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Unixログイン"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "Unixユーザーネーム"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "不明なコンテンツエンコーディング%1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "制限されていない"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "とられていない"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "アップデート"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "アップデートID"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "アップデートタイプ"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "すべてのチケットを一度にアップデートする"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "アップデートEメール"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "アップデートネーム"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "アップデートは記録されませんでした"
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "選択されたチケットをアップデートする"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "サインをアップデートする"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "チケットをアップデートする"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "アップデートチケット # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "アップデートチケット #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "アップデートタイプは通知でもコメントでもありません"
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "アップデートしました"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "ユーザー%1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "ユーザー%1パスワード: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "ユーザー'%1'が見つかりません"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "ユーザー'%1'が見つかりません\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "ユーザーID"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "ユーザーID"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "ユーザー権利"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "ユーザーを作成することができませんでした: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "ユーザーが作成されました"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "ユーザーがグループを決定しました"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "ユーザーに通告されました"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "ユーザービュー"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "ユーザーネーム"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "ユーザー"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "ユーザーが検索基準にあっています"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "キューのバリュー"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "バリュー"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "ウォッチャー"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "ウェブエンコーディング"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "水曜日"
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr ""
+
+#: 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 ""
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr ""
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr ""
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr ""
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr ""
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr ""
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr ""
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr ""
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "仕事"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "仕事先の電話"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Worked"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "あなたはすでにこのチケットを所有しています"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "あなたは認証されたユーザーではありません"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "あなたは所有、または所有されていないチケットのみを止めることができます"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "あなたはそのチケットを見る許可がありません。\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "あなたは%2でチケット%1を見つけました"
+
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "あなたはRTからログアウトしたままです"
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "あなたはこのキューでチケット作成の許可がありません"
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "あなたはこのキューでリクエストの作成ができるでしょう"
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "ぜひまたログインしてください"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "あなたの%1のリクエスト"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "あなたのRT管理者はRTを呼び出すメールaliasesを設定できませんでした"
+
+#: etc/initialdata:429 etc/upgrade/2.1.71:146
+msgid "Your request has been approved by %1. Other approvals may still be pending."
+msgstr ""
+
+#: 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 ""
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr ""
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "あなたののユーザーネームとパスワードが間違っています"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+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"
+msgstr "%1への許可"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "含む"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "通知は(おそらく)送信されていません"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "通知が送信されました"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "日"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr ""
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "削除"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "削除された"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "あいません"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "含みません"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "等しい"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr ""
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "より大きい"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "グループ'%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "時間"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "ID"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "です"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "でない"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "より少ない"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "合う"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "最低"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "分"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "修正\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "月"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "新しい"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr ""
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "なし"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "等しくない"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "開く"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "ユーザー '%2' のパーソナルグループ '%1' "
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "キュー %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "拒否されました"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "分解されました"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "秒"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "止まりました"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "システム %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "システムグループ '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "呼び出しているコンポーネントがなぜ次のようなことが起こるのか特定できませんでした"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+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
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "ユーザー %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "週"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "テンプレート %1と"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "年"
+
+#: NOT FOUND IN SOURCE
+msgid "ニックネーム"
+msgstr ""
+
diff --git a/rt/lib/RT/I18N/nl.po b/rt/lib/RT/I18N/nl.po
new file mode 100644 (file)
index 0000000..0c35499
--- /dev/null
@@ -0,0 +1,4819 @@
+msgid ""
+msgstr ""
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr "" 
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %2 %3 %4:%5:%6 %7"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%1 %2 toegevoegd"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "%1 %2 geleden"
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 veranderd naar %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 verwijderd"
+
+#: 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"
+msgstr "%1 %2 met sjabloon %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 dit ticket\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr ""
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - Een argument om door te geven aan %2"
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - Uitvoer status herzieningen naar STDOUT"
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Specificeer de actie module die u wenst te gebruiken"
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Specificeer de conditie module die u wenst te gebruiken"
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Specificeer de zoek module die u wenst te gebruiken"
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "%1 ScripAction geladen"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 toegevoegd als waarde voor %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1 aliassen hebben een TicketId nodig om mee te werken"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "%1 aliassen hebben een TicketId nodig om mee te werken"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1 aliassen hebben een TicketId nodig om mee te werken (van %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 door %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 veranderd van %2 naar %3"
+
+#: lib/RT/Interface/Web.pm:857
+msgid "%1 could not be set to %2."
+msgstr "%1 kon niet veranderd worden naar %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 kon geen transactie initiëren (%2)"
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 kon status niet veranderen naar opgelost. RT's Database zou inconsistent kunnen zijn"
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "De %1 hoogste prioriteit tickets die ik bezit..."
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "De %1 hoogste prioriteit tickets waarom ik verzocht heb..."
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 is een gereedschap om te reageren op tickets van een extern rooster programma, zoals cron"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 is niet langer een %2 voor deze rij"
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 is niet langer een %2 voor dit ticket"
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 is niet langer een waarde voor specifiek veld %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 is niet een geldig Rij id"
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 niet afgebeeld"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1 rechten"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 gelukt\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "%1 type onbekend voor $MessageId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "%1 type onbekend voor %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."
+msgstr "%1 zal alle leden van een opgelost groep ticket omzetten."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: geen aanhechting gespecificeerd"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr "%1b"
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k"
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1 is een ongeldige waarde voor status"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "'%1' onherkende actie. "
+
+#: 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 "(Vink hokje af om te verwijderen)"
+
+#: 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 "(Vul ticket ids of URLs in, gescheiden door spaties)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(Geen Waarde)"
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Geen Leden)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Geen scrips)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr ""
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Stuurt een blinde carbon copy van deze herziening naar een comma gescheiden lijst van email adressen. Wie er toekomstige herzieningen zal ontvangen, zal <b>niet</b> veranderen.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Stuurt een carbon copy van deze herziening naar een comma gescheiden lijst van email adressen. Wie er toekomstige herzieningen zal ontvangen, zal <b>niet</b> veranderen.)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(leeg)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr ""
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(geen onderwerp)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(geen waarde)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(slechts één ticket)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr "(wacht op goedkeuring)"
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr "(wacht op andere tickets)"
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(verplicht)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr "(zonder titel)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Nieuw ticket in\">&nbsp;%1"
+
+#: NOT FOUND IN SOURCE
+msgid "??????"
+msgstr ""
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "Een leeg sjabloon"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE Verwijderd"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE Geladen"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE niet gevonden"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACEs kunnen allen gecreëerd of verwijderd worden."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Afbraak om ongewenste ticket aanpassing te voorkomen.\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Toegangscontrole"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Actie"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Actie %1 niet gevonden"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Actie uitgevoerd."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Actie voorbereid..."
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Voeg AdminCc toe"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Voeg Cc toe"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr "Voeg Meer Bestanden Toe"
+
+#: NOT FOUND IN SOURCE
+msgid "Add Next State"
+msgstr ""
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Voeg Verzoeker Toe"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a Scrip to this queue"
+msgstr "Voeg een Scrip toe aan deze rij"
+
+#: 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"
+msgstr "Voeg een scrip toe welke voor alle rijen zal gelden"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Voeg commentaar of reacties toe aan geselecteerde tickets"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Voeg leden toe"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Voeg nieuwe toeschouwers toe"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr "VoegVolgendeStaatToe"
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Hoofd toegevoegd als %1 voor deze rij"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Hoofd toegevoegd als %1 voor dit ticket"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Adres1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Adres2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Beheerder Cc"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr ""
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr ""
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Beheerder rijen"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Beheerder gebruikers"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Beheerder/Globale configuratie"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Beheerder/Groepen"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Beheerder/Rij/Basis"
+
+#: 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 "BeheerderCc"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "BeheerderCommentaar"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "BeheerderCorrespondentie"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr "BeheerderSpecifiekeVelden"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr "BeheerderGroep"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr "BeheerderGroepLidmaatschap"
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr "BeheerderBezitPersoonlijkeGroepen"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr "BeheerderRij"
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr "BeheerderGebruikers"
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Administratieve Cc"
+
+#: NOT FOUND IN SOURCE
+msgid "Admins"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Uitgebreid Zoeken"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Nadat"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Leeftijd"
+
+#: 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 ""
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Alle Rijen"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "Stuurt altijd een bericht naar de verzoekers ongeacht de verzender van het bericht"
+
+#: html/Elements/Tabs:58
+msgid "Approval"
+msgstr "Goedkeuring"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Goedkeuring #%1: %2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Goedkeuring #%1: Notities niet bewaard vanwege een systeem fout"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Goedkeuring #%1: Notities bewaard"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr "Goedkeuring Details"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr "Goedkeuring diagram"
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr "Goedkeuring"
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Notities van de goedkeurer: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Ggk."
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "april"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "Oplopend"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Aanhechten"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Hecht bestand aan"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "Aangehecht bestand"
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Aanhechting '%1' kon niet geladen worden"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Aanhechting gecreëerd"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Aanhechting bestandsnaam"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Aanhechtingen"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "aug."
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "augustus"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "AuthenticatieSysteem"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "Automatisch-antwoord"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "Automatisch-antwoordAanVerzoekers"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Ongeldige PGP Signatuur: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Ongeldig aanhechtings id. Kon aanhechting '%1' niet vinden\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Ongeldige data in %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Ongeldig transactienummer voor aanhechting. %1 zou %2 moeten zijn\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Basis"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Bcc"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Zorg ervoor dat u uw veranderingen bewaard"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "Voorheen"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr "Begin Goedkeuring"
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Blanco"
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "XXX URL voor deze zoekopdracht"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Korte koppen"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Bulk ticketherziening"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "Kan systeemgebruikers niet wijzigen"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr "Kan dit hoofd deze rij zien"
+
+#: lib/RT/CustomFieLd_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "Kan geen specifiek veld toevoegen zonder een naam"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "Kan een ticket niet koppelen aan zichzelf"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Kan niet samenvoegen met een reeds samengevoegd ticket. U zou deze boodschap nooit mogen krijgen"
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "Kan niet zowel basis als doel specificeren"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Kan gebruiker %1 niet aanmaken"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Wijzig wachtwoord"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "Vink hokje af om te verwijderen"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Vink hokje af om recht te verwijderen"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Kinderen"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Stad"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Gesloten verzoeken"
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Commando niet begrepen!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Commentaar"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Commentaar Adres"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Commentaar niet bewaard"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr "Commentaar op tickets"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr "CommentaarOpTicket"
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Commentaar"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Commentaar (Wordt niet verstuurd aan verzoekers)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Commentaar (Wordt niet verstuurd aan verzoekers)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Commentaar over %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Commentaar over deze gebruiker"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Commentaar toegevoegd"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Compilatie Restricties"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Voorwaarde"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "Voorwaarde komt overeen..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Voorwaarde niet gevonden"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Configuratie"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Bevestig"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "ContactInfoSysteem"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Contact datum '%1' kon niet ontleed worden"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Inhoud"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr ""
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr "Correspondentie"
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Correspondentieadres"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Correspondentie toegevoegd"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Correspondentie niet bewaard"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "Kon nieuw specifiek veld niet toevoegen voor dit ticket. "
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr "Kon nieuw specifiek veld niet toevoegen voor dit ticket. %1"
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "Kon eigenaar niet wijzigen. "
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Kon SpecifiekVeld niet creëren"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Kon groep niet creëren"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Kon sjabloon niet creëren: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "Kon ticket niet creëren. Rij niet ingesteld"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "Kon gebruiker niet creëren"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "Kon toeschouwer niet creëren voor verzoeker"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Kon geen ticket vinden met id %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Kon groep %1 niet vinden. "
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Kon deze gebruiker niet vinden of creëren"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Kon dat hoofd niet vinden"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Kon gebruiker %1 niet vinden."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Kon groep niet laden"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Kon dat hoofd geen %1 maken voor deze rij"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Kon dat hoofd geen %1 maken voor dit ticket"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Kon dat hoofd niet verwijderen als %1 voor deze rij"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Kon dat hoofd niet verwijderen als %1 voor dit ticket"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Kon lid niet toevoegen aan groep"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Kon geen transactie creëren: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Kon niet bepalen welke actie te ondernemen aan de hand van gpg's antwoord\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Kon groep niet vinden\\n"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr "Kon rij niet vinden"
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Kon dat hoofd niet vinden"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "Kon die waarde niet vinden"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "Kon die toeschouwer niet vinden"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Kon gebruiker niet vinden\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Kon %1 niet laden uit de gebruikersdatabase.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "Kon KeywordSelects niet laden."
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "Kon RT configuratie bestand niet laden '%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "Kon Scrips niet laden"
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Kon groep %1 niet laden"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Kon link niet laden"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Kon rij niet laden"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Kon rij %1 niet laden "
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Kon scrip niet laden"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Kon sjabloon niet laden"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Kon die gebruiker (%1) niet laden"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Kon ticket '%1' niet laden"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "Land"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Creëer"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "Creëer Tickets"
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Creëer een SpecifiekVeld"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Creëer een niuew Specifiek Veld"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr "Creëer een nieuw globaal Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Creëer een nieuwe groep"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Creëer een nieuwe persoonlijke groep"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Creëer een nieuwe rij"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Creëer een nieuw scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Creëer een nieuw template"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Creëer een nieuw ticket"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Creëer een nieuwe gebruiker"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Creëer een rij"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Creëer een rij genaamd"
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Creëer een verzoek"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Creëer een scrip voor rij %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Creëer een sjabloon"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "Creatie mislukt: %1 / %2 / %3 "
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr ""
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr "Creëer nieuwe tickets gebaseerd op het sjabloon van dit scrip"
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "Creëer ticket"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr "Creëer tickets in deze rij"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr "Creëer, verwijder en wijzig specifieke velden"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr "Creëer, verwijder en wijzig rijen"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Creëer, verwijder en wijzig de leden van persoonlijke groepen"
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr "Creëer, verwijder en wijzig gebruikers"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr "CreëerTicket"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Gecreëerd"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "SpecifiekVeld %1 gecreëerd"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Sjabloon %1 Gecreëerd"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Huidige Relaties"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Huidige Scrips"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Huidige leden"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Huidige rechten"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr ""
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Huidige toeschouwers"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:35
+msgid "Custom Fields"
+msgstr "Specifieke Velden"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Specifieke actie opruim code"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Specifieke actie voorbereidings code"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Specifieke voorwaarde"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Specifiek veld %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Specifiek veld %1 heeft een waarde."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Specifiek veld %1 heeft geen waarde."
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Specifiek veld %1 niet gevonden"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Specifiek veld niet gevonden"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "Specifiek veld waarde %1 kon niet gevonden worden voor specifiek veld %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Specifiek veld waarde veranderd van %1 naar %2"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "Specifiek veld waarde kon niet verwijderd worden"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "Specifiek veld waarde kon niet gevonden worden"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Specifiek veld waarde verwijderd"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "Data fout"
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Data"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "dec."
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "december"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "Standaard Auto-antwoord Sjabloon"
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr ""
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr "Standaard admin commentaar sjabloon"
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr "Standaard admin correspondentie sjabloon"
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr "Standaard correspondentie sjabloon"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Standaard transactie sjabloon"
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Standaard: %1/%2 verandered van %3 naar %4"
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Delegeer rechten"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Delegeer specifieke rechten die aan u verleend zijn."
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr "DelegeerRechten"
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr "Verwijder tickets"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr "VerwijderTicket"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Het verwijderen van dit object zou de referentiële integriteit kunnen ondermijnen"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Het verwijderen van dit object zou de referentiële integriteit ondermijnen"
+
+#: lib/RT/User_Overlay.pm:430
+msgid "Deleting this object would violate referential integrity"
+msgstr "Het verwijderen van dit object zou de referentiële integriteit ondermijnen"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity."
+msgstr "Het verwijderen van dit object zou de referentiële integriteit ondermijnen"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity. That's bad."
+msgstr ""
+
+#: html/Approvals/Elements/Approve:46
+msgid "Deny"
+msgstr "Wijs af"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "Afhankelijkheid van"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Afhankelijkheden: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Is afhankelijk van"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "Aflopend"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Omschrijf onderstaande kwestie"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Omschrijving"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Details"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Toon"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr "Toon Toegangs Controle Lijst"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr "Toon Scrip sjablonen voor deze rij"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr "Toon Scrips voor deze rij"
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Toon modus"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Toon ticket #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr "Doe iets en alles"
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Ververs deze pagina niet"
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Download"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Verwacht"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "Verwachte datum '%1' kon niet ontleed worden"
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "FOUT: Kon ticket '%1' niet laden: %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Wijzig"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr ""
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Wijzig Specifieke Velden voor %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Wijzig Relaties"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr ""
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Wijzig systeem sjablonen"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Wijzig sjablonen voor %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Bezig met wijzigen van de configuratie voor rij %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Bezit met het wijzigen van de configuratie voor gebruiker %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Bezit met het wijzigen van SpecifiekVeld %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Bezit met het wijzigen van lidmaatschap voor groep %1"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Bezit met het wijzigen van lidmaatschap voor persoonlijke groep %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Bezit met het wijzigen van sjabloon %1"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "Of basis of doel moeten gespecificeerd zijn"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "E-mail"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "E-mailadres in gebruik"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "E-mailAdres"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "E-mailCodering"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr ""
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Actief (Het uitvinken van dit hokje zal deze rij deactiveren)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr ""
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Actieve Rijen"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Actieve status %1"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Vul tickets of URIs in om deze tickets aan te koppelen. Scheidt meerdere elementen met spaties."
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Fout"
+
+#: NOT FOUND IN SOURCE
+msgid "Error adding watcher"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Fout in paramaters naar Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Fout in paramaters naar Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Fout in paramaters naar Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Fout in paramaters naar Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Iedereen"
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Voorbeeld:"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "ExternAuteurId"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "ExternContactInfoId"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Extra informatie"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Kon de gebruikers pseudogroep 'Privileged' niet vinden."
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Kon de gebruikers pseudogroep 'Unprivileged' niet vinden."
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Kon module %1 niet laden. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "feb."
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr ""
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Uiteindelijke Prioriteit"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr "UiteindelijkePrioriteit"
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr ""
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Zoek nieuwe/open tickets"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Zoek mensen wier"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr "Beëindig Goedkeuring"
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Eerste"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Eerste pagina"
+
+#: docs/design_docs/string-extraction-guide.txt:33
+msgid "Foo Bar Baz"
+msgstr "Aap Noot Mies"
+
+#: docs/design_docs/string-extraction-guide.txt:24
+msgid "Foo!"
+msgstr "Aap!"
+
+#: html/Search/Bulk.html:87
+msgid "Force change"
+msgstr ""
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr "Gevonden Object"
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "VrijevormContactInfo"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr "VrijevormMeerdere"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr ""
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Vr."
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Volledige Kop"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Bezig met het ophalen van de huidige gebruiker middels een pgp handtekening"
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "Aan %1 gegeven"
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Globaal"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr ""
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Globaal sjabloon: %1"
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Ga!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Goede pgp handtekening van %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Ga naar pagina"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Ga naar ticket"
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr ""
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "Groep"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Groep %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Groeps rechten"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "Groep heeft al een lid"
+
+#: 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"
+msgstr "Groep kon niet gecreërd worden: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Groep gecreërd"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr "Groep heeft geen lid onder die naam"
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Groep niet gevonden"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Groep niet gevonden.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Groep niet gespecificeerd.\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Groepen"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Groepen kunnen geen leden zijn van hun leden"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Hallo!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Hallo, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Geschiedenis"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "ThuisNummer"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Homepage"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr ""
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Id"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identiteit"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Als een goedkeuring afgewezen is, wijs het origineel af en verwijder hangende goedkeuringen"
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Als dit gereedschap setgid zou zijn, zou een kwaadwillende lokale gebruiker dit gereedschap kunnen gebruiken om administratieve toegang te verkrijgen tot RT"
+
+#: 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 "Als u een van de bovenstaande elemented ververst heeft, zorg dan dat u"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr "Illegale waarde voor %1"
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr "Niet-wijzigbaar veld"
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr ""
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Neem inactieve rijen op in de weergave"
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Neem inactieve gebruiker op in de zoek opdracht"
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Initiële Prioriteit"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr "InitiëlePrioriteit"
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Invoer fout"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr "Interne Fout"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Interne Fout: %1"
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Ongeldig Groep Type"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "Ongeldig Type"
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr "Ongeldige data"
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Ongeldige eigenaar. Val terug op 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Ongeldige rij"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Ongeldige recht"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Ongeldige waarde voor %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Ongeldige waarde voor specifiek veld"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Ongeldige waarde voor status"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Het is ontzettend belangrijk dat onbevoorrechtigde gebruikers geen toestemming hebben om dit gereedschap te gebruiken."
+
+#: bin/rt-crontool:192
+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 "We stellen voor dat u een onbevoorrechtigde unix gebruiker aanmaakt met het juiste groep lidmaatschap en RT toegang om dit gereedschap te gebruiken."
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Het accepteerd meerdere argumenten:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Zaken die wachten op mijn goedkeuring"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "jan."
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "januari"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr "Sluit u aan of verlaat deze groep"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "jul."
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Jumbo"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "jun."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Sleutelwoord"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Taal"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Laatste"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Laatste Contact"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Laatst Gecontacteerd"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr ""
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Laatst Ververst"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Over"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Geef deze gebruiker toegang tot RT"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Geef deze gebruiker rechten"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Eigenaar wordt gelimieteerd tot %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Rij wordt gelimiteerd tot %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "Koppeling bestaat al"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "Koppeling kon niet gecreëerd worden"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Koppeling gecreëerd (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Koppelink verwijderd (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Koppeling niet gevonden"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Koppel ticket #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Koppelingen"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Locatie"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Log folder %1 niet gevonden of niet toegankelijk.\\n RT kan niet starten."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Aangemeld als %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Aanmelden"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Afmelden"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Maak Eigenaar"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Maak Status"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Maak verwachtingsdatum"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Make oplossingsdatum"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Maak startdatum"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Maak datum gestart"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Maak datum gemeld"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Maak prioriteit"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Maak rij"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Maak onderwerp"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Beheer groepen en groeplidmaatschap"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Beheer eigenschappen en configuraties welke betrekking hebben op alle rijen"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Beheer rijen en rij-specifieke eigenschappen"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Beheer gebruikers en wachtwoorden"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "maa."
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "maart"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "mei"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "mei."
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Lid toegevoegd"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Lid verwijderd"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Lid niet verwijderd"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Lid van"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "LidVan"
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Leden"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "Samenvoeging Succesvol"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Samenvoeging mislukt. Kon EffectiefId niet instellen"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Voeg samen in"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Bericht"
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr "Mist primaire sleutel?: %1"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Mobiel"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "MobieleTelefoon"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "Wijzig Toegangs Controle Lijst"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Wijzig Specifiek Veld %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+msgstr "Wijzit Scrip sjabloon voor deze rij"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "Modify Scrips for this queue"
+msgstr "Wijzig Scrips voor deze rij"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify System ACLS"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr "Wijzig Sjabloon %1"
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Wijzig een scrip voor deze rij %1"
+
+#: html/Admin/Global/Scrip.html:48
+msgid "Modify a scrip which applies to all queues"
+msgstr "Wijzig een scrip welke betrekking heeft op alle rijen"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "Wijzig data voor # %1"
+
+#: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Wijzig data voor #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Wijzig data voor ticket # %1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Wijzig globale groepsrechten"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Wijzig globale groepsrechten"
+
+#: 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 ""
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Wijzig globale gebruikersrechten"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr "Wijzig groepsmetadata of verwijder groep"
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Wijzig groepsrechten voor groep %1"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Wijzig groepsrechten voor rij %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr "Wijzig lidmaatschap rooster voor dze groep"
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr "Wijzig uw eigen RT "
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Wijzig mensen gekoppeld aan rij %1"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Wijzig mensen gekoppeld aan ticket #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Wijzig scrips voor rij %1"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Wijzig scrips welke betrekking hebben op alle rijen"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Wijzig sjabloon %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Wijzig de groep %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr "Wijzig de toeschouwers van de rij"
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Wijzig de gebruiker %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Wijzig ticket # %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Wijzig ticket #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "Wijzig tickets"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Wijzig gebruikersrechten voor groep %1"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Wijzig gebruikersrechten voor rij %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Wijzig toeschouwers voor rij '%1'"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr "WijzigACL"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr "WijzigEigenLidmaatschap"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr "WijzigRijToeschouwers"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr "WijzigScrips"
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr "WijzigZelf"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr "WijzigSjabloon"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr "WijzigTicket"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Ma."
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Meer over %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Meerdere"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "Specificeren van 'Naam' attribuut verplicht"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Mijn Goedkeuringen"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+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"
+msgstr "Naam"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Naam in gebruik"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "Goedkeuring benodigd van de systeem beheerder"
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr "Nooit"
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Nieuw"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Nieuw Wachtwoord"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Nieuwe Hangende Goedkeuring"
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Nieuwe Relaties"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+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 ""
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr ""
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Nieuw wachtwoord"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Bericht voor nieuw wachtwoord verzonden"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Nieuw verzoek"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Nieuwe rechten"
+
+#: 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 ""
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Nieuwe zoekopdracht"
+
+#: 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 ""
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "Nieuw ticket bestaat niet"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr ""
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Nieuwe gebruiker genaamd"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Nieuwe toeschouwers"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Nieuwe venster instelling"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Volgende"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Volgende pagina"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Bijnaam"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Bijnaam"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Geen SpecifiekVeld"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Geen Groep gedefinieerd"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Geen Rij gedefinieerd"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Geen RT gebruiker gevonden. Raadpleeg uw RT beheerder.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Geen Sjabloon"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Geen ticket gespecificeerd. Ticket afgebroken "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Geen ticket gespecificeerd. Ticket wijzigingen afgebroken\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr "Geen actie"
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr "Geen kolom gespecificeerd"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Geen commando gevonden\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Geen commentaar ingevuld over deze gebruiker"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Geen correspondentie aangehecht"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Geen omschrijving voor %1"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "Geen groep gespecificeerd"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "Geen wachtwoord ingesteld"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "Geen rechten om rijen te creëren"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "Geen rechten om tickets te creëren in de rij '%1'"
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "Geen rechten om gebruikers te creëren"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "Geen rechten om dat ticket te tonen"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "Geen rechten om verversing ticket te bekijken"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Geen hoofd gespecificeerd"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Geen hoofden geselecteerd"
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Geen rijen gevonden die aan de zoekcriteria voldoen"
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Geen rechten toegekend"
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Geen zoek opdracht om uit te voeren."
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Geen ticket id gespecificeerd"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "Geen transactie type gespecificeerd"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "Geen gebruiker of email-adres gespecificeerd"
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Geen gebruikers gevonden die aan de zoekcriteria voldoen"
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Geen geldige RT gebruiker gevonden. RT cvs behandelaar losgemaakt. Neemt u alstublieft contact op met uw RT beheerder.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr "Geen waarde gestuurd naar _Set!\\n"
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr "Nietbestaand veld?"
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr ""
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "Niet aangemeld."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Niet gezet"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Nog niet geïmplementeerd."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "Nog niet geïmplementeerd...."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr "Notities"
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "Bericht kon niet verstuurd worden"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr "Bericht AdminCcs"
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr "Bericht AdminCcs als Commentaar"
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr "Bericht Andere Ontvangers"
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr "Bericht Andere Ontvangers als Commentaar"
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr "Bericht Eigenaar"
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr "Bericht Eigenaar als Commentaar"
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Bericht Eigenaars en AdminCcs van nieuwe zaken welke hangende hun goedkeuring zijn"
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr "Bericht Aanvragers"
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr "Bericht Aanvragers en Ccs"
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Bericht Aanvragers en Ccs als Commentaar"
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Bericht Aanvragers, Ccs en AdminCcs"
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Bericht Aanvragers, Ccs en AdminCcs als Commentaar"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "nov."
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr ""
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "Object kon niet gecreëerd worden"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Object gecreëerd"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "oct."
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr ""
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "Bij"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Bij Commentaar"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "Bij Overeenkomst"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Bij Creatie"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Bij Eigenaarwijziging"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Bij Rijwijziging"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Bij Oplossing"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Bij Statuswijziging"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Bij Transactie"
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Toon alleen goedkeuringen voor verzoeken gecreëerd na %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Toon alleen goedkeuringen voor verzoeken gecreëerd voor %1"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Open"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Open"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Open verzoeken"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Open tickets (van lijst) in een nieuw venster"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Open tickets (van lijst) in een ander venster"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Ordening en sortering"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organisatie"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Voortgekomen uit ticket: #%1"
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Naar mate de tijd vordert, verschuift de prioriteit richting"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr "Eigen tickets"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr "EigenTicket"
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Eigenaar"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr "Eigenaar veranderd van %1 naar %2"
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Eigenaar gedwongen veranderd van %1 naar %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "Eigenaar is"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Pieper"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "Pieper"
+
+#: NOT FOUND IN SOURCE
+msgid "Parent"
+msgstr ""
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Ouders"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Wachtwoord Herinerring"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Wachtwoord te kort"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Wachtwoord: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Mensen"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr "Verricht een gebruiker gedefiniëerde actie"
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "Toestemming Geweigerd"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr ""
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Persoonlijke groepen"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Persoonlijke groepen:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Telefoonnummers"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "Plaatshouder"
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr ""
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Voorkeuren"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Voorkeuren"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Bereid Plaatshouder Voor"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Vorige"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Vorige pagina"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "Hoofd %1 niet gevonden."
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "Prioriteit begint bij"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Gerechtigd"
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Gerechtigde status: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Gerechtigde gebruikers"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Pseudogroep voor intern gebruik"
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Rij"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Rij %1 niet gevonden"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Rij '%1' niet gevonden\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Rij Naam"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Rij Scrips"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "Rij bestaat al"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "Rij kon niet aangemaakt worden"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "Rij kon niet geladen worden."
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Rij aangemaakt"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr "Rij is niet gespecificeerd"
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Rij niet gevonden"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Rijen"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 voor %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 van <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr ""
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "RT Beheer"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "RT Authenticatie fout"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RT Doorgestuurd: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "RT Configuratie fout"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "RT Kritieke fout: Bericht niet bewaard!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "RT Fout"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT Ontving mail (%1) van zichzelf."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr ""
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT Zelfbediening / Afgesloten Tickets"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT kon u niet authenticeren"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT kon de verzoeker niet vinden in zijn interne database"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT kon de rij %1 niet vinden"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT kon deze PGP signatuur niet valideren. \\n"
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT voor %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "RT voor %1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT heeft uw commando's verwerkt"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  Het is gedistribueerd onder <a href=\"http://www.gnu.org/copyleft/gpl.html\">Versie 2 van de GNU General Public License.</a>""
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT denkt dat dit bericht onbestelbaar zou kunnen zijn"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT zal dit bericht verwerken als of het ongesigneerd is.\\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 commando modus vereist PGP authenticatie.  Of u heeft uw bericht niet gesigneerd, of uw signatuur kon niet geverifieerd worden."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Echte Naam"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "EchteNaam"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "Naar gerefeerd door"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Refereert aan"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Verfijn"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Verfijn Zoekopdracht"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Ververs deze pagina elke %1 minuten."
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Relaties"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Verwijder AdminCc"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Verwijder Cc"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Verwijder Verzoeker"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Antwoord"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr "Antwoord op tickets"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr "AntwoordOpTicket"
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Verzoeker"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Verzoeker email adres"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "Verzoeker(s)"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr ""
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Verzoekers"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Verzoek is terug verwacht"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Herstel"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Woonplaats"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Los op"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Los ticket #%1 (%2) op"
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Opgelost"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Antwoord aan verzoekers"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Resultaten"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Resultaten per pagina"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Type wachtwoord opnieuw"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Recht %1 niet gevonden voor %2  %3 in bereik %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Recht Gedelegeerd"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Recht Toegekend"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Recht Geladen"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Recht kon niet afgenomen worden"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Recht niet gevonden"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Recht niet geladen"
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Rechten"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Rollen"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "RootGoedkeuring"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Za."
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Bewaarwijzigingen"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Bewaarwijzigingen"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Scrip aangemaakt"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Script verwijderd"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Scrips"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Scrips voor %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Scrips welke betrekking hebben op alle rijen"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Zoek"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Zoek Criteria"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr ""
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Veiligheid"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr "ZieRij"
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Selecteer een groep"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Selecteer een rij"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Selecteer een gebruiker"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+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 ""
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr "SelecteerMeerdere"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr "SelecteerEnkele"
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Zelfbediening"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr "Stuurt mail naar alle toeschouwers"
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Stuurt mail naar alle toeschouwers als een \"commentaar\""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr "Stuurt mail naar alle verzoekers en Ccs"
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Stuurt mail naar alle verzoekers en Ccs als een \"commentaar\""
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr "Stuurt een bericht aan de verzoekers"
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Stuurt mail aan expliciet genoemde Ccs en Bccs"
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr "Stuurt mail aan de administratieve Ccs"
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Stuurt mail aan de administratieve Ccs als een \"commentaar\""
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr "Stuurt mail aan de eigenaar"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Sep."
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Toon Resultaten"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr "Toon goedgekeurde verzoeken"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Toon beginselen"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Toon afgewezen verzoeken"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Toon details"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Toon hangende verzoeken"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "Toon verzoeken die wachten op andere goedkeuringen"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr "Toon ticket privé commentaar"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr "Toon ticket samenvattingen"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr "ToonACL"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr "ToonScrips"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr "ToonSjabloon"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr "ToonTicket"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr "ToonTicketCommentaar"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "Schrijf in als een ticket Verzoeker of ticket of rij Cc"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "Schrijf in als een ticket of rij AdminCc"
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Signatuur"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Enkel"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Sorteer sleutel"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Sorteer resultaten op"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "SorteerVolgorde"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Blijft Steken"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Start pagina"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Gestart"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "Startum '%1' kon niet ontleed worden"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Begint"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Begint op"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "Begindatum '%1' kon niet ontleed worden"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Staat"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Status"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Status veranderd van %1 naar %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "StatusVerandering"
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Steel"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Gestolen van %1"
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Onderwerp"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Onderwerp veranderd naar %1"
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Registreer"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "Registreer Workflow"
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr "Gelukt"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Zo."
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr "SuperGebruiker"
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "Systeem"
+
+#: 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 "Systeem Fout"
+
+#: 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 "Systeem fout. Recht niet gedelegeerd."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Systeem fout. Recht niet toegekend."
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "Systeem fout. Niet mogelijk om rechten toe te kennen"
+
+#: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36
+msgid "System groups"
+msgstr "Systeem groepen"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "SysteemRolgroep voor intern gebruik"
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Neem"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Genomen"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Sjabloon"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr ""
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Sjabloon niet gevonden"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Sjabloon niet gevonden\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Sjabloon ontleed"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Sjablonen"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Sjablonen voor %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr "Dat is al de huidige waarde"
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Dat is geen waarde voor dit specifieke veld"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Dat is de zelfde waarde"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Dat hoofd is reeds een %1 voor deze rij"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Dat hoofd is reeds een %1 voor dit ticket"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Dat hoofd is geen %1 voor deze rij"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Dat hoofd is geen %1 voor dit ticket"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Die rij bestaat niet"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Dat ticket heeft onopgeloste afhankelijkheden"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Die gebruiker heeft dat recht reeds"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Die gebruiker is al eigenaar van dat ticket"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Die gebruiker bestaat niet"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Die gebruiker is al gerechtigd"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Die gebruiker is reeds ontrechtigd"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Die gebruiker is nu gerechtigd"
+
+#: lib/RT/User_Overlay.pm:344
+msgid "That user is now unprivileged"
+msgstr "Die gebruiker is nu ontrechtigd"
+
+#: 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 "Die gebruiker mag geen eigenaar zijn van tickets in die rij"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Dat is niet een numeriek ID"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "De Beginselen"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr "De CC van een ticket"
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr "De administratieve CC van een ticket"
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "Het commentaar is bewaard"
+
+#: bin/rt-crontool:198
+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 "Het volgende commando zal alle actieve tickets in de rij 'general' vinden en hun prioriteit op 99 zetten als ze meer dan 4 uur niet aangeraakt zijn:"
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "De volgende commando's zijn niet verwerkt:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr "De waarde is gezet."
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr "De eigenaar van een ticket"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr "De verzoeker van een ticket"
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Dit commentaar is gewoonlijk niet zichtbaar voor de gebruiker"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Dit ticket %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Dit gereedschap stelt de gebruiker in staat arbitraire perl modules te gebruiken vanuit RT"
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Het lijkt erop alsof deze transactie geen inhoud heeft"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "De 25 hoogste prioriteit tickets van deze gebruiker"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Do."
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr ""
+
+#: 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"
+msgstr "Ticket #%1 Jumbo actualisering: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Ticket #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Ticket %1 aangemaakt in rij '%2'"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Toclet %1 geladen\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Ticket %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Ticket Historie # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Ticket Id"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr "Ticket Opgelost"
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Ticket aanhechting"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Ticket inhoud"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Ticket inhoud type"
+
+#: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr "Ticket kong niet aangemaakt worden vanwege een interne fout"
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Ticket aangemaakt"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Ticket aanmaken gefaald"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Ticket verwijderd"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+msgid "Ticket id not found"
+msgstr "Ticket id niet gevonden"
+
+#: 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 "Ticket niet gevonden"
+
+#: etc/initialdata:289
+msgid "Ticket status changed"
+msgstr "Ticket status gewijzigd"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Ticket toeschouwers"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "Tickets %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Tickets %1 door %2"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Tickets van %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "Tickets welke afhankelijk zijn van deze goedkeuring"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Tijd Over"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Tijd Gewerkt"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Tijd over"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Tijd om te tonen"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Tijd gewerkt"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "TijdOver"
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr "TijdGewerkt"
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Om een diff van deze uitvoering te genereren:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "Om een diff van deze uitvoering te genereren:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Verteld"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transactie"
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Transactie %1 gezuiverd"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transactie Gecreëerd"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Transactie->Creëer kon niet, aangezien u geen ticket id gespecificeerd heeft"
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Transacties zijn onwijzigbaar"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Tracht een recht te verwijderen: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Di."
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Type"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Niet geïmplementeerd"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Unix aanmelden"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "UnixGebruikersnaam"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Onbekende InhoudCodering %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Ongelimiteerd"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "Ongerechtigd"
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "Vrij"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Ververs"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Ververs ID"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Ververs Type"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Ververs al deze tickets in eens"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Ververs email"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Ververs naam"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Verversing niet opgeslagen."
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Ververs geselecteerde tickets"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Ververs signatuur"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Ververs ticket"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Ververs ticket # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Ververs ticket #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Ververs ticket #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "Verversingstype was noch correspondentie, noch commentaar"
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Ververst"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Gebruiker %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Gebruiker %1 Wachtwoord: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Gebruiker '%1' niet gevonden"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Gebruiker '%1' niet gevonden\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr "Gebruiker Gedifiniëerd"
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "GebruikersID"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Gebruiker Id"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Gebruikersrechten"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Gebruiker kon niet aangemaakt worden: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Gebruiker aangemaakt"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Door gebruiker gedefiniëerde groepen"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Gebruiker verwittigd"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Gebruikers aanzicht"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Gebruikers"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Gebruikers die voldoen aan de zoek criteria"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "WaardeVanRij"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Waarden"
+
+#: NOT FOUND IN SOURCE
+msgid "VrijevormEnkele"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr "Schouw toe"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr "SchouwToeAlsAdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "Toeschouwer geladen"
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Toeschouwers"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "WebCodering"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Wo."
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Wanneer een ticket goedgekeurd is door alle goedkeurders, voeg correspondentie toe aan het orginele ticket"
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Wanneer een ticket goedgekeurd is door een goedkeurder, voeg correspondentie toe aan het orginele ticket"
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Wanneer een ticket is aangemaakt"
+
+#: 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 "Wanneer een goedkeuringsticket is aangemaakts, verwittig de Eigenaar en de AdminCc van het onderwerp dat op hun goedkeuring wacht"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Wanneer iets gebeurt"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Wanneer een ticket is opgelost"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Wanneer de eigenaar van een ticket verandert"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Wanneer de rij van een ticket verandert"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Wanneer de status van een ticket verandert"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Wanneer een door de gebruiker gedifiniëerde voorwaarde gebeurt"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Wanneer commentaar binnenkomt"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Wanneer correspondentie binnenkomt"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Werk"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "WerkTelefoon"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Gewerkt"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "U bent al eigenaar van dit ticket"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "U bent geen geauthorizeerde gebruiker"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "U kunt alleen tickets opnieuw toe bedelen die van u zijn, of van niemand"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "U heeft geen toestemming om dat ticket te bekijken"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "U vond %1 tickets in rij %2"
+
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "U bent afgemeld bij RT"
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "U heeft geen toestemming om tickets aan te maken in die rij."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "U mag geen verzoeken aanmaken in die rij"
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "U mag zich weer aanmelden"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Uw %1 verzoeken"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "Uw RT beheerder heeft de mail-aliasses welke RT aanroepen verkeerd geconfigureerd"
+
+#: etc/initialdata:429 etc/upgrade/2.1.71:146
+msgid "Your request has been approved by %1. Other approvals may still be pending."
+msgstr "Uw verzoek is goedgekeurd door %1. Er zijn wellicht nog andere hangende goedkeuringen."
+
+#: etc/initialdata:463 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Uw verzoek is goedgekeurd."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr ""
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Uw verzoek was geweigerd."
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Uw gebruikersnaam of wachtwoord zijn onjuist"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "Postcode"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "zoals gegeven aan %1"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "bevat"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "inhoud"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "inhoud-type"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "correspondentie (waarschijnlijk) niet verstuurd"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "correspondentie verstuurd"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "dagen"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "dood"
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "verwijder"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "verwijderd"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "voldoet niet aan"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "bevat niet"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "gelijk aan"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "bestandsnaam"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "groter dan"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "groep '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "uren"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "id"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "is"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "is niet"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "minder dan"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "voldoet aan"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "minuten"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "wijzigingen\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "maanden"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "nieuw"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr ""
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "geen"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "niet gelijk aan"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "open"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "persoonlijke groep '%1' voor gebruiker '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "rij %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "geweigerd"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "opgelost"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "sec"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "bleef steken"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "systeem %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "systeem groep '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "het aanroepende component specificeerde niet waarom"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "ticket #%1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:216
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "onbeschreven groep %1"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "gebruiker %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "weken"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "met sjabloon %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "jaren"
+
diff --git a/rt/lib/RT/I18N/no.po b/rt/lib/RT/I18N/no.po
new file mode 100644 (file)
index 0000000..5b1ab05
--- /dev/null
@@ -0,0 +1,4879 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 3.0.1\n"
+"POT-Creation-Date: 2003-04-01 06:06+0200\n"
+"PO-Revision-Date: 2003-05-01 04:47+0200\n"
+"Last-Translator: Marcus Ramberg <marcus@thefeed.no>\n"
+"Language-Team: RT Norwegian <rt@thefeed.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr "#%1"
+
+#: html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:50 html/SelfService/Display.html:25 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($Ticket->id, $Ticket->Subject)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %3. %2 %7 %4:%5:%6"
+
+#: lib/RT/Ticket_Overlay.pm:3505 lib/RT/Transaction_Overlay.pm:557 lib/RT/Transaction_Overlay.pm:599
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%1 %2 lagt til"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "%1 %2 siden"
+
+#: lib/RT/Ticket_Overlay.pm:3511 lib/RT/Transaction_Overlay.pm:564
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 ble endret til %3"
+
+#: lib/RT/Ticket_Overlay.pm:3508 lib/RT/Transaction_Overlay.pm:560 lib/RT/Transaction_Overlay.pm:605
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 slettet"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 %2 of group %3"
+msgstr "%1 %2 av gruppen %3"
+
+#: 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"
+msgstr "%1 %2 med mal %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 denne biletten\\n""
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "%1 - %2 vist"
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - Et parameter til %2"
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - Viser statusoppdateringer til STDOUT"
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Oppgi kommandomodulen du ønsker Â bruke"
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Oppgiv betingelsesmodulen du ønsker Â bruke"
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Oppgi søkemodulen du ønsker Â bruke"
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "%1 KommandoScript lastet"
+
+#: lib/RT/Ticket_Overlay.pm:3538
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 ble lagt til som verdi for %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1 alias trenger en ReferanseId å jobbe mot"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "%1 alias trenger en saksnummer å jobbe mot "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1 alias trenger et saksnummer å jobbe mot (fra %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr "%1 ser ut til å være et lokalt objekt, men kan ikke finnes i databasen"
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:481
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 av %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
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 ble endret fra %2 til %3"
+
+#: lib/RT/Interface/Web.pm:891
+msgid "%1 could not be set to %2."
+msgstr "%1 kunne ikke settes til %2."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 kunne ikke starte en transaksjon (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2817
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 kunne ikke sette status til løst. RT-basen kan være inkonsistent."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "Mine %1 høyst prioriterte saker..."
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "Mine %1 høyst prioriterte forespørsler..."
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 er et verktøy for å behandle saker fra eksterne verktøy, slik som cron."
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 er ikke lenger en %2 for denne køen."
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 er ikke lenger en %2 for denne saken."
+
+#: lib/RT/Ticket_Overlay.pm:3594
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 er ikke lenger en verdi for fleksifeltet %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 er ikke et gyldig saksnummer."
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 vises ikke"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1 rettigheter"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 var velykket\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "%1 er ukjent type for $saksnummer"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "%1 er ukjent type for %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 was created without a CurrentUser\\n"
+msgstr "%1 ble opprettet uten en aktiv bruker\\n"
+
+#: lib/RT/Action/ResolveMembers.pm:42
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 vil løse alle medlemmer av en løst gruppesak."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr "%1 vil stoppe en [lokal] BASE hvis den er avhengig av/medlem av en tilkoblet sak."
+
+#: lib/RT/Transaction_Overlay.pm:433
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: ingen vedlegg oppgitt"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr "%1b"
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k"
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' er en ugyldig statusverdi"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "'%1' er ikke en kjent handling"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete group member)"
+msgstr "(Merk for å slette gruppemedlem)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Merk for å slette Scrip)"
+
+#: html/Admin/Elements/EditCustomFieldValues:25 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 "(Merk for å slette)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check boxes to delete)"
+msgstr "(Merk boksene for å slette)"
+
+#: html/Ticket/Create.html:178
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(Skriv inn referansenummer eller URler, separert med mellomrom)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(Standard er %1);H
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(Ingen Verdi)"
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr "(Ingen fleksifelt)"
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Ingen medlemmer)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Ingen scrips)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr "(Ingen maler)"
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Sender en kopi av denne oppdateringen til en kommaseparert liste med epostaddresser. Endrer <b>ikke</b> hvem som vil motta fremtidige oppdatreinger.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Sender en kopi av denne oppdateringen til en kommaseparert liste med epostaddresser. Endrer <b>ikke</b> hvem som vil motta fremtidige oppdateringer.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Sender en kopi av denne oppdateringen til en kommaseparert liste av administrative epostaddresser. Disse vil <b>vil</b> motta fremtidige oppdateringer.)"
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Sender en kopi av denne oppdateringen til en komma-separert liste av epostaddresser. Endrer <b>ikke</b> hvem som vil motta fremtidige oppdateringer.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Sender en kopi av denne oppdateringen til en kommaseparert liste med epost-addresser. Endrer <b->ikke</b> hvem som vi motta fremtige utfordrer dere nå."
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Sender en kopi av dette oppdateringen til en kommaseparert liste med epostaddresser. Disse <b>vill</b> motta fremtidige oppdateringer.)"
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(tom)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr "(navn ikke oppgitt)"
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(ingen overskrift)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:534
+msgid "(no value)"
+msgstr "(ingen verdi)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(bare en sak)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr "(Venter på godkjenning)"
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr "(venter på andre saker)"
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr "(kundens gruppe)"
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(nødvendig)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr "(ingen tittel)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr "Mine 25 høyst prioriterte saker..."
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr "Mine 25 høyst priorterte forespørsler..."
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket-:Status%>"
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Ny sak i\">&nbsp;%1"
+
+#: NOT FOUND IN SOURCE
+msgid "??????"
+msgstr "??????"
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "En tom mal"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE slettet"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE lastet"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr "ACE kunne ikke slettes"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr "fant ikke ACE"
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE ikke funnet"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACEr kan bare opprettes og slettes."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Avbryter for Â ung uønsket saksendring"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr "Om meg"
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Aksesskontroll"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Handling"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Handling %1 finnes ikke"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Handling skrevet."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Handling forberedt"
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Legg til AdminCc"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Legg til Cc"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr "Legg til flere filer"
+
+#: NOT FOUND IN SOURCE
+msgid "Add Next State"
+msgstr "Legg til neste status"
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Legg til kunde"
+
+#: html/Admin/Elements/AddCustomFieldValue:26
+msgid "Add Value"
+msgstr "Legg til verdi"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a Scrip to this queue"
+msgstr "Legg til Scrip i denne køen"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a Scrip which will apply to all queues"
+msgstr "Legg til et Scrip som gjelder for alle køer"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a keyword selection to this queue"
+msgstr "Legg til et nøkkelordvalg p denne køen"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a new a global scrip"
+msgstr "Legg til et globalt Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Legg til et Scrip til denne køen"
+
+#: html/Admin/Global/Scrip.html:55
+msgid "Add a scrip which will apply to all queues"
+msgstr "Legg til et Scrip som vil gjelde for alle køer"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Legg til kommentarer eller svar til denne saken"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Legg til medlemmer"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Legg til overvåkere"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr "AddNextState"
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "La til primær som en %1 for denne køen"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "La til primær som en %1 for denne saken"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Adresse1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Adresse2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Admin Cc"
+
+#: etc/initialdata:280
+msgid "Admin Comment"
+msgstr "Admin Kommentar"
+
+#: etc/initialdata:259
+msgid "Admin Correspondence"
+msgstr "Admin-korrespondanse"
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Adminkøer"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Adminbrukere"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Admin/Global konfigurasjon"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Admin/Grupper"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Admin/Køer/Grunnleggende"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminAllPersonalGroups"
+msgstr "AdminAllePersonalGrupper"
+
+#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:39 html/Ticket/Update.html:50 lib/RT/ACE_Overlay.pm:89
+msgid "AdminCc"
+msgstr "AdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "AdminKommentar"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "AdminKorrespondanse"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr "AdminFleksifelt"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr "AdminGruppe"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr "AdminGruppeMedlemskap"
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr "AdminEgnePersonligeGrupper"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr "AdminKø"
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr "AdminBrukere"
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Administrativ Cc"
+
+#: NOT FOUND IN SOURCE
+msgid "Admins"
+msgstr "Admin"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Avansert Søk"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Etter"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Alder"
+
+#: NOT FOUND IN SOURCE
+msgid "Alias"
+msgstr "Alias"
+
+#: NOT FOUND IN SOURCE
+msgid "Alias for"
+msgstr "Alias for"
+
+#: html/Admin/Elements/EditCustomFields:96
+msgid "All Custom Fields"
+msgstr "Alle Fleksifelt"
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Alle køer"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "Send alltid en melding til kunden uavhengig av meldingssender"
+
+#: html/Elements/Tabs:56
+msgid "Approval"
+msgstr "Godkjennelse"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Godkjennelse #%1: %2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Godkjenning # %1: Notater kunne ikke lagres pga. systemfeil"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Godkjenning #%1: Notater lagret"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr "Godkjenning - Detaljer"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr "Godkjenningsdiagram"
+
+#: html/Approvals/Elements/Approve:44
+msgid "Approve"
+msgstr "Godkjenn"
+
+#: etc/initialdata:437 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Godkjenners notater: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Apr."
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "April"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "Stigende"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:33 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Legg Ved"
+
+#: html/SelfService/Create.html:65 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Legg ved fil"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "Vedlagt fil"
+
+#: NOT FOUND IN SOURCE
+msgid "Attachment '%1' could not be loaded"
+msgstr "Vedlegg '%1' kunne ikke lastes"
+
+#: lib/RT/Transaction_Overlay.pm:441
+msgid "Attachment created"
+msgstr "Vedlegg opprettet"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Vedleggsnavn"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Vedlegg"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Aug."
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "August"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "AutSystem"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "Autosvar"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "Autosvar Til Kunde"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "AutosvarTilKunde"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Ugyldig PGP-signatur: %1\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Ugyldig vedleggsid. Kunne ikke finne vedlegg '%1'\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Ugyldig data i %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Ugyldig transaksjonsnummer for vedlegg. %1 skulle vært %2\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Detaljer"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Bcc"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Sørg for Â lagre endringene dine"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:320
+msgid "Before"
+msgstr "Før"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr "Begynn Godkjenning"
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Blank"
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "URL som kan brukes som bokmerke for dette søket"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Begrens headere"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Masseoppdatering av saker"
+
+#: lib/RT/User_Overlay.pm:1352
+msgid "Can not modify system users"
+msgstr "Kan ikke endre systembrukere"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr "Kan denne primæren se denne køen"
+
+#: lib/RT/CustomField_Overlay.pm:206
+msgid "Can't add a custom field value without a name"
+msgstr "Kan ikke legge til en verdi for et fleksifelt uten navn"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "Kan ikke koble en sak til seg selv"
+
+#: lib/RT/Ticket_Overlay.pm:2794
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Kan ikke flette inn i en flettet sak. Denne meldingen bør ikke forekomme"
+
+#: lib/RT/Ticket_Overlay.pm:2612 lib/RT/Ticket_Overlay.pm:2681
+msgid "Can't specifiy both base and target"
+msgstr "Kan ikke spesifisere både base og mål."
+
+#: html/autohandler:99
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Kunne ikke oprette bruker: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:49 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Endre passord"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "Merk for å slette"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Merk for å trekke tilbake rettighet"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:57
+msgid "Children"
+msgstr "Barn"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "By"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr "Lukket"
+
+#: html/SelfService/Closed.html:25
+msgid "Closed Tickets"
+msgstr "Lukkede Saker"
+
+#: NOT FOUND IN SOURCE
+msgid "Closed requests"
+msgstr "Lukkede forespørsler"
+
+#: html/SelfService/Elements/Tabs:45
+msgid "Closed tickets"
+msgstr "Lukkede saker"
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr "Kode"
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Kunne ikke tolke kommando!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Kommenter"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Kommentaraddresse"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Kommentaren ble ikke lagret"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr "Kommenter saker"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr "KommenterSak"
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Kommentarer"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Kommentarer (Ikke send til kunder)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Kommentarer (ikke sendt til kunder)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Kommentarer til %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Kommentarer om denne brukeren"
+
+#: lib/RT/Transaction_Overlay.pm:543
+msgid "Comments added"
+msgstr "La til kommentarer "
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "Lagring forkortet"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Kompilatorrestriksjoner"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Forutsetning"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "Forutsetning gjelder..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Forutsetning ikke funnet"
+
+#: html/Elements/Tabs:50
+msgid "Configuration"
+msgstr "Konfigurasjon"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Bekreft"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "KontaktInfoSystem"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Kontatdato '%1' kunne ikke tolkes"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Innhold"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr "Kunne ikke opprette gruppen"
+
+#: etc/initialdata:271
+msgid "Correspondence"
+msgstr "Korrespondanse"
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Korrespondanseaddresse"
+
+#: lib/RT/Transaction_Overlay.pm:539
+msgid "Correspondence added"
+msgstr "Korrespondanse lagt til"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Korrespondansen ble ikke lagret"
+
+#: lib/RT/Ticket_Overlay.pm:3525
+msgid "Could not add new custom field value for ticket. "
+msgstr "Kunne ikke legge til nye fleksifeltverdier for saken. "
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr "Kunne ikke legge til nye fleksifeltverdier for saken. %1 "
+
+#: lib/RT/Ticket_Overlay.pm:3031 lib/RT/Ticket_Overlay.pm:3039 lib/RT/Ticket_Overlay.pm:3055
+msgid "Could not change owner. "
+msgstr "Kunne ikke endre eier. "
+
+#: html/Admin/Elements/EditCustomField:85 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Kunne ikke opprette fleksifelt"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Kunne ikke opprette gruppe"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Kunne ikke opprette mal: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:334
+msgid "Could not create ticket. Queue not set"
+msgstr "Kunne ikke opprette sak. Kø ikke satt"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:422
+msgid "Could not create user"
+msgstr "Kunne ikke opprette bruker"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "Kunne ikke opprette overvåker for kunde"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Kunne ikke finne en sak med id %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Kunne ikke finne gruppen %1."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Kunne ikke finne eller lage den brukeren"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Kunne ikke finne den primæren"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Kunne ikke finne brukeren %1."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Kunne ikke hente gruppen"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Kunne ikke sette den primæren som %1 for denne køen"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Kunne ikke sette den primæren som %1 for denne saken"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Kunne ikke fjerne den primæren som %1 for denne køen"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Knne ikke fjære den primæren som %1 for denne saken"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Kunne ikke legge til medlemmmer i gruppen"
+
+#: lib/RT/Ticket_Overlay.pm:3535 lib/RT/Ticket_Overlay.pm:3591
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Kunne ikke opprette en transaksjon: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Kunne ikke tolke gpgs svar\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Kunne ikke finne gruppen\\n"
+
+#: lib/RT/Interface/Web.pm:900
+msgid "Couldn't find row"
+msgstr "Kunne ikke finne raden"
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Kunne ikke finne primæren"
+
+#: lib/RT/CustomField_Overlay.pm:240
+msgid "Couldn't find that value"
+msgstr "Kunne ikke finne verdien"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "Kunne ikke finne den overvåkern"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Kunne ikke finne bruker\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Kunne ikke laste %1 fra brukerdatabasen.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "Kunne ikke laste NøkkelordValg."
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "Kunne ikke laste RTs konfigurasjonsfil '%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "Kunne ikke laste Scripsene."
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Kunne ikke laste gruppen %1"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Kunne ikke laste linken"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Kunne ikke laste køen"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Kunne ikke laste køen %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Kunne ikke laste scripet"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Kunne ikke finne mal"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Kunne ikke laste den brukeren (%1)"
+
+#: html/SelfService/Display.html:109
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Kunne ikke laste saken '%1'"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "Land"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Opprett"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "Opprett Saker"
+
+#: html/Admin/Elements/EditCustomField:75
+msgid "Create a CustomField"
+msgstr "Oprett et fleksifelt"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "Opprett et fleksifelt for køen %1"
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr "Opprett et fleksifelt for alle køer"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Opprett et nytt fleksifelt"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr "Opprett et globalt Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "Opprett et nytt globalt scrip"
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Opprett en ny gruppe"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Opprett en ny personlig gruppe"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Opprett en ny kø"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Opprett et nytt scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Opprett en ny mal"
+
+#: html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Opprett en ny sak"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Opprett en ny bruker"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Opprett en ny kø"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Opprett en kø kalt"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a request"
+msgstr "Opprett en forespørsel"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Opprett et scrip for køen %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Opprett en mal"
+
+#: html/SelfService/Create.html:25
+msgid "Create a ticket"
+msgstr "Opprett en sak"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "Opprettelse feilet: %1 / %2 / %3"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr "Opprettelse feilet: %1/%2/%3"
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr "Opprett nye saker basert på dette scripets mal"
+
+#: html/SelfService/Create.html:78
+msgid "Create ticket"
+msgstr "Opprett sak"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr "Opprett saker i denne køen"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr "Opprett, slett og modifiser fleksifelt"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr "Opprett, slett og endre køer"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "Opprett, slett og modifiser medlemmene av en brukers personlige grupper"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Opprett, slett og modifiser medlemmene av personlige grupper"
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr "Opprett, slett og modifiser brukere"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr "OpprettSak"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Opprettet"
+
+#: html/Admin/Elements/EditCustomField:88
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "Opprettet Fleksifelt %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Opprettet malen %1"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Eksisterende Forhold"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Eksisterende Scrips"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Eksisterende medlemmer"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Eksisterende rettigheter"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr "Eksisterende søkekriterier"
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Eksisterende overvåkere"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr "Fleksifeltet #%1"
+
+#: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:36
+msgid "Custom Fields"
+msgstr "Fleksifelt"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Avsluttningskode"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Forberedelseskode"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Forutsetning"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Fleksifeltet %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Fleksifeltet %1 har en verdi."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Fleksifeltet %1 har ingen verdi."
+
+#: lib/RT/Ticket_Overlay.pm:3427
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Fleksifeltet %1 kunne ikke finnes"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr "Fleksifeltet slettet"
+
+#: lib/RT/Ticket_Overlay.pm:3577
+msgid "Custom field not found"
+msgstr "Fleksifeltet kunne ikke finnes"
+
+#: lib/RT/CustomField_Overlay.pm:350
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "Verdien %1 for fleksifeltet %2 kunne ikke finnes"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Fleksifeltets verdi endret fra %1 til %2"
+
+#: lib/RT/CustomField_Overlay.pm:250
+msgid "Custom field value could not be deleted"
+msgstr "Fleksifeltets verdi kunne ikke slettes"
+
+#: lib/RT/CustomField_Overlay.pm:356
+msgid "Custom field value could not be found"
+msgstr "Fleksifeltets verdi kunne ikke finnes"
+
+#: lib/RT/CustomField_Overlay.pm:248 lib/RT/CustomField_Overlay.pm:358
+msgid "Custom field value deleted"
+msgstr "Fleksifeltverdi slettet"
+
+#: lib/RT/Transaction_Overlay.pm:548
+msgid "CustomField"
+msgstr "FleksiFelt"
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "Datafeil"
+
+#: html/SelfService/Display.html:39 html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:55 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Datoer"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Des."
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "Desember"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "Standard Autosvarmal"
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "Standard Autosvarmal"
+
+#: etc/initialdata:281
+msgid "Default admin comment template"
+msgstr "Standard Adminkommentarmal"
+
+#: etc/initialdata:260
+msgid "Default admin correspondence template"
+msgstr "Standard Adminkorrespondensemal"
+
+#: etc/initialdata:272
+msgid "Default correspondence template"
+msgstr "Standard korrespondensemal"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Standard transaksjonsmal"
+
+#: lib/RT/Transaction_Overlay.pm:643
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Standard: %1/%2 endret seg fra %3 til %4"
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Deleger rettigheter"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Deleger spesifikke rettigheter som har blitt gitt til deg."
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr "DelegerRettigheter"
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr "Delegering"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "Slett"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr "Slett saker"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr "SlettSak"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Sletting av dette objektet kan føre til inkonsistens"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Sletting av dette objektet vil føre til inkonsistens"
+
+#: lib/RT/User_Overlay.pm:438
+msgid "Deleting this object would violate referential integrity"
+msgstr "Sletting av dette objektet ville føre til inkonsistens"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity."
+msgstr "Sletting av dette objektet ville føre til inkonsisistens."
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity. That's bad."
+msgstr "Sletting av dette objektet ville føre til inkonsistens. Det er uheldig."
+
+#: html/Approvals/Elements/Approve:45
+msgid "Deny"
+msgstr "Nekt"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:37
+msgid "Depended on by"
+msgstr "Avhengighet fra"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Avhengigheter: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Avhengig av"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr "AvhengigAv"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "Synkende"
+
+#: html/SelfService/Create.html:73 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Beskriv problemet under"
+
+#: html/Admin/Elements/AddCustomFieldValue:37 html/Admin/Elements/EditCustomField:39 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: NOT FOUND IN SOURCE
+msgid "Details"
+msgstr "Detaljer"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Vis"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr "Vis Rettigheter"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr "Vis Scrip-maler for denne køen"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr "Vis Scrip-maler for denne køen"
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Visningsmodus"
+
+#: NOT FOUND IN SOURCE
+msgid "Display ticket #%1"
+msgstr "Vis saken #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr "Gjør hva som helst"
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Ikke last denne siden p nytt"
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr "Ikke vis søkeresultat"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Last ned"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Innen"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "Innendato '%1' kunne ikke tolkes""
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "FEIL: Kunne ikke laste sak '%1': %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Rediger"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr "Rediger Forhold"
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Rediger fleksifelt for %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Rediger Forhold"
+
+#: html/Admin/Queues/Templates.html:42
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "Rediger Maler for køen %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr "Rediger nøkkelord"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "Rediger scrips"
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Rediger systemmal"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Rediger maler for %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:118
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Rediger Konfigurasjon for køen %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Redigerer Konfigurasjonen av brukern %1"
+
+#: html/Admin/Elements/EditCustomField:91
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Redigerer Fleksifeltet %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Redigerer medlemsskap for gruppen %1""
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Redigerer medlemsskap for den personlige gruppen %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Redigerer malen %1"
+
+#: lib/RT/Ticket_Overlay.pm:2622 lib/RT/Ticket_Overlay.pm:2690
+msgid "Either base or target must be specified"
+msgstr "Enten base eller mål må oppgis"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Epost"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "Epostaddresse i bruk"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "EpostAddresse"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "EpostFormat"
+
+#: html/Admin/Elements/EditCustomField:51
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "Aktivt (Fjern merkingen for Â deaktivere dette fleksifeltet)"
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "Aktiv (Fjern merkingen for Â deaktivere denne gruppen)"
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Aktiv (Fjern merkingen for Â deaktivere denne køen)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr "Aktive Fleksifelt"
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Aktive Køer"
+
+#: html/Admin/Elements/EditCustomField:107 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Aktiv status %1"
+
+#: lib/RT/CustomField_Overlay.pm:428
+msgid "Enter multiple values"
+msgstr "Skriv multiple verdier"
+
+#: lib/RT/CustomField_Overlay.pm:425
+msgid "Enter one value"
+msgstr "Skriv en verdi"
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Skriv saker og/eller URIer som det skal linkes til. Separer dem med mellomrom"
+
+#: html/Elements/Login:39 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Feil"
+
+#: NOT FOUND IN SOURCE
+msgid "Error adding watcher"
+msgstr "Feilet ved opprettelse av Overvåker"
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Feil i parameterne til Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Feil i parameterne til Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Feil i parameterne til Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Feil i parameterne til Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Alle"
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Eksempel:"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "EksternAutId"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "EksternKontaktInfoId"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Ekstra info"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Kunne ikke finne pseudogruppen 'Privilgerte' brukere."
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Kunne ikke finne 'pseudogruppen 'Upriviligerte' brukere"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Kunne ikke laste modulen %1. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Feb."
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "Februar"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "End"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Endelig Prioritet"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr "EndeligPrioritet"
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr "Finn grupper hvor"
+
+#: NOT FOUND IN SOURCE
+msgid "Find new/open tickets"
+msgstr "Finn nye/Âpne saker"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Finn folk hvor"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr "Finn saker"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr "Fullfør godkjennelse"
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Først"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Første side"
+
+#: 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:87
+msgid "Force change"
+msgstr "Tving gjennom endring"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "Fant %quant(%1,sak)"
+
+#: lib/RT/Interface/Web.pm:902
+msgid "Found Object"
+msgstr "Fant Objektet"
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "FriforkKontaktInfo"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr "FriformMultipel"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr "FriformSingel"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Fre."
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Fulle headere"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Henter brukerinfo fra pgp signatur\\n"
+
+#: lib/RT/Transaction_Overlay.pm:593
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "Gitt til %1"
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Global"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr "Globale Nøkkelordvalg"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "Globale Scrip"
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Globale maler: %1"
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Start!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Gyldig pgp sig fra %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Gå til siden"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Gå til saken"
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr "Stor"
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "Gruppe"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Gruppen %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Grupperettigheter"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "Alt medlem av gruppen"
+
+#: NOT FOUND IN SOURCE
+msgid "Group could not be created."
+msgstr "Gruppen kunne ikke lastes."
+
+#: html/Admin/Groups/Modify.html:77
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "Gruppen kunne ikke opprettes: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Gruppen opprettet"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr "Gruppen har ikke det medlemmet"
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Fant ikke gruppen"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Fant ikke gruppen.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Ikke spesifisert gruppe.\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Grupper"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Grupper kan ikke være medlemmer av sine medlemmer"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Hallo!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Hallo, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Historikk"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "HjemmeTelefon"
+
+#: html/Elements/Tabs:44
+msgid "Homepage"
+msgstr "Hjemmeside"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "Jeg har %quant(%1, sementblandere)."
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "Jeg har [quant,_1,sementblandere]."
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Id"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identitet"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Hvis en godkjenner blir avvist, avvis orginalen, og slett ventende godkjenninger"
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Hvis dette verktøyet var setgid kunne en fiendtlig lokal bruker bruke dette verktøyet for å oppnå administrativ tilgang til RT."
+
+#: 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 "Hvis du har oppdatert noe over, sørg for at"
+
+#: lib/RT/Interface/Web.pm:894
+msgid "Illegal value for %1"
+msgstr "Ugyldig verdig for %1"
+
+#: lib/RT/Interface/Web.pm:897
+msgid "Immutable field"
+msgstr "Låst felt"
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr "Inkluder deaktiverte fleksifelt i listen."
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Inkluder deaktiverte køer i listen."
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Inkluder deaktiverte brukere i søket."
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Startprioritet"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr "StartPrioritet"
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Feil i inntasting"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr "Interesse registrert"
+
+#: lib/RT/Ticket_Overlay.pm:3796
+msgid "Internal Error"
+msgstr "Intern Feil"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Intern Feil: %1"
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Ugyldig gruppetype"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr "Ugyldige rettigheter"
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "Ugyldig Type"
+
+#: lib/RT/Interface/Web.pm:899
+msgid "Invalid data"
+msgstr "Ugyldig data"
+
+#: lib/RT/Ticket_Overlay.pm:439
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Ugydlig eier. Setter til 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Ugyldig kø"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Ugyldige rettigheter"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Ugyldig verdi for %1"
+
+#: lib/RT/Ticket_Overlay.pm:3434
+msgid "Invalid value for custom field"
+msgstr "Ugyldig verdi for fleksifeltet."
+
+#: lib/RT/Ticket_Overlay.pm:346
+msgid "Invalid value for status"
+msgstr "Ugyldig verdi for status"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Det er ekstremt viktig at ikkepriviligerte brukere ikke har tilgang til dette verktøyet."
+
+#: bin/rt-crontool:192
+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 "Det er anbefalt at du oppretter en upriviligert unixbruker med korrekt gruppemedlemsskap og tilgang til RT for Â kjøre dette verktøyet."
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Det tar flere parametere:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Ting som venter p min godkjenning"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Jan."
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "Januar"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr "Bli med i eller forlat denne gruppen"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Jul."
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "Juli"
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Total"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Jun."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "Juni"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Nøkkelord"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Språk"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Siste"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Siste Kontakt"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Sist kontaktet"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr "Sist Informert"
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Sist Oppdatert"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr "SistOppdatert"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Igjen"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "La denne brukeren få tilgang til RT"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "La denne brukeren få rettigheter"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Begrenser eier til %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Begrenser køen til %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2704
+msgid "Link already exists"
+msgstr "Lenke finnes alt"
+
+#: lib/RT/Ticket_Overlay.pm:2716
+msgid "Link could not be created"
+msgstr "Lenke kunne ikke opprettes"
+
+#: lib/RT/Ticket_Overlay.pm:2724 lib/RT/Ticket_Overlay.pm:2734
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Lenke opprettet (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2645
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Lenke slettet (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2651
+msgid "Link not found"
+msgstr "Lenke ble ikke funnet"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Knytt sak #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr "Knytt sak %1"
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Lenker"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Lokasjon"
+
+#: lib/RT.pm:159
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Logkatalogen %1 ble ikke funnet eller kunne ikke skrives til.\\nRT kan ikke kjøre."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Logget inn som %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54
+msgid "Login"
+msgstr "Innlogging"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Logg av"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Sett Eier"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Sett Status"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Sett tidsfrist" 
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Sett løsningsdato"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Sett startdato"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Sett startdato"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Sett informert dato"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Sett prioritet"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Sett Kø"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Sett Emne"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Sett grupper og gruppemedlemsskap"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Rediger egenskaper og konfigurasjon som gjelder for alle køer"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Rediger køer og kø-spesifike egenskaper"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Rediger brukere og passord"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Mar."
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "Mars"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "Mai"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "Mai."
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Medlem lagt til"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Medlem slettet"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Medlem ikke slettet"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Medlem av"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "MedlemAv"
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Medlemmer"
+
+#: lib/RT/Ticket_Overlay.pm:2891
+msgid "Merge Successful"
+msgstr "Fletting vellykket"
+
+#: lib/RT/Ticket_Overlay.pm:2811
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Fletting feilet. Kunne ikke sette EffektivId"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Flett inn i"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Melding"
+
+#: lib/RT/Interface/Web.pm:901
+msgid "Missing a primary key?: %1"
+msgstr "Mangler en primærnøkkel?: %1"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Mobil"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "MobilTelefon"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "Endre Tilgangslister"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Endre Fleksifeltet %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "Endre Fleksifelt som gjelder for alle køer"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+msgstr "Endre Scripmaler for denne køen"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "Modify Scrips for this queue"
+msgstr "Endre Scrips for denne køen"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify System ACLS"
+msgstr "Endre SystemACLer"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr "Endre Malen %1"
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "Endre et fleksifelt for køen %1"
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr "Endre et fleksifelt som gjelder for alle køer"
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Endre et scrip for køen %1"
+
+#: html/Admin/Global/Scrip.html:48
+msgid "Modify a scrip which applies to all queues"
+msgstr "Endre et scrip som gjelder for alle køer"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "Endre datoer for # %1"
+
+#: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Endre datoer for #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Endre datoer for sak # %1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Endre globale grupperettigheter"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Endre globale grupperettigheter"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for groups"
+msgstr "Endre globale rettigheter for grupper"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for users"
+msgstr "Endre globale rettigheter for brukere"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global scrips"
+msgstr "Endre globale scrips"
+
+#: html/Admin/Global/UserRights.html:25 html/Admin/Global/UserRights.html:28 html/Admin/Global/index.html:60
+msgid "Modify global user rights"
+msgstr "Endre globale brukerrettigheter"
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Endre globale brukerrettigheter"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr "Endre gruppens metadata eller slette gruppen"
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Endre grupperettigheter for %1 gruppen"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Endre grupperettigheter %1 køen"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr "Endre medlemsliste for denne gruppen"
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr "Endre sin egen RT konto"
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Endre hvem som er relatert til %1 køen"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Endre hvem som er relater til sak #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Endre scrips for %1 køen"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Endre scrips som gjelder alle køer"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Endre mal %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr "Endre maler som gjelder for alle køer"
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Endre gruppen %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr "Endre overvåkere for køen"
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Endre brukeren %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Endre sak # %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Endre sak #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "Endre saker"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Endre brukerrettigheter for %1 gruppen"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Endre brukerrettigheter for %1 køen"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Endre overvåkere for '%1' køen"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr "EndreACL"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr "EndreEgetMedlemskap"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr "EndreKøOvervåkere"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr "EndreScrips"
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr "EndreSegSelv"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr "EndreMal"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr "EndreSak"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Man."
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Mer om %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr "Flytt ned"
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr "Flytt opp"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Flere"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "Må spesifisere attributten 'Navn'"
+
+#: html/SelfService/Elements/MyRequests:49
+#. ($friendly_status)
+msgid "My %1 tickets"
+msgstr "Mine %1 saker"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Mine saker til godkjenning"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+msgstr "Mine saker til godkjenning"
+
+#: html/Admin/Elements/AddCustomFieldValue:33 html/Admin/Elements/EditCustomField:34 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"
+msgstr "Navn"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Navnet er i bruk"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "Trenger godkjennelse fra systemadministrator"
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr "Aldri"
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Ny"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Nytt Passord"
+
+#: etc/initialdata:317 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Ny, Venter på Godkjennelse"
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Nye forhold"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+msgstr "Nytt Søk"
+
+#: 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 "Nytt fleksifelt"
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr "Ny gruppe"
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Nytt passord"
+
+#: lib/RT/User_Overlay.pm:647
+msgid "New password notification sent"
+msgstr "Melding om nytt passord sendt"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr "Ny kø"
+
+#: NOT FOUND IN SOURCE
+msgid "New request"
+msgstr "Ny forespørsel"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Nye rettigheter"
+
+#: 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 "Nytt scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Nytt søk"
+
+#: html/Admin/Global/Template.html:60 html/Admin/Global/Templates.html:39 html/Admin/Queues/Template.html:58 html/Admin/Queues/Templates.html:50
+msgid "New template"
+msgstr "Ny mal"
+
+#: html/SelfService/Elements/Tabs:48
+msgid "New ticket"
+msgstr "Ny sak"
+
+#: lib/RT/Ticket_Overlay.pm:2778
+msgid "New ticket doesn't exist"
+msgstr "Ny sak eksistere ikke"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr "Ny bruker"
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Ny bruker kalt"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Ny overvåker"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Instillinger for nytt vindu"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Neste"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Neste side"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "KalleNavn"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Kallenavn"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Ingen FleksiFelt"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Ingen grupper definert"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Ingen kø definert"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Ingen RT bruker funnet. Vennligst referer til manualen.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Ingen Mal"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Ingen sak oppgitt. Avbryter sak "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Ingen Sak oppgitt. Avbryter saksendring\\n\\n"
+
+#: html/Approvals/Elements/Approve:46
+msgid "No action"
+msgstr "Ingen handling"
+
+#: lib/RT/Interface/Web.pm:896
+msgid "No column specified"
+msgstr "Ingen kolonne spesifisert"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Ingen kommando funnet\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Ingen kommentar skrevet om denne brukeren"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Ingen korrespondanse vedlagt"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Ingen beskrivelse for %1"
+
+#: lib/RT/Users_Overlay.pm:145
+msgid "No group specified"
+msgstr "Ingen gruppe spesifisert"
+
+#: lib/RT/User_Overlay.pm:865
+msgid "No password set"
+msgstr "Passordet er ikke satt"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "Ingen tilgang til å opprette køer"
+
+#: lib/RT/Ticket_Overlay.pm:342
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "Ikke tilgang til å opprette saker for køen '%1'"
+
+#: lib/RT/User_Overlay.pm:152
+msgid "No permission to create users"
+msgstr "Ikke tilgang til å opprette brukere"
+
+#: html/SelfService/Display.html:118
+msgid "No permission to display that ticket"
+msgstr "Ikke tilgang til å vise den saken"
+
+#: html/SelfService/Update.html:52
+msgid "No permission to view update ticket"
+msgstr "Ingen tilgang til å se oppdatering av saken"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Ingen primær spesifisert"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Ingen primære spesifisert"
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Det er ingen køer som matcher søkekriteriet"
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr "Ingen rettigheter funnet"
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Ingen rettigheter tildelt"
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Ingen søk Â behandle"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Ingen saksid oppgitt"
+
+#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516
+msgid "No transaction type specified"
+msgstr "Transaksjonstype ikke spesifisert"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "Ingen bruker eller epostaddresse oppgitt"
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Fant ingen brukere som treffer søkekriteriene."
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Fant ingen gyldig RT bruker. RT cvs handler avstengt. Kontakt din RT administrator.\\n"
+
+#: lib/RT/Interface/Web.pm:893
+msgid "No value sent to _Set!\\n"
+msgstr "Ingen verdi sendt til _Set!\\n"
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr "Ingen"
+
+#: lib/RT/Interface/Web.pm:898
+msgid "Nonexistant field?"
+msgstr "Ukjent felt?"
+
+#: NOT FOUND IN SOURCE
+msgid "Not logged in"
+msgstr "Ikke logget inn"
+
+#: html/Elements/Header:59
+msgid "Not logged in."
+msgstr "Ikke logget inn."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Ikke satt"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Ikke implementert enda."
+
+#: NOT FOUND IN SOURCE
+msgid "Not yet implemented...."
+msgstr "Ikke implementert enda...."
+
+#: html/Approvals/Elements/Approve:49
+msgid "Notes"
+msgstr "Notater"
+
+#: lib/RT/User_Overlay.pm:650
+msgid "Notification could not be sent"
+msgstr "Melding kunne ikke sendes"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr "Raporter til AdminCc"
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr "Rapporter til AdminCc som kommentar"
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr "Rapporter til andre mottakere"
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr "Rapporter til andre mottakere som kommentar"
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr "Rapporter til eier"
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr "Rapportert til eier som kommentar"
+
+#: etc/initialdata:319 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Rapporter til Eiere og AdminCc om nye ting som venter på godkjenning"
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr "Rapporter til kunde"
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr "Rapporter til Kunder og Cc"
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Rapporter til Kunder og Cc som kommentar"
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Rapporter til Kunder Cc og AdminCc"
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Rapporter til Kunder Cc og AdminCc som Kommentar"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Nov."
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "November"
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "Objekter kunne ikke opprettes"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Objektet ble opprettet"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Okt."
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "Oktober"
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "Ved"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Ved Kommentar"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "Ved Korrespondanse"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Ved Opprettelse"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Ved Eierskifte"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Ved Køendring"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Ved Løsning"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Ved statusendring"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Ved Transaksjon"
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Vis kun godkjennelse for saker opprettet etter %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Bare vis godkjennelse for saker opprettet før %1"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Åpne"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Åpne den"
+
+#: NOT FOUND IN SOURCE
+msgid "Open requests"
+msgstr "Åpne forespørsler"
+
+#: html/SelfService/Elements/Tabs:42
+msgid "Open tickets"
+msgstr "Åpne saker"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Åpne saker (fra utlisting) i et nytt vindu"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Åpne saker (fra utlisting) it et annet vinud"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr "Åpne saker ved korrespondanse"
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Rekkefølge og sortering"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organisasjon"
+
+#: html/Approvals/Elements/Approve:33
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Opprinnelig sak: #%1"
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Over tid beveger prioriteten seg mot"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr "Eie saker"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr "EieSak"
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Eier"
+
+#: lib/RT/Ticket_Overlay.pm:3071
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr "Eier endret fra %1 til %2"
+
+#: lib/RT/Transaction_Overlay.pm:582
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Eier ble tvunget til å endres fra %1 til %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "Eier er"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Personsøker"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "PersonSøker"
+
+#: NOT FOUND IN SOURCE
+msgid "Parent"
+msgstr "Forelder"
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:47
+msgid "Parents"
+msgstr "Foreldre"
+
+#: html/Elements/Login:52 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Passord"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Passordhint"
+
+#: lib/RT/User_Overlay.pm:169 lib/RT/User_Overlay.pm:868
+msgid "Password too short"
+msgstr "For kort passord"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Passord: %1"
+
+#: html/Admin/Users/Modify.html:293
+msgid "Passwords do not match."
+msgstr "Passordene stemmer ikke overens."
+
+#: html/User/Prefs.html:174
+msgid "Passwords do not match. Your password has not been changed"
+msgstr "Passordene stemmer ikke overrens. Passordet ble ikke endret"
+
+#: html/Ticket/Elements/ShowSummary:45 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Folk"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr "Kjør en brukerdefinert handling"
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:101 lib/RT/CustomField_Overlay.pm:202 lib/RT/CustomField_Overlay.pm:234 lib/RT/CustomField_Overlay.pm:511 lib/RT/CustomField_Overlay.pm:91 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2603 lib/RT/Ticket_Overlay.pm:2675 lib/RT/Ticket_Overlay.pm:2769 lib/RT/Ticket_Overlay.pm:2784 lib/RT/Ticket_Overlay.pm:2978 lib/RT/Ticket_Overlay.pm:3206 lib/RT/Ticket_Overlay.pm:3404 lib/RT/Ticket_Overlay.pm:3566 lib/RT/Ticket_Overlay.pm:3618 lib/RT/Ticket_Overlay.pm:3783 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:1355 lib/RT/User_Overlay.pm:570 lib/RT/User_Overlay.pm:605 lib/RT/User_Overlay.pm:861 lib/RT/User_Overlay.pm:962
+msgid "Permission Denied"
+msgstr "Ingen Tilgang"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr "Personlige Grupper"
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Personlige grupper"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Personlige grupper:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Telefonnummer"
+
+#: NOT FOUND IN SOURCE
+msgid "Placeholder"
+msgstr "Stedholder"
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr "Pref"
+
+#: html/Elements/Header:52 html/Elements/Tabs:53 html/SelfService/Elements/Tabs:51 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Instillinger"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Pref"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Klargjør Forkortet"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Forrige"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Forrige side"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "Primær %1 ikke funnet."
+
+#: html/Search/Elements/PickRestriction:54 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Prioritet"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "Prioritet starter på"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Priviligert"
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Priviligert status: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Priviligerte brukere"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Pseduogruppe for intern bruk"
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:33 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Kø"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:44
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Køen %1 kunne ikke finnes"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Køen '%1' ikke funnet\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr "Nøkkelordvalg for kø"
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Kønavn"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Køscrip"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "Køen eksisterer allerede"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "Køen kunne ikke opprettes"
+
+#: html/Ticket/Create.html:205
+msgid "Queue could not be loaded."
+msgstr "Køen kunne ikke lastes."
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Køen opprettet"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr "Køen er ikke oppgitt."
+
+#: html/SelfService/Display.html:71 lib/RT/CustomField_Overlay.pm:98
+msgid "Queue not found"
+msgstr "Køen ikke funnet"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Køer"
+
+#: html/Elements/Quicksearch:25
+msgid "Quick search"
+msgstr "Raskt søk"
+
+#: html/Elements/Login:44
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 for %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 fra <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "RT-administrasjon"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "RT Autentiseringsfeil."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RT Avvisning: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "RT Konfigurasjonsfeil"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "Kritisk RT feil. Meldingen ble ikke lagret!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "RT Feil"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT Mottok mail (%1) fra seg selv."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr "RT Mottok mail (%1) fra seg selv."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT Selvbetjening / Lukkede Saker"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr "RT oversikt"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT kunne ikke autentisere deg"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT kunne ikke finne kunde via sitt eksterne databaseoppslag"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT kunne ikke finne køen: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT kunne ikke validere denne PGP signaturen. \\n" 
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT for %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "RT for %1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT har behandlet dine kommandoer"
+
+#: html/Elements/Login:92
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT er &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;. Den er distribuert under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>""
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT er &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;. Den er distribuert under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>""
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT tror denne meldingen kan være en returmail"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT vil behandle denne meldingen som om den var usignert"
+
+#: 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 epost kommandomodus krever PGP autentisering. Meldingen din var enten ikke signert, eller signaturen din kunne ikke bekreftes."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Ekte Navn"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "EkteNavn"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:71
+msgid "Referred to by"
+msgstr "Referert til av"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:61
+msgid "Refers to"
+msgstr "Refererer til"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr "RefererTil"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Redefiner"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Redefiner søket"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Last siden p nytt hvert %1 minutt."
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:62 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Forhold"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Fjern AdminCc"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Fjern Cc"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Fjern Kunde"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Svar"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr "Svar p sak"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr "SvarPÂSak"
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Kunde"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Kundens epostaddresse"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "Kunde(r)"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "KundeAddresser"
+
+#: html/SelfService/Create.html:41 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Kunder"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Forespørsler skal være behandlet innen"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Reset"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Hjemme"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Løs"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Løs saknr #%1 (%2)"
+
+#: etc/initialdata:308 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Løst"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Svar til kunder"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Resultater"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Resultater per side"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Skriv Passord igjen"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Rettighet %1 kunne ikke finnes for %2  %3 in scope %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Rettighet Deligert"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Rettighet Tildelt"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Rettighet lastet"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Rettigheten kunne ikke trekkes tilbake"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Rettighet ikke funnet"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Rettighet ikke lastet."
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Rettighet fjernet"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Rettigheter"
+
+#: lib/RT/Interface/Web.pm:792
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "Rettigheter kunne ikke tildeles for %1"
+
+#: lib/RT/Interface/Web.pm:825
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "Rettigheter kunne ikke trekkes tilbake for %1"
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Roller"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "RootGodkjenning"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Lør."
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyLinks.html:39 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Lagre Endringer"
+
+#: NOT FOUND IN SOURCE
+msgid "Save changes"
+msgstr "Lage endringer"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "Scrip #%1"
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Scrip Opprettet"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Scrip slettet"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Scrip for %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Scrip som gjelder for alle køer"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Søk"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Søkekriteria"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr "Søk etter godkjenninger"
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Sikkerhet:"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr "SeKø"
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Velg en gruppe"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Velg en kø"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Velg en bruker"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr "Velg fleksifelt"
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr "Velg gruppe"
+
+#: lib/RT/CustomField_Overlay.pm:422
+msgid "Select multiple values"
+msgstr "Velg flere verdier"
+
+#: lib/RT/CustomField_Overlay.pm:419
+msgid "Select one value"
+msgstr "Velg en verdi"
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+msgstr "Velg kø"
+
+#: 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 "Velg scrip"
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55 html/Admin/Queues/Templates.html:47
+msgid "Select template"
+msgstr "Velg mal"
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr "Velg bruker"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr "VelgFlere"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr "VelgEnkelt"
+
+#: NOT FOUND IN SOURCE
+msgid "Self Service"
+msgstr "Selvbetjening"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr "Send epost til alle overvåkere"
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Send epost til alle overvåkere som \"kommentar\""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr "Send epost til kunder og Cc"
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Send epost til kunder og Cc som kommentar"
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr "Sender en melding til kundene"
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Send epost til eksplisit oppgitte Ccer og Bccer"
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr "Send epost til Administrative Ccer"
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Sender epost til de administrative Ccene som kommentar"
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr "Sender epost til eieren"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Sep."
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr "September"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Vis Resultater"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr "Vis godkjente forespørsler"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Vis basisinfo"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Vis avviste forespørsler"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Vis detaljer"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Vis ventende forespørsler"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "Vis forespørsler som venter på andre godkjenninger"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr "Vis sakens private kommentarer"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr "Vis sakssammendrag"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr "VisACL"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr "VisScrip"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr "VisMal"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr "VisSak"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr "VisSaksKommentarer"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "Meld deg på som saksforespørrer eller sak/kø Cc"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "Meld deg på som sak/kø AdminCc"
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Signatur"
+
+#: NOT FOUND IN SOURCE
+msgid "Signed in as %1"
+msgstr "Logget inn som %1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Enkel"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr "Dropp Meny"
+
+#: html/Admin/Elements/AddCustomFieldValue:29
+msgid "Sort"
+msgstr "Sorter"
+
+#: NOT FOUND IN SOURCE
+msgid "Sort key"
+msgstr "Sorter nøkkel"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Sorter resultater etter"
+
+#: NOT FOUND IN SOURCE
+msgid "SortOrder"
+msgstr "SorteringsRekkefølge"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Pauset"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Startside"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Startet"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "Startdato '%1' kunne ikke tolkes"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Starter"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Starter Etter"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "Startdato '%1' kunne ikke tolkes"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Stat"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Status"
+
+#: etc/initialdata:294
+msgid "Status Change"
+msgstr "Statusendring"
+
+#: lib/RT/Transaction_Overlay.pm:528
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Status endret fra %1 til %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "EndreStatus"
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Stjel"
+
+#: lib/RT/Transaction_Overlay.pm:587
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Stjålet fra %1 "
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:57 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:32 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Emne"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Endre emne til %1"
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Oppdater"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "Send Arbeidsflyt"
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr "Lykkes"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Søn."
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr "SuperBruker"
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "System"
+
+#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:567 lib/RT/Interface/Web.pm:791 lib/RT/Interface/Web.pm:824
+msgid "System Error"
+msgstr "Systemfeil"
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. Right not granted."
+msgstr "Systemfeil. Rettighet ikke tildelt."
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. right not granted"
+msgstr "Systemfeil. rettigheter ikke tildelt"
+
+#: lib/RT/ACE_Overlay.pm:616
+msgid "System error. Right not delegated."
+msgstr "Systemfeil. Rettighet ikke tildelt."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Systemfeil. Rettighet ikke tildelt."
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "Systemfeil. Kunne ikke tildele rettigheter."
+
+#: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36
+msgid "System groups"
+msgstr "Systemgrupper"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "SystemRollegruppe for intern bruk"
+
+#: lib/RT/CurrentUser.pm:318
+msgid "TEST_STRING"
+msgstr "TEST_STRENG"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Ta"
+
+#: lib/RT/Transaction_Overlay.pm:573
+msgid "Taken"
+msgstr "Tatt"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Mal"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "Mal #%1"
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr "Mal slettet"
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Kunne ikke finne mal"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Kunne ikke finne mal\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Mal tolket"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Maler"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Maler for %1\\n"
+
+#: lib/RT/Interface/Web.pm:892
+msgid "That is already the current value"
+msgstr "Verdien er allerede satt"
+
+#: lib/RT/CustomField_Overlay.pm:243
+msgid "That is not a value for this custom field"
+msgstr "Det er ikke en verdi for dette fleksifeltet"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Det er den samme verdien"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That principal already has that right"
+msgstr "Den primæren har allerede den rettigheten"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Den primæren er allerede en %1 for denne køen"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Den primæren er allerede en %1 for denne køen"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Den primæren er ikke en %1 for denne køen"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Den primæren er ikke en %1 for denne saken"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Den køen eksisterer ikke"
+
+#: lib/RT/Ticket_Overlay.pm:3210
+msgid "That ticket has unresolved dependencies"
+msgstr "Denne saken har uløste avhengigheter"
+
+#: NOT FOUND IN SOURCE
+msgid "That user already has that right"
+msgstr "Den brukeren har allerede den rettigheten"
+
+#: lib/RT/Ticket_Overlay.pm:3020
+msgid "That user already owns that ticket"
+msgstr "Den brukeren eier allerede den saken"
+
+#: lib/RT/Ticket_Overlay.pm:2986
+msgid "That user does not exist"
+msgstr "Den brukeren finnes ikke"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Den brukeren er allerede priviligert"
+
+#: lib/RT/User_Overlay.pm:336
+msgid "That user is already unprivileged"
+msgstr "Den brukeren er allerede upriviligert"
+
+#: lib/RT/User_Overlay.pm:328
+msgid "That user is now privileged"
+msgstr "Denne brukeren er nå priviligert"
+
+#: lib/RT/User_Overlay.pm:349
+msgid "That user is now unprivileged"
+msgstr "Dette brukeren er nå upriviligert"
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr "Den brukeren er allerede upriviligert"
+
+#: lib/RT/Ticket_Overlay.pm:3012
+msgid "That user may not own tickets in that queue"
+msgstr "Den brukeren kan ikke eie saker i den køen"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Dette er ikke en numerisk id"
+
+#: html/SelfService/Display.html:32 html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Detaljer"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr "CCen til en sak"
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr "Administrative CCer for en sak"
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "Kommentarer er lagret"
+
+#: bin/rt-crontool:198
+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 "De følgende kommandoene vil finne alle aktive saker i køen 'general' og sette deres prioritet til 99 hvis de ikke har blitt rørt de siste 4 timene:"
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "De følgende kommandoene ble ikke behandlet:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:895
+msgid "The new value has been set."
+msgstr "Den nye verdien har blitt satt."
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr "Eieren av en sak"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr "Forespørren av en sak"
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Disse kommentarene er generelt ikke synlig for brukeren"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Denne saken %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Dette verktøyet tillater brukeren  å kjøre perlmoduler fra inni RT."
+
+#: lib/RT/Transaction_Overlay.pm:251
+msgid "This transaction appears to have no content"
+msgstr "Denne transaksjonen ser ikke ut til å ha noe innhold"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "Denne brukerens %1 høyst prioriterte saker"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "Denne brukerens 23 høys prioriterte saker"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Tor."
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket"
+msgstr "Sak"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr "Sak # %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1 Jumbo update: %2"
+msgstr "Sak $ %1 Jumbo oppdater: %2"
+
+#: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "Sak #%1 Jumbo oppdatering: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Sak #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:587 lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Sak %1 opprettet i '%2' køen"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Sak %1 lastet\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Sak %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Sakshistorikk # %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Id"
+msgstr "SaksId"
+
+#: etc/initialdata:309
+msgid "Ticket Resolved"
+msgstr "Løst Sak"
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Saks-vedlegg"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Saks-innhold"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Sakens innholdstype"
+
+#: lib/RT/Ticket_Overlay.pm:496 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr "Saken kunne ikke opprettes på grunn av en intern feil"
+
+#: lib/RT/Transaction_Overlay.pm:520
+msgid "Ticket created"
+msgstr "Sak opprettet"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Saksopprettelse feilet"
+
+#: lib/RT/Transaction_Overlay.pm:525
+msgid "Ticket deleted"
+msgstr "Sak slettet"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+msgid "Ticket id not found"
+msgstr "Saksid ikke funnet"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket killed"
+msgstr "Sak drept"
+
+#: html/REST/1.0/modify:36 html/REST/1.0/update:41
+msgid "Ticket not found"
+msgstr "Sak ikke funnet"
+
+#: etc/initialdata:295
+msgid "Ticket status changed"
+msgstr "Saksstatus endret"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Saksovervåkere"
+
+#: html/Elements/Tabs:47
+msgid "Tickets"
+msgstr "Saker"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "Saker %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Saker %1 av %2"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Saker fra %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "Saker som er avhengige av denne godkjennelsen:"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Tid Igjen"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Arbeidstid"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Tid igjen"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Tid å vise"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Arbeidstid"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "TidIgjen"
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr "ArbeidsTid"
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "For å generere en diff av denne bekreftelsen:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "For å genere en diff av denne bekreftelsen"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Fortalt"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transaksjon"
+
+#: lib/RT/Transaction_Overlay.pm:640
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Transaksjon %1 slettet"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transaksjon Opprettet"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Transaction->Create kunne ikke, siden du ikke spesifiserte en saksid"
+
+#: lib/RT/Transaction_Overlay.pm:699
+msgid "Transactions are immutable"
+msgstr "Transaksjoner er låst"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Prøver å slette en rettighet: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Tir."
+
+#: html/Admin/Elements/EditCustomField:44 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Type"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Uimplementert"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Unix login"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "UnixBrukerNavn"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Ukjent InnholdsFormatering %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Ubegrenset"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "Upriviligert"
+
+#: lib/RT/Transaction_Overlay.pm:569
+msgid "Untaken"
+msgstr "Ikke tatt"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Oppdater"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Oppdater ID"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Oppdater Type"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Oppdater alle disse sakene samtidig"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Oppdater epost"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Oppdater navn"
+
+#: lib/RT/Interface/Web.pm:409
+msgid "Update not recorded."
+msgstr "Oppdatering ikke lagret."
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Oppdater valgte saker"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Oppdater signatur"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Oppdater sak"
+
+#: NOT FOUND IN SOURCE
+msgid "Update ticket # %1"
+msgstr "Ooppdater sak # %1"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:47
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Oppdater sak #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Oppdater sak #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:407
+msgid "Update type was neither correspondence nor comment."
+msgstr "Oppdateringstype var verken korrespondanse eller kommentar."
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Oppdatert"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Bruker %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Bruker %1 Passord: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Brukeren '%1' ble ikke funnet"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Brukeren '%1' ble ikke funnet"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr "Bruker Definert"
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "BrukerID"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "BrukerId"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Brukerrettigheter"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Bruker kunne ikke opprettes: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Bruker opprettet"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Brukerdefinerte grupper"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Bruker informert"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Brukervisning"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Brukernavn"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Brukere"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Brukere som treffer søkekriteria"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "KøVerdi"
+
+#: html/Admin/Elements/EditCustomField:57
+msgid "Values"
+msgstr "Verdier"
+
+#: NOT FOUND IN SOURCE
+msgid "VrijevormEnkele"
+msgstr "VrijevormEnkele"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr "Overvåk"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr "OvervåkSomAdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "Overvåker lastet"
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Overvåkere"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "WebFormatering"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Ons."
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Når en sak har blitt godkjent av alle godkjennere, legg til korrespondanse for den opprinnelige saken"
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Når en sak har blitt godkjent av en godkjenner, legg til korrespondanse til den orginale saken"
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Når er sak er opprettet"
+
+#: 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 "Når er godkjennelsessak blir opprettet, gi melding til Eier og AdminCc om saken som venter på deres godkjenning"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Når noe skjer"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Når en sak er løst"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Når en sak får ny eier"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Når en sak flyttes til en ny kø"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Når en saks status endres"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Når brukerdefinerte forhold intreffer"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Når kommentarer kommer inn"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Når korrespondanse kommer inn"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Arbeid"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "ArbeidsTelefon"
+
+#: html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Arbeidet"
+
+#: lib/RT/Ticket_Overlay.pm:3123
+msgid "You already own this ticket"
+msgstr "Du eier allerede denne saken"
+
+#: html/autohandler:108
+msgid "You are not an authorized user"
+msgstr "Du er ikke en autorisert bruker"
+
+#: lib/RT/Ticket_Overlay.pm:2998
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Du kan bare omfordele saker som du eier eller som ikke har en eier"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "Du har ikke tilgang til å se den saken.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "Du fant %1 saker i %2 køen"
+
+#: html/NoAuth/Logout.html:31
+msgid "You have been logged out of RT."
+msgstr ""
+
+#: html/SelfService/Display.html:78
+msgid "You have no permission to create tickets in that queue."
+msgstr "Du har ikke tilgang til å opprette saker i den køen."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "Du kan ikke opprette forespørsler i den køen."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "Velkommen tilbake"
+
+#: NOT FOUND IN SOURCE
+msgid "Your %1 requests"
+msgstr "Dine %1 forespørsler"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "Din RT administrastor har feilkonfigurert mail aliasene som kaller 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 "Din forespørsel har blitt godkjent av %1. Andre godkjennelser avventer kanskje fortsatt"
+
+#: etc/initialdata:469 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Din forespørsel ble godkjent."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "Din forespørsel ble avvist"
+
+#: etc/initialdata:390 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Din forespørsel ble avvist"
+
+#: html/autohandler:127
+msgid "Your username or password is incorrect"
+msgstr "Ditt brukernavn/passord er ugyldig"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "Zip"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr "[ikke noe emne]"
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "som tildelt til %1"
+
+#: html/SelfService/Closed.html:28
+msgid "closed"
+msgstr "lukket"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "inneholder"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "innhold"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "innholdstype"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "korrespondanse (sansynligvis) ikke sendt"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "korrespondanse sendt"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "dager"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "død"
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "slett"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "slettet"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "treffer ikke"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "inneholder ikke"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "lik som"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr "usant"
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "filnavn"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "større enn"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "gruppe '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "timer"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "id"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "er"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "er ikke"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "mindre enn"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "treffer"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "minutter"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "endringer\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "måneder"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "ny"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr "ingen verdi"
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "ingen"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "ikke lik som"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr "ikkelik"
+
+#: html/SelfService/Elements/MyRequests:61 lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "åpen"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "personlig gruppe '%1' for bruker '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "kø %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "avvist"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "løst"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "sek"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "pauset"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "system %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "systemgruppe '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "den kallende komponenten oppga ikke hvorfor"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "sak #%1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr "sant"
+
+#: lib/RT/Group_Overlay.pm:216
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "ubeskrevet gruppe %1"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr "ubeskrevet gruppe %1"
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "bruker %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "uker"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "med malen %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "år"
+
+#: NOT FOUND IN SOURCE
+msgid "„Éã„ÉÉ„ÇØ„Éç„ɺ„Ɇ"
+msgstr "????"
+
diff --git a/rt/lib/RT/I18N/pt_br.po b/rt/lib/RT/I18N/pt_br.po
new file mode 100644 (file)
index 0000000..6962ecb
--- /dev/null
@@ -0,0 +1,4829 @@
+# $Id: pt_br.po,v 1.1 2003-07-15 13:16:28 ivan Exp $
+msgid ""
+msgstr ""
+"Project-Id-Version: RT 2.1.x\n"
+"POT-Creation-Date: 2002-05-02 11:36+0800\n"
+"PO-Revision-Date: 2002-12-07 23:20-02:00\n"
+"Last-Translator: Gustavo Chaves <gustavo@cpqd.com.br>\n"
+"Language-Team: rt-devel <rt-devel@lists.fsck.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "#"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr ""
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %2 %3 %4:%5:%6 %7"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%1 %2 adicionado"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "%1 %2 atrás"
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 alterado para %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%1 %2 removido"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 %2 of group %3"
+msgstr "%1 %2 do grupo %3"
+
+#: 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"
+msgstr "%1 %2 com modelo %3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 este tíquete\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "%1 - %2 apresentados"
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - Um argumento para passar para %2"
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - Mostra atualizações de estado no STDOUT"
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - Especifica o módulo de ação que você quer usar"
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - Especifica o módulo de condição que você quer usar"
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - Especifica o módulo de busca que você quer usar"
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "ScripAction %1 carregado"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 usado como um valor de %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "Aliases %1 requerem um TicketId no qual trabalhar"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "Aliases %1 requerem um TicketId no qual trabalhar "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "Aliases %1 requerem um TicketId no qual trabalhar (de %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr "%1 parece ser um objeto local, mas não pode ser encontrado no banco de dados"
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 por %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 alterado de %2 para %3"
+
+#: lib/RT/Interface/Web.pm:857
+msgid "%1 could not be set to %2."
+msgstr "%1 não pôde ser alterado para %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 não pôde iniciar uma transação (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 não pôde alterar estado para resolvido.  O banco de dados do RT pode estar inconsistente."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "%1 tíquetes de mais alta prioridade que eu possuo..."
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "%1 tíquetes de mais alta prioridade que eu requeri..."
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 é uma ferramenta para modificar tíquetes a partir de uma ferramenta de agenda externa, como o cron."
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 não é mais um %2 para esta fila."
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 não é mais um %2 para este tíquete."
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 is no longer a value for custom field %2"
+msgstr "%1 não é mais um valor para o campo personalizado %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 isn't a valid Queue id."
+msgstr "%1 não é um identificador de fila válido."
+
+#: html/Ticket/Elements/ShowBasics:36
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 min"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 não mostrado"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1 direitos"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 teve sucesso\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "Tipo %1 desconhecido para $MessageId"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "Tipo %1 desconhecido para %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 was created without a CurrentUser\\n"
+msgstr "%1 foi criado sem um CurrentUser\\n"
+
+#: lib/RT/Action/ResolveMembers.pm:42
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 resolverá todos os membros de um grupo de tíquetes resolvidos."
+
+#: NOT FOUND IN SOURCE
+msgid "%1 will stall a [local] BASE if it's dependent [or member] of a linked up request."
+msgstr "%1 colocará como pendente uma BASE [local] se for dependente [ou membro] de uma requisição ligada."
+
+#: lib/RT/Transaction_Overlay.pm:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: nenhum arquivo anexo especificado"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr "%1b"
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k"
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' é um valor inválido para o estado"
+
+#: NOT FOUND IN SOURCE
+msgid "'%1' not a recognized action. "
+msgstr "'%1' não é uma ação reconhecida."
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete group member)"
+msgstr "(Assinale para remover o membro do grupo)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check box to delete scrip)"
+msgstr "(Assinale para remover o scrip)"
+
+#: 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 "(Assinale para remover)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check boxes to delete)"
+msgstr "(Assinale para remover)"
+
+#: html/Ticket/Create.html:178
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(Entre com identificadores de tíquetes ou URLs, separados por espaços)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(Se deixado em branco, será entendido como %1"
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(Sem Valor)"
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr "(Nenhum campo personalizado)"
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Sem membros)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Sem scrips)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr "(Nenhum esquema)"
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Envia uma cópia-cega (Bcc) desta atualização para uma lista de endereços de email separados por vírgula.  <b>Não</b> altera quem vai receber atualizações futuras.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Envia uma cópia-cega (Bcc) desta atualização para uma lista de endereços eletrônicos separados por vírgulas. <b>Não</b> altera o destinatário de atualizações futuras.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Envia uma cópia-cega (Bcc) desta atualização para uma lista de endereços eletrônicos separados por vírgulas. <b>Não</b> altera o destinatário de atualizações futuras.)"
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(Envia uma cópia-cega (Bcc) desta atualização para uma lista de endereços eletrônicos separados por vírgulas. <b>Não</b> altera o destinatário de atualizações futuras.)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(Envia uma cópia desta atualização para uma lista de endereços eletrônicos separados por vírgulas. <b>Não</b> altera o destinatário de atualizações futuras.)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(Envia uma cópia desta atualização para uma lista de endereços eletrônicos separados por vírgulas. Estas pessoas <b>receberão</b> as atualizações futuras.)"
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(vazio)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr "(nenhum nome listado)"
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(Sem assunto)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(sem valor)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(somente um tíquete)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr "(aguardando aprovação)"
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr "(aguardando outros tíquetes)"
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr "(grupo do requisitante)"
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(requerido)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "(untitled)"
+msgstr "(sem título)"
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I own..."
+msgstr "25 tíquetes mais prioritários que possuo..."
+
+#: NOT FOUND IN SOURCE
+msgid "25 highest priority tickets I requested..."
+msgstr "25 tíquetes mais prioritários que requisitei..."
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Novo tíquete em\">&nbsp;%1"
+
+#: NOT FOUND IN SOURCE
+msgid "??????"
+msgstr ""
+
+#: etc/initialdata:203
+msgid "A blank template"
+msgstr "Um modelo vazio"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE Removida"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE Carregada"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr "ACE não pôde ser removida"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr "ACE não pode ser encontrada"
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE não encontrado"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACEs só podem ser criados e removidos."
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Abortando para evitar modificações indesejadas no tíquete.\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr "Sobre mim"
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Controle de acesso"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Ação"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "Ação %1 não encontrada"
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Ação confirmada."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Ação preparada..."
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Adicionar AdminCc"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+msgstr "Adicionar Cc"
+
+#: html/Ticket/Create.html:114 html/Ticket/Update.html:100
+msgid "Add More Files"
+msgstr "Adicionar Mais Arquivos"
+
+#: NOT FOUND IN SOURCE
+msgid "Add Next State"
+msgstr "Adicionar Próximo Estado"
+
+#: html/Search/Bulk.html:88
+msgid "Add Requestor"
+msgstr "Adicionar Requisitante"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a Scrip to this queue"
+msgstr "Adicionar um Scrip nesta fila"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a Scrip which will apply to all queues"
+msgstr "Adicionar um Scrip que será aplicado a todas as filas"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a keyword selection to this queue"
+msgstr "Adicionar uma seleção de teclado a esta fila"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a new a global scrip"
+msgstr "Adicionar um novo scrip global"
+
+#: NOT FOUND IN SOURCE
+msgid "Add a scrip to this queue"
+msgstr "Adicionar um scrip a esta fila"
+
+#: html/Admin/Global/Scrip.html:55
+msgid "Add a scrip which will apply to all queues"
+msgstr "Adicionar um scrip que se aplicará a todas as filas"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Adicionar comentários ou respostas aos tíquetes selecionados"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Adicionar membros"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+msgid "Add new watchers"
+msgstr "Adicionar novos observadores"
+
+#: NOT FOUND IN SOURCE
+msgid "AddNextState"
+msgstr "AddNextState"
+
+#: lib/RT/Queue_Overlay.pm:643
+#. ($args{'Type'})
+msgid "Added principal as a %1 for this queue"
+msgstr "Principal adicionado como um %1 para esta fila"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Principal adicionado como um %1 para este tíquete"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Endereço 1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Endereço 2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Admin Cc"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr "Comentário do Administrador"
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr "Correspondência do Administrador"
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Administração de filas"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Administração de usuários"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Administração da configuração global"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Administração de Grupos"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+msgid "Admin/Queue/Basics"
+msgstr "Administração de uma fila"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminAllPersonalGroups"
+msgstr "AdminAllPersonalGroups"
+
+#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:39 html/Ticket/Update.html:50 lib/RT/ACE_Overlay.pm:89
+msgid "AdminCc"
+msgstr "AdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "AdminComment"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "AdminCorrespondence"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "AdminCustomFields"
+msgstr "AdminCustomFields"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr "AdminGroup"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr "AdminGroupMembership"
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr "AdminOwnPersonalGroups"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr "AdminQueue"
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr "AdminUsers"
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+msgid "Administrative Cc"
+msgstr "Cc Administrativo"
+
+#: NOT FOUND IN SOURCE
+msgid "Admins"
+msgstr "Administradores"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "Busca avançada"
+
+#: html/Elements/SelectDateRelation:36
+msgid "After"
+msgstr "Depois"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "Idade"
+
+#: NOT FOUND IN SOURCE
+msgid "Alias"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Alias for"
+msgstr "Alias para"
+
+#: html/Admin/Elements/EditCustomFields:96
+msgid "All Custom Fields"
+msgstr "Todos os Campos Personalizados"
+
+#: html/Admin/Queues/index.html:53
+msgid "All Queues"
+msgstr "Todas as filas"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "Sempre envia uma mensagem para os requisitantes independentemente do remetente"
+
+#: html/Elements/Tabs:58
+msgid "Approval"
+msgstr "Aprovação"
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Aprovação #%1: %2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Aprovação #%1: Notas não registradas devido a um erro de sistema"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "Aprovação #%1: Notas registradas"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Details"
+msgstr "Detalhes da Aprovação"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval diagram"
+msgstr "Diagrama da aprovação"
+
+#: html/Approvals/Elements/Approve:45
+msgid "Approve"
+msgstr "Aprove"
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr "Notas do aprovador: %1"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Abr."
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "Abril"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "Ascendente"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Anexar"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Anexar arquivo"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr "Arquivo anexado"
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Arquivo anexo '%1' não pôde ser carregado"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Arquivo anexo criado"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Nome do arquivo anexo"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Arquivos anexos"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Ago."
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "Agosto"
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "Sistema de autenticação"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr "Autoreply"
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "Autoreply para Requisitantes"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "AutoreplyToRequestors"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Assinatura PGP inválida: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Identificador de arquivo anexo inválido.  Não pude encontrar o arquivo '%1'\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Dados inválidos em %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Número inválido de transação para o arquivo anexo.  %1 deveria ser %2\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Básicos"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Bcc"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Não se esqueça de salvar suas alterações"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "Antes"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr "Incício da Aprovação"
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr "Vazio"
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "URL para guardar esta busca em seus marcadores"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Cabeçalhos resumidos"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Atualização de tíquetes em lote"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "Não posso modificar os usuários do sistema"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr "Este principal pode ver esta fila"
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "Não posso adicionar um valor de campo personalizado sem um nome"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "Não posso ligar um tíquete a ele mesmo"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Não posso unir a um tíquete já unido.  Você nunca deve obter este erro"
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "Não especifique origem e destino simultaneamente"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Não posso criar o usuário: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Cc"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Mudar a senha"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr "Assinale para remover"
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Assinalar para revogar o direito de acesso"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Filhos"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Cidade"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr "Fechado"
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Requisições fechadas"
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr "Código"
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Comando não entendido!\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Comentário"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Endereço de Comentário"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Comentário não registrado"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr "Comente sobre os tíquetes"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr "CommentOnTicket"
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Comentários"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Comentários (não enviados aos requisitantes)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Comentários (não enviados aos requisitantes)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Comentários sobre %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Comentários sobre este usuário"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Comentários adicionados"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Compilar restrições"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Condição"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "Condição satisfeita..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Condição não encontrada"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Configuração"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Confirmar"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "Informação de contato"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Data de contato '%1' não pôde ser entendida"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Conteúdo"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr "Não pude criar o grupo"
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr "Correspondência"
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Endereço de correspondência"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Correspondência adicionada"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Correspondência não registrada"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "Não pude adicionar novo valor de campo personalizado para o tíquete. "
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr "Não pude adicionar novo valor de campo personalizado para o tíquete. %1"
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "Não pude alterar o proprietário. "
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Não pude criar CampoPersonalizado"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Não pude criar o grupo"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Não pude criar o modelo: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "Não pude criar o tíquete. Fila não selecionada"
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "Não pude criar o usuário"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "Não pude criar um observador para o requisitante"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Não pude encontrar um tíquete com identificador %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Não pude encontrar o grupo %1."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Não pude encontrar ou criar o usuário"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Não pude encontrar este principal"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Não pude encontrar o usuário %1."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Não pude carregar o grupo"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Não pude fazer este principal um %1 para esta fila"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Não pude fazer este principal um %1 para este tíquete"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Não pude remover este principal como um %1 para esta fila"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Não pude remover este principal como um %1 para este tíquete"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Não pude adicionar o membro no grupo"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Não pude criar uma transação: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Não sei o que fazer com a resposta do gpg\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Não encontrei o grupo\\n"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr "Não pude encontrar o registro"
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Não encontrei este principal"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "Não encontrei este valor"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "Não pude encontrar este observador"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Não pude encontrar o usuário\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Não pude carregar %1 do banco de dados de usuários.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "Não pude carregar os KeywordSelects."
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "Não pude carregar o arquivo de configuração do RT '%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr "Não pude carregar os Scrips."
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Não pude carregar o grupo %1"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Não pude carregar a ligação"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Não pude carregar a fila"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Não pude carregar a fila %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Não pude carregar o scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Não pude carregar o modelo"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Não pude carregar este usuário (%1)"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Não pude carregar o tíquete '%1'"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "País"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Criar"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr "Criar Tíquetes"
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Criar um CampoPersonalizado"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "Criar um Campo Personalizado para a fila %1"
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr "Criar um Campo Personalizado para todas as filas"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Criar um novo Campo Personalizado"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr "Criar um novo Scrip global"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "Criar um novo scrip global"
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Criar um novo grupo"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Criar um novo grupo pessoal"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Criar uma nova fila"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Criar um novo scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Criar um novo modelo"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Criar um novo tíquete"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Criar um novo usuário"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Criar uma fila"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Criar uma fila chamada"
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Criar uma requisição"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Criar um scrip para a fila %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Criar um modelo"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "Criação falhou: %1 / %2 / %3 "
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr "Criação falhou: %1/%2/%3"
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr "Criar novos tíquetes baseados no esquema deste scrip"
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "Criar um tíquete"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr "Criar tíquetes nesta fila"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr "Criar, remover e modificar campos personalizados"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr "Criar, remover e modificar filas"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "Criar, remover e modificar os membros dos grupos pessoais de qualquer usuário"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr "Criar, remover e modificar os membros de grupos pessoais"
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr "Criar, remover e modificar usuários"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr "CreateTicket"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Criado"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "CampoPersonalizado %1 criado"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Modelo %1 criado"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Relações atuais"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Scrips correntes"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Membros atuais"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Direitos de acesso atuais"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr "Critério de busca atual"
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Observadores atuais"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr "Campo Personalizado #%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"
+msgstr "Campos Personalizados"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Código de finalização da ação customizada"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Código de preparação da ação customizada"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Condição customizada"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Campo personalizado %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "O campo personalizado %1 tem um valor."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "O campo personalizado %1 não tem valor."
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Campo personalizado %1 não encontrado"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr "Campo personalizado removido"
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Campo personalizado não encontrado"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "O valor de campo %1 não pôde ser encontrado para o campo personalizado %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "O valor do campo personalizado foi alterado de %1 para %2"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "O valor do campo personalizado não pôde ser removido"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "O valor de campo personalizado não pôde ser encontrado"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Valor do campo personalizado removido"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "Erro de dado"
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Datas"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "Dez."
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "Dezembro"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "Esquema Padrão de Autoresposta"
+
+#: etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "Esquema padrão de Autoresposta"
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr "Esquema padrão de comentário administrativo"
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr "Esquema padrão de correspondência administrativa"
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr "Esquema padrão de correspondência"
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr "Esquema padrão de transação"
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "Padrão: %1/%2 mudou de %3 para %4"
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Delegar direitos de acesso"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr "Delegar direitos específicos que foram outorgados a você."
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr "DelegateRights"
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr "Delegação"
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr "Remover"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr "Remover tíquetes"
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr "DeleteTicket"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Ao remover este objeto você pode quebrar a integridade referencial"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Ao remover este objeto você quebra a integridade referencial"
+
+#: lib/RT/User_Overlay.pm:430
+msgid "Deleting this object would violate referential integrity"
+msgstr "Ao remover este objeto você viola a integridade referencial"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity."
+msgstr "Remover este objeto violaria a integridade referencial"
+
+#: NOT FOUND IN SOURCE
+msgid "Deleting this object would violate referential integrity. That's bad."
+msgstr "Remover este objeto violaria a integridade referencial.  Isto é mau."
+
+#: html/Approvals/Elements/Approve:46
+msgid "Deny"
+msgstr "Negue"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "Dependem deste tíquete"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Dependências: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Depende de"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr "DependsOn"
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "Descendente"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Descreva o problema abaixo"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Descrição"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Detalhes"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Apresentação"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr "Mostrar Lista de Controle de Acesso"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr "Mostras os esquemas de Scrip para esta fila"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr "Mostrar os Scrips para esta fila"
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Modo de apresentação"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Apresentar o tíquete #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr "Fazer qualquer coisa"
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Não recarregar esta página."
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr "Não mostrar resultados da busca"
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Baixar"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Vencido"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "A data de vencimento '%1' não pôde ser entendida"
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "ERRO: Não pude carregar o tíquete '%1': %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Editar"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr "Editar Condições"
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Editar Campos Personalizados para %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Editar Relacionamentos"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "Editar Esquemas para a fila %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr "Editar palavras chave"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "Editar scrips"
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Editar os modelos do sistema"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Editar os modelos para %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Editando a configuração para a fila %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Editando a configuração para o usuário %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Editando o campo %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Editando os membros do grupo %1"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Editando os membros do grupo pessoal %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Editando o modelo %1"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "Você deve especificar a origem ou o destinatário"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Email"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "O endereço de email já está em uso"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "Correio Eletrônico"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "Codificação de Email"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "Habilitado (Deselecionando este ítem desabilita este campo personalizado)"
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "Habilitado (Deselecionando este ítem desabilita este grupo)"
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Habilitado (desassinalando desabilita esta fila)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr "Campos Personalizados Habilitados"
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Filas Habilitadas"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Estado %1 habilitado"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr "Entre com múltiplos valores"
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr "Entre com um valor"
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Entre com identificadores de tíquete ou URIs que levam ao tíquete.  Separe entradas múltiplas com espaços."
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+msgid "Error"
+msgstr "Erro"
+
+#: NOT FOUND IN SOURCE
+msgid "Error adding watcher"
+msgstr "Erro ao adicionar um observador"
+
+#: lib/RT/Queue_Overlay.pm:555
+msgid "Error in parameters to Queue->AddWatcher"
+msgstr "Erro nos parâmetros para Queue->AddWatcher"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Erro nos parâmetros para Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Erro nos parâmetros para Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Erro nos parâmetros para Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr "Todos"
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Exemplo:"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "ExternalAuthId"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "ExternalContactInfoId"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Informação adicional"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Não pude encontrar o pseudogrupo de usuários 'Privileged'."
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Não pude encontrar o pseudogrupo de usuários 'Unprivileged'"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "Falhou ao carregar o módulo %1. (%2)"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Fev."
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "Fevereiro"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "Fin"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Prioridade Final"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr "FinalPriority"
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr "Encontrar o grupo cujo"
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Encontrar tíquetes novos/abertos"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Encontrar pessoas que"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr "Encontrar tíquetes"
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr "Terminar Aprovação"
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Primeiro"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Primeira página"
+
+#: 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:87
+msgid "Force change"
+msgstr "Force alteração"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "Encontrado %quant(%1,tíquete)"
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr "Objeto Encontrado"
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "FreeformContactInfo"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr "FreeformMultiple"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr "FreeformSingle"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Sex."
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Cabeçalhos completos"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Obtendo o usuário corrente a partir de uma assinatura pgp\\n"
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "Dado a %1"
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Global"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr "Seleções de Palavras Chave Globais"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "Scrips Globais"
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr "Esquema global: %1"
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Ir!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Assinatura pgp válida de %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Ir para a página"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Ir para o tíquete"
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr ""
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr "Grupo"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Grupo %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Direitos de Acesso do Grupo"
+
+#: lib/RT/Group_Overlay.pm:965
+msgid "Group already has member"
+msgstr "O grupo já tem um membro"
+
+#: NOT FOUND IN SOURCE
+msgid "Group could not be created."
+msgstr "O grupo não pôde ser criado."
+
+#: html/Admin/Groups/Modify.html:77
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "O grupo não pôde ser criado: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Grupo criado"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr "O grupo não contém este membro"
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Grupo não encontrado"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Grupo não encontrado.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Grupo não especificado.\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Grupos"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Grupos não podem ser membros de seus próprios membros"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Olá!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Olá, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "Histórico"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "Telefone Residencial"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Homepage"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "Eu tenho %quant(%1,concrete mixer)."
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "Tenho [quant,_1,concrete mixer]."
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Identificador"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Identidade"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr "Se uma aprovação é rejeitada, rejeite a original e remova as aprovações pendentes"
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Se esta ferramenta fosse setgid, um usuário local mal-intencionado poderia usá-la para obter acesso administrativo ao RT."
+
+#: 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 "Se você alterou qualquer coisa acima, não se esqueça de"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr "Valor ilegal para %1"
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr "Campo imutável"
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr "Incluir campoas personalizados desabilitados na listagem."
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Incluir filas desabilitadas na listagem."
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Incluir usuários desabilitados na busca."
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Prioridade Inicial"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr "InitialPriority"
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Erro de entrada"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr "Interesse notado"
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr "Erro Interno"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "Erro Interno: %1"
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Tipo Inválido de Grupo"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr "Direito Inválido"
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "Tipo Inválido"
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr "Dado inválido"
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Proprietário inválido.  Usando 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Fila inválida"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Direito de acesso inválido"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Valor inválido para %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Valor inválido para o campo personalizado"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Valor inválido para o estado"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "É extremamente importante que usuários não privilegiados não possam executar esta ferramenta."
+
+#: bin/rt-crontool:192
+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 "Sugere-se que você crie um usuário UNIX não privilegiado com o grupo e acesso RT corretos para executar esta ferramenta."
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Requer vários argumentos:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Itens requerendo minha aprovação"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Jan."
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "Janeiro"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr "Entre ou deixe este grupo"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Jul."
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "Julho"
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Jumbo"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Jun."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "Junho"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Palavra chave"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Líng"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Último"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Último Contato"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Contactado em"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr "Notificado em"
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Atualizado em"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr "LastUpdated"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Resta"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Deixar este usuário acessar RT"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Deixar este usuário receber direitos de acesso adicionais"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Limitando proprietário a %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Limitando fila a %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "A ligação já existe"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "A ligação não pôde ser criada"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "Ligação criada (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Ligação removida (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Ligação não encontrada"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Ligar o tíquete #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr "Ligar o tíquete %1"
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Ligações"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Localização"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "O diretório de log %1 não foi encontrado ou não pôde ser alterado.\\n RT não pode funcionar desta maneira."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Assinado como %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Entrar"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Sair"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Definir como proprietário"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Definir o estado"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Definir o prazo final"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Definir a data de resolução"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Definir a data de iniciado"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Definir a data início"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Definir a data de última alteração"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Definir a prioridade"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Definir a fila"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Definir o assunto"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Administrar grupos e seus membros"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Administrar propriedades e configurações aplicáveis a todas as filas"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Administrar filas e suas propriedades específicas"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Administrar usuários e senhas"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Mar."
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "Março"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "Maio"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "Mai."
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Membro adicionado"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Membro removido"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Membro não removido"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Membro de"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "MemberOf"
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Membros"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "União bem sucedida"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "União falhou. Não pude definir o EffectiveId"
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Unir a"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Mensagem"
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr "Faltando uma chave primária?: %1"
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Móvel"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "Celular"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr "Modificar Lista de Controle de Acesso"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Modificar o campo personalizado %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "Modificar Campos Personalizados que se aplicam a todas as filas"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+msgstr "Modificar esquemas de Scrip para esta fila"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "Modify Scrips for this queue"
+msgstr "Modificar Scrips para esta fila"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify System ACLS"
+msgstr "Modificar ACLs do Sistema"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Template %1"
+msgstr "Modificar Esquema %1"
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "Modificar um Campo Personalizado para a fila %1"
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr "Modificar um Campo Personalizado que se aplica a todas as filas"
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Modificar um scrip para a fila %1"
+
+#: html/Admin/Global/Scrip.html:48
+msgid "Modify a scrip which applies to all queues"
+msgstr "Modificar um scrip aplicável a todas as filas"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "Modificar datas para # %1"
+
+#: html/Ticket/ModifyDates.html:25 html/Ticket/ModifyDates.html:29
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "Modificar as datas para #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Modificar as datas para o tíquete # %1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Modificar direitos de acesso globais de grupo"
+
+#: html/Admin/Global/GroupRights.html:33
+msgid "Modify global group rights."
+msgstr "Modificar direitos de acesso globais de grupo."
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for groups"
+msgstr "Modificar direitos globais para grupos"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global rights for users"
+msgstr "Modificar direitos globais para usuários"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify global scrips"
+msgstr "Modificar scrips globais"
+
+#: html/Admin/Global/UserRights.html:25 html/Admin/Global/UserRights.html:28 html/Admin/Global/index.html:60
+msgid "Modify global user rights"
+msgstr "Modificar direitos de acesso globais de usuário"
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Modificar direitos de acesso globais de usuário."
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr "Modificar metadados do grupo ou removê-lo"
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Modificar os direitos de acesso do grupo %1"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Modificar os direitos de acesso de grupo para a fila %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr "Modificar lista de membros deste grupo"
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr "Modificar sua própria conta RT"
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Modificar as pessoas relacionadas à fila %1"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Modificar as pessoas relacionadas ao tíquete #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Modificar os scrips da fila %1"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Modificar scrips aplicáveis a todas as filas"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Modificar o modelo %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr "Modificar esquemas que se aplicam a todas as filas"
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Modificar o grupo %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr "Modificar os observadores da fila"
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Modificar o usuário %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Modificar o tíquete # %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Modificar o tíquete #%1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr "Modificar tíquetes"
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Modificar os direitos de acesso de usuário para o grupo %1"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Modificar os direitos de acesso de usuário para a fila %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Modificar os observadores para a fila '%1'"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr "ModifyACL"
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr "ModifyOwnMembership"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr "ModifyQueueWatchers"
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr "ModifyScrips"
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr "ModifySelf"
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr "ModifyTemplate"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr "ModifyTicket"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Seg."
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Mais sobre %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr "Descer"
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr "Subir"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Múltiplo"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "O atributo 'Name' deve ser especificado"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Minhas Aprovações"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+msgstr "Minhas aprovações"
+
+#: 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"
+msgstr "Nome"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Nome em uso"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "Precisa de aprovação do administrador do sistema"
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr "Nunca"
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Novo"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Nova Senha"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr "Nova Aprovação Pendente"
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Novos Relacionamentos"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+msgstr "Nova busca"
+
+#: 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 "Novo campo personalizado"
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr "Novo grupo"
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Nova senha"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Notificação de nova senha enviada"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr "Nova fila"
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Nova requisição"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+msgstr "Novos direitos de acesso"
+
+#: 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 "Novo scrip"
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+msgstr "Nova busca"
+
+#: 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 "Novo esquema"
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "O novo tíquete não existe"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr "Novo usuário"
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Novo usuário chamado"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Novos observadores"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Abrir nova janela"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Próximo"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Próxima página"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Apelido"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Apelido"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Não há Campo Personalizado"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Não há Grupo definido"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Não há Fila definida"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Nenhum usuário RT foi encontrado. Favor consultar o administrador do RT.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Não há Modelo"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Não há Tíquete especificado.  Abortando o tíquete "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Não há Tíquete especificado. Abortando modificações no tíquete\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr "Não há ação"
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr "Não há coluna especificada"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Comando não encontrado\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Não há comentário sobre este usuário"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Não há nenhum arquivo anexado"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Não há descrição para %1"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "Não há grupo especificado"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "Não há senha especificada"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "Não há permissão para criar filas"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "Sem permissão para criar tíquetes na fila '%1'"
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "Sem permissão para criar usuários"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "Sem permissão para mostrar o tíquete"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "sem permissão para ver modificar o tíquete"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Não há principal especificado"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Não há principal selecionado."
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Não há fila satisfazendo o critério de busca."
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr "Nenhum direito encontrado"
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Nenhum direito outorgado."
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Não há busca a realizar"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Não há identificador de tíquete especificado"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "Não há tipo de transação especificada"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "Não há usuário ou endereço de email especificado"
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Nenhum usuário satisfazendo o critério de busca foi encontrado."
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Nenhum usuário RT válido foi encontrado. O tratador de CVS do RT está desabilitado. Por favor, consulte o administrador do RT.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr "Nenhum valor enviado a _Set!\\n"
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr "Ninguém"
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr "Campo inexistente?"
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr "Não logado"
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "Não entrou."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Não definido"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Ainda não implementado."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "Ainda não implementado..."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr "Notas"
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "A notificação não pôde ser enviada"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr "Notificar AdminCcs"
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr "Notificar AdminCcs como Comentário"
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr "Notificar Outros Destinatários"
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr "Notificar Outros Destinatários como Comentário"
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr "Notificar Proprietário"
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr "Notificar Proprietário como Comentário"
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "Notificar Proprietários e AdminCcs sobre novos itens pendendo suas aprovações"
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr "Notificar Requisitantes"
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr "Notificar Requisitantes e Ccs"
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "Notificar Requisitantes e Ccs como Comentário"
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "Notificar Requisitantes, Ccs e AdminCcs"
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "Notificar Requisitantes, Ccs e AdminCcs como Comentário"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Nov."
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "Novembro"
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "Objeto não pôde ser criado"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Objeto criado"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Out."
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "Outubro"
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "Em"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr "Sobre Comentário"
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr "Sobre Correspondência"
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr "Sobre Criação"
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr "Sobre Mudança de Propriedade"
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr "Sobre Mudança de Fila"
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr "Sobre Resolução"
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr "Sobre Mudança de Estado"
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr "Sobre Transação"
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Só mostrar aprovações para requisições criadas depois de %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Só mostrar aprovações para requisições criadas antes de %1"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Aberto"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Abrir"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Requisições abertas"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Abrir tíquetes (da listagem) em uma nova janela"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Abrir tíquetes (da listagem) em outra janela"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr "Abrir tíquetes na correspondência"
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Requisitando e ordenando"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Organização"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "Tíquete originador: #%1"
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Após a data, a prioridade tende a"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr "Próprios tíquetes"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr "OwnTicket"
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Proprietário"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr "Proprietário mudou de %1 para %2"
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Proprietário alterado à força de %1 para %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "O proprietário é"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Pager"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "Telefone do Pager"
+
+#: NOT FOUND IN SOURCE
+msgid "Parent"
+msgstr "Pai"
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Pais"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Senha"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Lembrete de Senha"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Senha muito curta"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Senha: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Pessoas"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr "Realizar uma ação definida pelo usuário"
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "Permissão Negada"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr "Grupoas Pessoais"
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Grupos pessoais"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Grupos pessoais:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Telefones"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr ""
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Preferências"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Prefs"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Anterior"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Página anterior"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Pri"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr "Principal %1 não encontrado."
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Prioridade"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "A prioridade inicia em"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr "Privilegiado"
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Estado privilegiado: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Usuários privilegiados"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr "Falso-grupo para uso interno"
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Fila"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Fila %1 não encontrada"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "A fila '%1' não foi encontrada\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr "Seleções de Palavras-chave da Fila"
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Nome da Fila"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "Scrips da Fila"
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "A fila já existe"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "A fila não pôde ser criada"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "A fila não pôde ser carregada"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Fila criada"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr "A fila não foi especificada."
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Fila não encontrada"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Filas"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 para %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 por <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Direitos reservados 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Direitos reservados 1996-2002 Jesse Vincent <jesse\\\\@bestpractical.com>\\\\n"
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "Adiministração do RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "Erro de autenticação no RT."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "Ricocheteio do RT: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "Erro de configuração do RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "Erro crítico no RT.  A mensagem não foi registrada!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "Erro no RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "O RT recebeu email (%1) dele próprio."
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr "O RT recebeu email (%1) de si próprio."
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "Auto-serviço do RT / Tíquetes Fechados"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr "RT por alto"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "O RT não pôde autenticá-lo"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "O RT não pôde encontrar o requisitante através de consulta ao banco de dados externo"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "O RT não pôde encontrar a fila: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "O RT não pôde validar esta assinatura PGP. \\n"
+
+#: html/Elements/PageLayout:26
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "RT para %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "RT para %1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "O RT processou seus comandos"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT tem &copy; Direitos Reservados 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  Ele é distribuído sob a <a href=\"http://www.gnu.org/copyleft/gpl.html\">Versão 2 da Licença Pública Geral GNU (GPL).</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT tem &copy; Direitos Reservados 1996-%1 por Jesse Vincent &lt;jesse@bestpractical.com&gt;.  Ele é distribuído sob a <a href=\\\"http://www.gnu.org/copyleft/gpl.html\\\">Versão 2 da Licença Pública Geral GNU (GPL).</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "O RT crê que esta mensagem seja um ricochete"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "O RT vai processar esta mensagem como se não fosse assinada.\\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 "O modo de comandos por email do RT requer autenticação PGP. Ou você não assinou sua mensagem ou sua assinatura não pôde ser verificada."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Nome real"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "Nome real"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "Referenciado por"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Faz referência a"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr "RefersTo"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Refinar"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Refinar a Busca"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Recarregar esta página a cada %1 minutos."
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Relacionamentos"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Remover AdminCc"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Remover Cc"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Remover Requisitante"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Responder"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr "Responder aos tíquetes"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr "ReplyToTicket"
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Requisitante"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Endereço eletrônico do requisitante"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "Requisitante(s)"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "RequestorAddresses"
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Requisitantes"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "A requisições vencem em"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Restaurar"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Residência"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Resolver"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr "Resolver tíquete #%1 (%2)"
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Resolvido"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Resposta aos requisitantes"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Resultados"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Resultados por página"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Confirmar a Senha"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Direito de acesso %1 não encontrado para %2  %3 referente a %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Direito de Acesso Delegado"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Direito de Acesso Outorgado"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Direito de Acesso Carregado"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Direito de acesso não pôde ser revogado"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Direito de acesso não encontrado"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Direito de acesso não carregado."
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Direito de acesso revogado"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Direitos de Acesso"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "Direitos de acesso não puderam ser outorgados a %1"
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "Direitos de acesso não puderam ser revogados de %1"
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Papéis"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "RootApproval"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Sáb."
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Salvar as Alterações"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Salvar as alterações"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "Scrip #%1"
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Scrip Criado"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Scrip removido"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Scrips"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Scrips para %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Scrips aplicáveis a todas as filas"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Buscar"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Critérios de Busca"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr "Buscar por aprovações"
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Segurança:"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr "SeeQueue"
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Selecionar um grupo"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Selecionar uma fila"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Selecionar um usuário"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr "Selecionar um campo personalizado"
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr "Selecionar um grupo"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr "Selecionar múltiplos valores"
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr "Selecionar um valor"
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+msgstr "Selecionar uma fila"
+
+#: 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 "Selecionar um scrip"
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr "Selecionar um esquema"
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr "Selecionar um usuário"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr "SelectMultiple"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr "SelectSingle"
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Auto-serviço"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr "Enviar mensagem a todos os observadores"
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "Enviar mensagem a todos os observadores como um \"comentário\""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr "Enviar mensagem aos requisitantes e Ccs"
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "Enviar mensagem aos requisitantes e Ccs como um comentário"
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr "Envia uma mensagem aos requisitantes"
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "Envia uma mensagem aos Ccs e Bccs explicitamente listados"
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr "Envia uma mensagem aos Ccs administrativos"
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "Envia uma mensagem aos Ccs administrativos como um comentário"
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr "Envia uma mensagem ao proprietário"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "Set."
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr "Setembro"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "Mostrar os Resultados"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show approved requests"
+msgstr "Mostrar requisições aprovadas"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Mostrar o sumário"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Mostrar requisições negadas"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Mostrar os detalhes"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Mostrar requisições pendentes"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr "Mostrar requisições aguardando outras aprovações"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr "Mostrar comentário privado do tíquete"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr "Mostrar sumários do tíquete"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr "ShowACL"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr "ShowScrips"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr "ShowTemplate"
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr "ShowTicket"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr "ShowTicketComments"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "Cadastrar como um Requisitante de tíquete ou um Cc de tíquete ou fila"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr "Cadastrar como um AdminCC de tíquete ou fila"
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Assinatura"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr "Assinado como %1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Único"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr "Saltar Menu"
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Chave de ordenação"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Ordenar os resultados por"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "Ordenação"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Pendente"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Página inicial"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Iniciado"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "A data de iníciado '%1' não pôde ser compreendida"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Inicia"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Inicia Por"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "A data de início '%1' não pôde ser compreendida"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Estado"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Estado"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr "Mudança de Estado"
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "Estado alterado de %1 para %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "StatusChange"
+
+#: html/Ticket/Elements/Tabs:147
+msgid "Steal"
+msgstr "Roubar"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Roubado de %1 "
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Assunto"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "Assunto modou para %1"
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Enviar"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "Enviar Workflow"
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr "Deu certo"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Dom."
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr "SuperUser"
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+msgstr "Sistema"
+
+#: 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 "Erro do Sistema"
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. Right not granted."
+msgstr "Erro de sistema.  Direito não outorgado."
+
+#: NOT FOUND IN SOURCE
+msgid "System Error. right not granted"
+msgstr "Erro de sistema.  direito não outorgado"
+
+#: lib/RT/ACE_Overlay.pm:616
+msgid "System error. Right not delegated."
+msgstr "Erro do sistema. Direito de acesso não delegado."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+msgid "System error. Right not granted."
+msgstr "Erro do sistema. Direito de acesso não outorgado."
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "Erro de sistema.  Não posso outorgar direitos de acesso."
+
+#: html/Admin/Global/GroupRights.html:35 html/Admin/Groups/GroupRights.html:37 html/Admin/Queues/GroupRights.html:36
+msgid "System groups"
+msgstr "Grupos do sistema"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "SystemRolegroup para uso interno"
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Tomar"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Tomado"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Modelo"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "Esquema #%1"
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr "Esquema removido"
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Modelo não encontrado"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Modelo não encontrado\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Modelo processado"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Modelos"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Modelos de %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr "Este já é o valor atual"
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Este não é um valor para este campo personalizado"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Este é o mesmo valor"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Este principal já é um %1 para esta fila"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Este principal já é um %1 para este tíquete"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Este principal não é um %1 para esta fila"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Este principal não é um %1 para este tíquete"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Esta fila não existe"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Este tíquete tem dependências não resolvidas"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Este usuário já tem este direito de acesso"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Este usuário já possui este tíquete"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Este usuário não existe"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Este usuário já tem privilégios"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Este usuário já não tem privilégios"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Este usuário agora tem privilégios"
+
+#: lib/RT/User_Overlay.pm:344
+msgid "That user is now unprivileged"
+msgstr "Este usuário agora não tem privilégios"
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr "Este usuário agora é não privilegiado"
+
+#: lib/RT/Ticket_Overlay.pm:2944
+msgid "That user may not own tickets in that queue"
+msgstr "Este usuário não pode possuir tíquetes nesta fila"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Este não é um identificador numérico"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Sumário"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr "O CC de um tíquete"
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr "O CC administrativo de um tíquete"
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "O comentário foi registrado"
+
+#: bin/rt-crontool:198
+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 "O seguinte comando procurará por todos os tíquetes ativos na fila 'geral' e alterar sua prioridade para 99 se eles não tiverem sido alterados em 4 horas:"
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Os seguintes comandos não foram processados:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr "O novo valor foi atribuído."
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr "O proprietário de um tíquete"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr "O requisitante de um tíquete"
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Estes comandos geralmente não estão visíveis para o usuário"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Este tíquete %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Esta ferramenta permite o usuário invocar módulos Perl arbitrários de dentro do RT."
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Parece que esta transação não tem conteúdo"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "Os %1 tíquetes mais prioritários deste usuário"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "Os 25 tíquetes de mais alta prioridade deste usuário"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "Qui."
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket"
+msgstr "Tíquete"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1  %2"
+msgstr "Tíquete # %1  %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket # %1 Jumbo update: %2"
+msgstr "Tíquete # %1 atualização jumbo: %2"
+
+#: html/Ticket/ModifyAll.html:25 html/Ticket/ModifyAll.html:29
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "Tíquete #%1 Atualização jumbo: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "Tíquete #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Tíquete %1 criado na fila '%2'"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Tíquete %1 carregado\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Tíquete %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "Histórico do Tíquete # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Identificador do tíquete"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr "Tíquete Resolvido"
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Arquivo anexo do tíquete"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Conteúdo do tíquete"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+msgstr "Tipo do conteúdo do tíquete"
+
+#: lib/RT/Ticket_Overlay.pm:495 lib/RT/Ticket_Overlay.pm:597
+msgid "Ticket could not be created due to an internal error"
+msgstr "O tíquete não pôde ser criado devido a um erro interno"
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Tíquete criado"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "A criação do tíquete falhou"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Tíquete removido"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+msgid "Ticket id not found"
+msgstr "Id de tíquete não encontrado"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket killed"
+msgstr "Tíquete destruído"
+
+#: html/REST/1.0/modify:36 html/REST/1.0/update:41
+msgid "Ticket not found"
+msgstr "Tíquete não encontrado"
+
+#: etc/initialdata:289
+msgid "Ticket status changed"
+msgstr "O estado do tíquete mudou"
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Observadores do tíquete"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr "Tíquetes"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "Tíquetes %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "Tíquetes %1 por %2"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Tíquetes de %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "Tíquetes dependentes desta aprovação:"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Tempo Restante"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "Tempo Trabalhado"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Tempo restante"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Tempo de apresentação"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "Tempo trabalhado"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "TimeLeft"
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr "TimeWorked"
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Para gerar as diferenças desta transação"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "Para gerar as diferenças desta transação:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Última atualização"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr "Transação"
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Transação %1 removida"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Transação Criada"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "Transaction->Create não pôde, já que você não especificou um id de tíquete"
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Transações são imutáveis"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Tentando remover um direito de acesso: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Ter."
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Tipo"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Não implementado"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Usuário Unix"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "Usuário Unix"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Codificação de conteúdo desconhecida %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Ilimitado"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr "Não privilegiado"
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "Não tomado"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Atualizar"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Identificador de atualização"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Tipo de atualização"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Atualizar todos estes tíquetes de uma vez"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Atualizar email"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Atualizar nome"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Atualização não registrada."
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Atualizar os tíquetes selecionados"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Atualizar assinatura"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Atualizar o tíquete"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Atualizar o tíquete # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Atualizar o tíquete #%1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "Atualizar tíquete #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "O tipo da atualização não foi nem correspondência e nem comentário."
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Atualizado"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Usuário %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Usuário %1 Senha: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Usuário '%1' não encontrado"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Usuário '%1' não encontrado\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr "Definido pelo Usuário"
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "Identificador de usuário"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Identificador do usuário"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Direitos de Acesso de Usuário"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "O usuário não pôde ser criado: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Usuário criado"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Grupos definidos pelo usuário"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Usuário notificado"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Visualização de usuário"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Nome de usuário"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Usuários"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Usuários que satisfazem o critério de busca"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "Valor da fila"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Valores"
+
+#: NOT FOUND IN SOURCE
+msgid "VrijevormEnkele"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr "Observar"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr "WatchAsAdminCc"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "Observador carregado"
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Observadores"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "Codificação de Web"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Qua."
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr "Quando um tíquete for aprovado por todos os aprovadores, adicione uma correspondência ao tíquete original"
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "Quando um tíquete for aprovado por qualquer aprovador, adicione uma correspondência ao tíquete original"
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr "Quando um tíquete é criado"
+
+#: 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 "Quando um tíquete de aprovação é criado, notificar o Proprietário e o AdminCc do item aguardando sua aprovação"
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr "Quando acontecer qualquer coisa"
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "Sempre que um tíquete for resolvido"
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "Sempre que mudar o proprietário de um tíquete"
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "Sempre que um tíquete mudar de fila"
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "Sempre que o estado de um tíquete mudar"
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "Sempre que ocorrer uma condição definida por usuário"
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "Sempre que um novo comentário é adicionado"
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr "Sempre que uma nova correspondência é adicionada"
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Trabalho"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "Telefone de trabalho"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "Trabalhado"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "Você já é proprietário deste tíquete"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "Você não é um usuário autorizado"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Você só pode reatribuir seus próprios tíquetes ou aqueles que não têm dono"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "Você não tem permissão para ver este tíquete.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "Você encontrou %1 tíquetes na fila %2"
+
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "Você foi desconectado do RT."
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "Você não tem permissão para criar tíquetes nesta fila."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "Você não pode criar requisições nesta fila."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "Volte sempre"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Suas %1 requisições"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+msgstr "Seu administrador do RT configurou erradamente os endereços eletrônicos que invocam o 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 "Sua requisição foi aprovada por %1.  Outras aprovações ainda podem estar pendentes."
+
+#: etc/initialdata:463 etc/upgrade/2.1.71:180
+msgid "Your request has been approved."
+msgstr "Sua requisição foi aprovada."
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "Sua requisição foi rejeitada"
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr "Sua requisição foi rejeitada."
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Nome de usuário ou senha incorretos"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+msgid "Zip"
+msgstr "CEP"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr "[sem assunto]"
+
+#: html/User/Elements/DelegateRights:59
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "como outorgado a %1"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "contém"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "content"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "content-type"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "correspondência (provavelmente) não enviada"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "correspondência enviada"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "dias"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "morto"
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "remover"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "removido"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "não satisfaz"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "não contém"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "igual a"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr "falso"
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "filename"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "maior que"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "grupo '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "horas"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "identificador"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "é"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "não é"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "menor que"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "satisfaz"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "min"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "minutos"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "modificações\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "meses"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "novo"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr "sem valor"
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "nenhum"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "diferente de"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr "diferente"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "aberto"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "grupo pessoal '%1' para o usuário '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "fila %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "rejeitado"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "resolvido"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "seg"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "pendente"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "sistema %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "grupo do sistema '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "o componente chamador não especificou por que"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "tíquete #%1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr "verdadeiro"
+
+#: lib/RT/Group_Overlay.pm:216
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "grupo %1 não descrito"
+
+#: NOT FOUND IN SOURCE
+msgid "undescripbed group %1"
+msgstr "grupo sem descrição %1"
+
+#: lib/RT/Group_Overlay.pm:191
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "usuário %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "semanas"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "com modelo %1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "anos"
+
+#: NOT FOUND IN SOURCE
+msgid "ニックネーム"
+msgstr ""
+
diff --git a/rt/lib/RT/I18N/ru.po b/rt/lib/RT/I18N/ru.po
new file mode 100644 (file)
index 0000000..eb14346
--- /dev/null
@@ -0,0 +1,4826 @@
+msgid ""
+msgstr ""
+"Last-Translator: Kirill Pushkin <kirill@mns.ru>\n"
+"PO-Revision-Date: 2002-10-04 19:28+0400\n"
+"Language-Team: Russian <ru@li.org>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.6\n"
+
+#: html/Elements/MyRequests:28 html/Elements/MyTickets:28
+msgid "#"
+msgstr "&#8470;"
+
+#: html/Admin/Queues/Scrip.html:55
+#. ($QueueObj->id)
+msgid "#%1"
+msgstr ""
+
+#: html/Approvals/Elements/ShowDependency:50 html/Ticket/Display.html:26 html/Ticket/Display.html:30
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr ""
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr ""
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+msgid "%1 %2 %3 %4:%5:%6 %7"
+msgstr "%1 %2 %3 %4:%5:%6 %7"
+
+#: lib/RT/Ticket_Overlay.pm:3438 lib/RT/Transaction_Overlay.pm:559 lib/RT/Transaction_Overlay.pm:601
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr ""
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "%1 %2 назад"
+
+#: lib/RT/Ticket_Overlay.pm:3444 lib/RT/Transaction_Overlay.pm:566
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+msgid "%1 %2 changed to %3"
+msgstr "%1 %2 изменено на %3"
+
+#: lib/RT/Ticket_Overlay.pm:3441 lib/RT/Transaction_Overlay.pm:562 lib/RT/Transaction_Overlay.pm:607
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+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"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 этот тикет\\n"
+
+#: html/Search/Listing.html:57
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr ""
+
+#: bin/rt-crontool:169 bin/rt-crontool:176 bin/rt-crontool:182
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr ""
+
+#: bin/rt-crontool:185
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr ""
+
+#: bin/rt-crontool:179
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:173
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr ""
+
+#: bin/rt-crontool:166
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:122
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "%1 скрипт загружен"
+
+#: lib/RT/Ticket_Overlay.pm:3471
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "%1 добавлено как значение для %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "%1 алиасы требуют идентификатор тикета для продолжения работы"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "%1 алиасы требуют идентификатор тикета для продолжения работы "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "%1 алиасы требуют идентификатор тикета для продолжения работы над (от %2) %3"
+
+#: lib/RT/Link_Overlay.pm:117 lib/RT/Link_Overlay.pm:124
+#. ($args{'Base'})
+#. ($args{'Target'})
+msgid "%1 appears to be a local object, but can't be found in the database"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:483
+#. ($self->BriefDescription , $self->CreatorObj->Name)
+#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name)
+msgid "%1 by %2"
+msgstr "%1 пользователем %2"
+
+#: lib/RT/Transaction_Overlay.pm:537 lib/RT/Transaction_Overlay.pm:626 lib/RT/Transaction_Overlay.pm:635 lib/RT/Transaction_Overlay.pm:638
+#. ($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)
+msgid "%1 changed from %2 to %3"
+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 ""
+
+#: lib/RT/Ticket_Overlay.pm:2813
+#. ($self)
+msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent."
+msgstr "%1 не могу закрыть тикет. Возможно, база данных RT испорчена."
+
+#: html/Elements/MyTickets:25
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr ""
+
+#: html/Elements/MyRequests:25
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr ""
+
+#: bin/rt-crontool:161
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 больше не является %2 для этой очереди."
+
+#: lib/RT/Ticket_Overlay.pm:1570
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 больше не является %2 для этого тикета."
+
+#: lib/RT/Ticket_Overlay.pm:3527
+#. ($args{'Value'}, $cf->Name)
+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"
+msgstr "%1 мин"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "%1 не отображается"
+
+#: html/User/Elements/DelegateRights:76
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 успешно произведено\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "%1 тип не известен для $MessageId"
+
+#: NOT FOUND IN SOURCE
+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."
+msgstr "%1 закроет все тикеты, входящие в групповой запрос"
+
+#: NOT FOUND IN SOURCE
+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:435
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1: без вложений"
+
+#: html/Ticket/Elements/ShowTransaction:102
+#. ($size)
+msgid "%1b"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:99
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1140
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' является неверным значением статуса"
+
+#: NOT FOUND IN SOURCE
+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 "(Введите номера или ссылки на тикеты. Несколько тикетов разделяются пробелами.)"
+
+#: html/Admin/Queues/Modify.html:54 html/Admin/Queues/Modify.html:60
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:33 html/Admin/Elements/ListGlobalCustomFields:32
+msgid "(No custom fields)"
+msgstr ""
+
+#: html/Admin/Groups/Members.html:50 html/User/Groups/Members.html:53
+msgid "(No members)"
+msgstr "(Нет пользователей)"
+
+#: html/Admin/Elements/EditScrips:32 html/Admin/Elements/ListGlobalScrips:32
+msgid "(No scrips)"
+msgstr "(Нет скриптов)"
+
+#: html/Admin/Elements/EditTemplates:31
+msgid "(No templates)"
+msgstr ""
+
+#: html/Ticket/Update.html:85
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(На эти адреса [разделенные запятой] отправляются копии сообщения. Список этих адресатов в письме не виден. Адреса <b>не</b> сохраняются для последующих уведомлений.)"
+
+#: html/Ticket/Create.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Ticket/Update.html:81
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(На эти адреса [разделенные запятой] отправляются копии сообщения. Адреса не сохраняются для последующих уведомлений.)"
+
+#: html/Ticket/Create.html:69
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr ""
+
+#: html/Admin/Groups/index.html:33 html/User/Groups/index.html:33
+msgid "(empty)"
+msgstr "(пусто)"
+
+#: html/Admin/Users/index.html:39
+msgid "(no name listed)"
+msgstr ""
+
+#: html/Elements/MyRequests:43 html/Elements/MyTickets:45
+msgid "(no subject)"
+msgstr "(без темы)"
+
+#: html/Admin/Elements/SelectRights:48 html/Elements/SelectCustomFieldValue:30 html/Ticket/Elements/EditCustomField:59 html/Ticket/Elements/ShowCustomFields:36 lib/RT/Transaction_Overlay.pm:536
+msgid "(no value)"
+msgstr "(нет значения)"
+
+#: html/Ticket/Elements/EditLinks:116
+msgid "(only one ticket)"
+msgstr "(только один тикет)"
+
+#: html/Elements/MyRequests:52 html/Elements/MyTickets:55
+msgid "(pending approval)"
+msgstr ""
+
+#: html/Elements/MyRequests:54 html/Elements/MyTickets:57
+msgid "(pending other tickets)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "(requestor's group)"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:50
+msgid "(required)"
+msgstr "(требуется)"
+
+#: html/Ticket/Elements/ShowTransaction:105
+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 самых важных моих запросов..."
+
+#: html/Ticket/Elements/ShowBasics:32
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:27
+msgid "<% $_ %>"
+msgstr ""
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:26
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"Создать тикет в очереди\">&nbsp;%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 ""
+
+#: lib/RT/ACE_Overlay.pm:157 lib/RT/Principal_Overlay.pm:181
+msgid "ACE not found"
+msgstr "ACE не найден"
+
+#: lib/RT/ACE_Overlay.pm:831
+msgid "ACEs can only be created and deleted."
+msgstr "ACEы можно только создавать и удалять"
+
+#: bin/rt-commit-handler:755
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "Прекращаем работу во избежание нежелательного изменения тикета.\\n"
+
+#: html/User/Elements/Tabs:32
+msgid "About me"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:80
+msgid "Access control"
+msgstr "Права доступа"
+
+#: html/Admin/Elements/EditScrip:57
+msgid "Action"
+msgstr "Действие"
+
+#: lib/RT/Scrip_Overlay.pm:147
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr ""
+
+#: bin/rt-crontool:123
+msgid "Action committed."
+msgstr "Действие принято."
+
+#: bin/rt-crontool:119
+msgid "Action prepared..."
+msgstr "Действие подготовлено..."
+
+#: html/Search/Bulk.html:92
+msgid "Add AdminCc"
+msgstr "Добавить административную копию"
+
+#: html/Search/Bulk.html:90
+msgid "Add Cc"
+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 ""
+
+#: 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"
+msgstr "Добавить скрипт, который будет действовать на все очереди"
+
+#: html/Search/Bulk.html:118
+msgid "Add comments or replies to selected tickets"
+msgstr "Добавить комментарии или ответы на выбранные тикеты"
+
+#: html/Admin/Groups/Members.html:42 html/User/Groups/Members.html:39
+msgid "Add members"
+msgstr "Добавить пользователей"
+
+#: html/Admin/Queues/People.html:66 html/Ticket/Elements/AddWatchers:28
+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"
+msgstr "Добавить пользователя как %1 для этой очереди"
+
+#: lib/RT/Ticket_Overlay.pm:1454
+#. ($self->loc($args{'Type'}))
+msgid "Added principal as a %1 for this ticket"
+msgstr "Добавить пользователя как %1 для этого тикета"
+
+#: html/Admin/Elements/ModifyUser:76 html/Admin/Users/Modify.html:122 html/User/Prefs.html:88
+msgid "Address1"
+msgstr "Адрес1"
+
+#: html/Admin/Elements/ModifyUser:78 html/Admin/Users/Modify.html:127 html/User/Prefs.html:90
+msgid "Address2"
+msgstr "Адрес2"
+
+#: html/Ticket/Create.html:74
+msgid "Admin Cc"
+msgstr "Административная копия"
+
+#: etc/initialdata:274
+msgid "Admin Comment"
+msgstr ""
+
+#: etc/initialdata:256
+msgid "Admin Correspondence"
+msgstr ""
+
+#: html/Admin/Queues/index.html:25 html/Admin/Queues/index.html:28
+msgid "Admin queues"
+msgstr "Управление очередями"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "Управление пользователями"
+
+#: html/Admin/Global/index.html:26 html/Admin/Global/index.html:28
+msgid "Admin/Global configuration"
+msgstr "Общие настройки"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "Группы"
+
+#: html/Admin/Queues/Modify.html:25 html/Admin/Queues/Modify.html:29
+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 ""
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "AdminGroup"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "AdminGroupMembership"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "AdminOwnPersonalGroups"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "AdminQueue"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "AdminUsers"
+msgstr ""
+
+#: html/Admin/Queues/People.html:48 html/Ticket/Elements/EditPeople:54
+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 ""
+
+#: 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 ""
+
+#: html/Approvals/Display.html:46 html/Approvals/Elements/Approve:27 html/Approvals/Elements/ShowDependency:42 html/Approvals/index.html:65
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "Виза #%1: %2"
+
+#: html/Approvals/index.html:54
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "Виза #%1: Примечания не сохранены из-за ошибки системы"
+
+#: html/Approvals/index.html:52
+#. ($ticket->Id)
+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 "Завизировать"
+
+#: etc/initialdata:431 etc/upgrade/2.1.71:148
+msgid "Approver's notes: %1"
+msgstr ""
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "Апр."
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Ascending"
+msgstr "В порядке возрастания"
+
+#: html/Search/Bulk.html:127 html/SelfService/Update.html:36 html/Ticket/ModifyAll.html:83 html/Ticket/Update.html:100
+msgid "Attach"
+msgstr "Вложение"
+
+#: html/SelfService/Create.html:67 html/Ticket/Create.html:110
+msgid "Attach file"
+msgstr "Вложить файл"
+
+#: html/Ticket/Create.html:98 html/Ticket/Update.html:89
+msgid "Attached file"
+msgstr ""
+
+#: html/SelfService/Attachment/dhandler:36
+msgid "Attachment '%1' could not be loaded"
+msgstr "Вложение '%1' не может быть загружено"
+
+#: lib/RT/Transaction_Overlay.pm:443
+msgid "Attachment created"
+msgstr "Создано вложение"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "Имя файла"
+
+#: html/Ticket/Elements/ShowAttachments:26
+msgid "Attachments"
+msgstr "Вложения"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "Авг."
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:66
+msgid "AuthSystem"
+msgstr "Тип регистрации"
+
+#: etc/initialdata:206
+msgid "Autoreply"
+msgstr ""
+
+#: etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "Неправильная подпись PGP: %1\\n"
+
+#: html/SelfService/Attachment/dhandler:40
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "Неверный идентификатор вложения. Отсутствует вложение '%1'\\n"
+
+#: bin/rt-commit-handler:827
+#. ($val)
+msgid "Bad data in %1"
+msgstr "Неправильная дата в %1"
+
+#: html/SelfService/Attachment/dhandler:43
+#. ($trans, $AttachmentObj->TransactionId())
+msgid "Bad transaction number for attachment. %1 should be %2\\n"
+msgstr "Неправильный номер транзакции для вложения. %1 должен быть %2\\n"
+
+#: html/Admin/Elements/GroupTabs:39 html/Admin/Elements/QueueTabs:39 html/Admin/Elements/UserTabs:38 html/Ticket/Elements/Tabs:90 html/User/Elements/GroupTabs:38
+msgid "Basics"
+msgstr "Главное"
+
+#: html/Ticket/Update.html:83
+msgid "Bcc"
+msgstr "Скрытая копия"
+
+#: html/Admin/Elements/EditScrip:88 html/Admin/Global/GroupRights.html:85 html/Admin/Global/Template.html:46 html/Admin/Global/UserRights.html:54 html/Admin/Groups/GroupRights.html:73 html/Admin/Groups/Members.html:81 html/Admin/Groups/Modify.html:56 html/Admin/Groups/UserRights.html:55 html/Admin/Queues/GroupRights.html:85 html/Admin/Queues/Template.html:45 html/Admin/Queues/UserRights.html:54 html/User/Groups/Modify.html:56
+msgid "Be sure to save your changes"
+msgstr "Не забудьте сохранить настройки"
+
+#: html/Elements/SelectDateRelation:34 lib/RT/CurrentUser.pm:322
+msgid "Before"
+msgstr "До"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin Approval"
+msgstr ""
+
+#: etc/initialdata:202
+msgid "Blank"
+msgstr ""
+
+#: html/Search/Listing.html:79
+msgid "Bookmarkable URL for this search"
+msgstr "Получить URL для этого поиска"
+
+#: html/Ticket/Elements/ShowHistory:39 html/Ticket/Elements/ShowHistory:45
+msgid "Brief headers"
+msgstr "Сокращенный"
+
+#: html/Search/Bulk.html:25 html/Search/Bulk.html:26
+msgid "Bulk ticket update"
+msgstr "Изменение одним махом"
+
+#: lib/RT/User_Overlay.pm:1331
+msgid "Can not modify system users"
+msgstr "Не могу изменять системных пользователей"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Can this principal see this queue"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:144
+msgid "Can't add a custom field value without a name"
+msgstr "Не могу добавить значение поля без имени"
+
+#: lib/RT/Link_Overlay.pm:132
+msgid "Can't link a ticket to itself"
+msgstr "Тикет не может быть связан с самим собой"
+
+#: lib/RT/Ticket_Overlay.pm:2787
+msgid "Can't merge into a merged ticket. You should never get this error"
+msgstr "Не могу соединить с объединенным тикетом (эта ошибка никогда не должна происходить)."
+
+#: lib/RT/Ticket_Overlay.pm:2605 lib/RT/Ticket_Overlay.pm:2674
+msgid "Can't specifiy both base and target"
+msgstr "Не могу указать одновременно и источник, и адрес назначения"
+
+#: html/autohandler:112
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "Не могу создать пользователя: %1"
+
+#: etc/initialdata:50 html/Admin/Queues/People.html:44 html/SelfService/Create.html:51 html/SelfService/Display.html:50 html/Ticket/Create.html:64 html/Ticket/Elements/EditPeople:51 html/Ticket/Elements/ShowPeople:35 html/Ticket/Update.html:45 html/Ticket/Update.html:78 lib/RT/ACE_Overlay.pm:88
+msgid "Cc"
+msgstr "Копия"
+
+#: html/SelfService/Prefs.html:31
+msgid "Change password"
+msgstr "Сменить пароль"
+
+#: html/Ticket/Create.html:101 html/Ticket/Update.html:92
+msgid "Check box to delete"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:31
+msgid "Check box to revoke right"
+msgstr "Выберите права, которые хотите отозвать"
+
+#: html/Ticket/Create.html:183 html/Ticket/Elements/EditLinks:131 html/Ticket/Elements/EditLinks:69 html/Ticket/Elements/ShowLinks:51
+msgid "Children"
+msgstr "Потомки"
+
+#: html/Admin/Elements/ModifyUser:80 html/Admin/Users/Modify.html:132 html/User/Prefs.html:92
+msgid "City"
+msgstr "Город"
+
+#: html/Ticket/Elements/ShowDates:47
+msgid "Closed"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:60
+msgid "Closed requests"
+msgstr "Закрытые запросы"
+
+#: NOT FOUND IN SOURCE
+msgid "Code"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Command not understood!\\n"
+msgstr "Чего-чего?\\n"
+
+#: html/Ticket/Elements/ShowTransaction:179 html/Ticket/Elements/Tabs:153
+msgid "Comment"
+msgstr "Комментировать"
+
+#: html/Admin/Elements/ModifyQueue:45 html/Admin/Queues/Modify.html:58
+msgid "Comment Address"
+msgstr "Адрес для комментариев"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "Комментарий не записан"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Comment on tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "CommentOnTicket"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:35
+msgid "Comments"
+msgstr "Комментарии"
+
+#: html/Ticket/ModifyAll.html:70 html/Ticket/Update.html:70
+msgid "Comments (Not sent to requestors)"
+msgstr "Комментарии (Не отправляются просителям)"
+
+#: html/Search/Bulk.html:122
+msgid "Comments (not sent to requestors)"
+msgstr "Комментарии (не отправляются просителю)"
+
+#: html/Elements/ViewUser:27
+#. ($name)
+msgid "Comments about %1"
+msgstr "Информация о %1"
+
+#: html/Admin/Users/Modify.html:185 html/Ticket/Elements/ShowRequestor:44
+msgid "Comments about this user"
+msgstr "Дополнительная информация об этом пользователе"
+
+#: lib/RT/Transaction_Overlay.pm:545
+msgid "Comments added"
+msgstr "Добавлены комментарии"
+
+#: lib/RT/Action/Generic.pm:140
+msgid "Commit Stubbed"
+msgstr "Действие не реализовано"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "Применить ограничения"
+
+#: html/Admin/Elements/EditScrip:41
+msgid "Condition"
+msgstr "Условие"
+
+#: bin/rt-crontool:109
+msgid "Condition matches..."
+msgstr "Подходящее условие..."
+
+#: lib/RT/Scrip_Overlay.pm:160
+msgid "Condition not found"
+msgstr "Условие не найдено"
+
+#: html/Elements/Tabs:52
+msgid "Configuration"
+msgstr "Настройка"
+
+#: html/SelfService/Prefs.html:33
+msgid "Confirm"
+msgstr "Подтвердить"
+
+#: html/Admin/Elements/ModifyUser:60
+msgid "ContactInfoSystem"
+msgstr "Контактная информация"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "Не могу разобрать дату последнего контакта '%1'"
+
+#: html/Admin/Elements/ModifyTemplate:44 html/Ticket/ModifyAll.html:87
+msgid "Content"
+msgstr "Текст"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr ""
+
+#: etc/initialdata:266
+msgid "Correspondence"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:39 html/Admin/Queues/Modify.html:51
+msgid "Correspondence Address"
+msgstr "Адрес для сообщений"
+
+#: lib/RT/Transaction_Overlay.pm:541
+msgid "Correspondence added"
+msgstr "Добавлено сообщение"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "Сообщение не записано"
+
+#: lib/RT/Ticket_Overlay.pm:3458
+msgid "Could not add new custom field value for ticket. "
+msgstr "Не могу добавить новое поле с таким значением."
+
+#: NOT FOUND IN SOURCE
+msgid "Could not add new custom field value for ticket. %1 "
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2963 lib/RT/Ticket_Overlay.pm:2971 lib/RT/Ticket_Overlay.pm:2987
+msgid "Could not change owner. "
+msgstr "Не могу сменить владельца. "
+
+#: html/Admin/Elements/EditCustomField:68 html/Admin/Elements/EditCustomFields:166
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "Не могу добавить поле"
+
+#: html/User/Groups/Modify.html:77 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481
+msgid "Could not create group"
+msgstr "Не могу создать группу"
+
+#: html/Admin/Global/Template.html:75 html/Admin/Queues/Template.html:72
+#. ($msg)
+msgid "Could not create template: %1"
+msgstr "Не могу создать шаблон: %1"
+
+#: lib/RT/Ticket_Overlay.pm:1073 lib/RT/Ticket_Overlay.pm:333
+msgid "Could not create ticket. Queue not set"
+msgstr "Не могу создать тикет. Очередь не определена."
+
+#: lib/RT/User_Overlay.pm:208 lib/RT/User_Overlay.pm:220 lib/RT/User_Overlay.pm:238 lib/RT/User_Overlay.pm:414
+msgid "Could not create user"
+msgstr "Не могу создать пользователя"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "Не могу найти тикет по идентификатору %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "Не найдена группа %1."
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1422
+msgid "Could not find or create that user"
+msgstr "Не могу найти или создать этого пользователя"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1501
+msgid "Could not find that principal"
+msgstr "Не могу найти этого пользователя"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find user %1."
+msgstr "Не найден пользователь %1."
+
+#: html/Admin/Groups/Members.html:88 html/User/Groups/Members.html:90 html/User/Groups/Modify.html:82
+msgid "Could not load group"
+msgstr "Не могу загрузить группу"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "Не могу назначить этого пользователя %1 для этой очереди"
+
+#: lib/RT/Ticket_Overlay.pm:1443
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "Не могу назначить этого пользователя %1 для этого тикета"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "Не могу отобрать функции у пользователя как %1 в этой очереди"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "Не могу отобрать функции у пользователя как %1 для этого тикета"
+
+#: lib/RT/Group_Overlay.pm:985
+msgid "Couldn't add member to group"
+msgstr "Не могу добавить пользователя в группу"
+
+#: lib/RT/Ticket_Overlay.pm:3468 lib/RT/Ticket_Overlay.pm:3524
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "Не могу создать транзакцию: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "Не пойму что делать из ответа gpg\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "Не найти группу\\n"
+
+#: lib/RT/Interface/Web.pm:866
+msgid "Couldn't find row"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:959
+msgid "Couldn't find that principal"
+msgstr "Не найти этого пользователя"
+
+#: lib/RT/CustomField_Overlay.pm:175
+msgid "Couldn't find that value"
+msgstr "Не найти этого значения"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "Пользователь не найден\\n"
+
+#: lib/RT/CurrentUser.pm:112
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "Не загрузить %1 из базы пользователей.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "Не загрузить файл настроек RT '%1' %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load Scrips."
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:88 html/Admin/Groups/UserRights.html:75
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "Не загрузить группу %1"
+
+#: lib/RT/Link_Overlay.pm:175 lib/RT/Link_Overlay.pm:184 lib/RT/Link_Overlay.pm:211
+msgid "Couldn't load link"
+msgstr "Не загрузить ссылку"
+
+#: html/Admin/Elements/EditCustomFields:147 html/Admin/Queues/People.html:121
+#. ($id)
+msgid "Couldn't load queue"
+msgstr "Не загрузить очередь"
+
+#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:72
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "Не загрузить очередь %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "Не загрузить скрипт"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "Не загрузить шаблон"
+
+#: html/Admin/Users/Prefs.html:79
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "Не загрузить этого пользователя (%1)"
+
+#: html/SelfService/Display.html:166
+#. ($id)
+msgid "Couldn't load ticket '%1'"
+msgstr "Не загрузить тикет '%1'"
+
+#: html/Admin/Elements/ModifyUser:86 html/Admin/Users/Modify.html:149 html/User/Prefs.html:98
+msgid "Country"
+msgstr "Страна"
+
+#: html/Admin/Elements/CreateUserCalled:26 html/Ticket/Create.html:135 html/Ticket/Create.html:195
+msgid "Create"
+msgstr "Создать"
+
+#: etc/initialdata:128
+msgid "Create Tickets"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomField:58
+msgid "Create a CustomField"
+msgstr "Добавить поле"
+
+#: html/Admin/Queues/CustomField.html:48
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:48
+msgid "Create a CustomField which applies to all queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "Добавить новое поле"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:67 html/Admin/Groups/Modify.html:93
+msgid "Create a new group"
+msgstr "Добавить новую группу"
+
+#: html/User/Groups/Modify.html:67 html/User/Groups/Modify.html:92
+msgid "Create a new personal group"
+msgstr "Добавить новую личную группу"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "Добавить новую очередь"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "Добавить новый скрипт"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "Добавить новый шаблон"
+
+#: html/SelfService/Create.html:30 html/Ticket/Create.html:25 html/Ticket/Create.html:28 html/Ticket/Create.html:36
+msgid "Create a new ticket"
+msgstr "Добавить новый тикет"
+
+#: html/Admin/Users/Modify.html:214 html/Admin/Users/Modify.html:241
+msgid "Create a new user"
+msgstr "Добавить нового пользователя"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "Создать очередь"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "Создать очередь с именем"
+
+#: html/SelfService/Create.html:25 html/SelfService/Create.html:27
+msgid "Create a request"
+msgstr "Создать запрос"
+
+#: html/Admin/Queues/Scrip.html:59
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "Создать скрипт для очереди %1"
+
+#: html/Admin/Global/Template.html:69 html/Admin/Queues/Template.html:65
+msgid "Create a template"
+msgstr "Создать запрос"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr ""
+
+#: etc/initialdata:130
+msgid "Create new tickets based on this scrip's template"
+msgstr ""
+
+#: html/SelfService/Create.html:81
+msgid "Create ticket"
+msgstr "Создать тикет"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Create tickets in this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Create, delete and modify custom fields"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Create, delete and modify queues"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify the members of personal groups"
+msgstr ""
+
+#: lib/RT/System.pm:60
+msgid "Create, delete and modify users"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "CreateTicket"
+msgstr ""
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1167
+msgid "Created"
+msgstr "Создан"
+
+#: html/Admin/Elements/EditCustomField:71
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "Добавлено поле %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "Создан шаблон %1"
+
+#: html/Ticket/Elements/EditLinks:28
+msgid "Current Relationships"
+msgstr "Текущие связи"
+
+#: html/Admin/Elements/EditScrips:30
+msgid "Current Scrips"
+msgstr "Текущие скрипты"
+
+#: html/Admin/Groups/Members.html:39 html/User/Groups/Members.html:42
+msgid "Current members"
+msgstr "Текущие пользователи"
+
+#: html/Admin/Elements/SelectRights:29
+msgid "Current rights"
+msgstr "Текущие права"
+
+#: html/Search/Listing.html:71
+msgid "Current search criteria"
+msgstr ""
+
+#: html/Admin/Queues/People.html:41 html/Ticket/Elements/EditPeople:45
+msgid "Current watchers"
+msgstr "Текущие наблюдатели"
+
+#: html/Admin/Global/CustomField.html:55
+#. ($CustomField)
+msgid "Custom Field #%1"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:53 html/Admin/Elements/SystemTabs:40 html/Admin/Global/index.html:50 html/Ticket/Elements/ShowSummary:35
+msgid "Custom Fields"
+msgstr "Дополнительные поля"
+
+#: html/Admin/Elements/EditScrip:73
+msgid "Custom action cleanup code"
+msgstr "Пользовательский код очистки"
+
+#: html/Admin/Elements/EditScrip:65
+msgid "Custom action preparation code"
+msgstr "Пользовательский подготовительный код"
+
+#: html/Admin/Elements/EditScrip:49
+msgid "Custom condition"
+msgstr "Пользовательское условие"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "Дополнительное поле %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "Дополнительное поле %1 имеет значение."
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "Дополнительное поле %1 не имеет значения."
+
+#: lib/RT/Ticket_Overlay.pm:3360
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "Дополнительное поле %1 не найдено"
+
+#: html/Admin/Elements/EditCustomFields:197
+msgid "Custom field deleted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3510
+msgid "Custom field not found"
+msgstr "Дополнительное поле не найдено"
+
+#: lib/RT/CustomField_Overlay.pm:283
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "Значение %1 не может быть найдено для поля %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "Значение поля изменено с %1 на %2"
+
+#: lib/RT/CustomField_Overlay.pm:185
+msgid "Custom field value could not be deleted"
+msgstr "Значение дополнительного поля не может быть удалено"
+
+#: lib/RT/CustomField_Overlay.pm:289
+msgid "Custom field value could not be found"
+msgstr "Значение дополнительного поля не найдено"
+
+#: lib/RT/CustomField_Overlay.pm:183 lib/RT/CustomField_Overlay.pm:291
+msgid "Custom field value deleted"
+msgstr "Значение дополнительного поля было удалено"
+
+#: lib/RT/Transaction_Overlay.pm:550
+msgid "CustomField"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr ""
+
+#: html/Ticket/Create.html:161 html/Ticket/Elements/ShowSummary:53 html/Ticket/Elements/Tabs:93 html/Ticket/ModifyAll.html:44
+msgid "Dates"
+msgstr "Даты"
+
+#: lib/RT/Date.pm:422
+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 ""
+
+#: etc/initialdata:275
+msgid "Default admin comment template"
+msgstr ""
+
+#: etc/initialdata:257
+msgid "Default admin correspondence template"
+msgstr ""
+
+#: etc/initialdata:267
+msgid "Default correspondence template"
+msgstr ""
+
+#: etc/initialdata:238
+msgid "Default transaction template"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:645
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr ""
+
+#: html/User/Delegation.html:25 html/User/Delegation.html:28
+msgid "Delegate rights"
+msgstr "Передача прав"
+
+#: lib/RT/System.pm:63
+msgid "Delegate specific rights which have been granted to you."
+msgstr ""
+
+#: lib/RT/System.pm:63
+msgid "DelegateRights"
+msgstr ""
+
+#: html/User/Elements/Tabs:38
+msgid "Delegation"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Delete"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "Delete tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:90
+msgid "DeleteTicket"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "Удаление этого объекта может нарушить ссылочную целостность"
+
+#: lib/RT/Queue_Overlay.pm:292
+msgid "Deleting this object would break referential integrity"
+msgstr "Удаление этого объекта нарушит ссылочную целостность"
+
+#: lib/RT/User_Overlay.pm:430
+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 "Отказать"
+
+#: html/Ticket/Create.html:181 html/Ticket/Elements/EditLinks:123 html/Ticket/Elements/EditLinks:47 html/Ticket/Elements/ShowDependencies:32 html/Ticket/Elements/ShowLinks:35
+msgid "Depended on by"
+msgstr "От него зависят"
+
+#: NOT FOUND IN SOURCE
+msgid "Dependencies: \\n"
+msgstr "Зависимости: \\n"
+
+#: html/Elements/SelectLinkType:27 html/Ticket/Create.html:180 html/Ticket/Elements/EditLinks:119 html/Ticket/Elements/EditLinks:36 html/Ticket/Elements/ShowDependencies:25 html/Ticket/Elements/ShowLinks:27
+msgid "Depends on"
+msgstr "Зависит от"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr ""
+
+#: html/Elements/SelectSortOrder:35
+msgid "Descending"
+msgstr "В порядке убывания"
+
+#: html/SelfService/Create.html:75 html/Ticket/Create.html:119
+msgid "Describe the issue below"
+msgstr "Опишите проблему"
+
+#: html/Admin/Elements/AddCustomFieldValue:27 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyQueue:36 html/Admin/Elements/ModifyTemplate:36 html/Admin/Groups/Modify.html:49 html/Admin/Queues/Modify.html:48 html/Elements/SelectGroups:27 html/User/Groups/Modify.html:49
+msgid "Description"
+msgstr "Описание"
+
+#: html/SelfService/Elements/MyRequests:44
+msgid "Details"
+msgstr "Подробности"
+
+#: html/Ticket/Elements/Tabs:85
+msgid "Display"
+msgstr "Показать"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Display Access Control List"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "Display Scrip templates for this queue"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Display Scrips for this queue"
+msgstr ""
+
+#: html/Ticket/Elements/ShowHistory:35
+msgid "Display mode"
+msgstr "Режим показа"
+
+#: html/SelfService/Display.html:25 html/SelfService/Display.html:29
+#. ($Ticket->id)
+msgid "Display ticket #%1"
+msgstr "Показать тикет #%1"
+
+#: lib/RT/System.pm:54
+msgid "Do anything and everything"
+msgstr ""
+
+#: html/Elements/Refresh:30
+msgid "Don't refresh this page."
+msgstr "Не обновлять эту страницу"
+
+#: html/Search/Elements/PickRestriction:114
+msgid "Don't show search results"
+msgstr ""
+
+#: html/Ticket/Elements/ShowTransaction:105
+msgid "Download"
+msgstr "Скачать"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Create.html:167 html/Ticket/Elements/EditDates:45 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1171
+msgid "Due"
+msgstr "Дан срок"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "Не могу прочесть срок решения проблемы '%1'"
+
+#: bin/rt-commit-handler:754
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "ОШИБКА: Не могу загрузить тикет '%1': %2.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit"
+msgstr "Изменить"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Conditions"
+msgstr ""
+
+#: html/Admin/Queues/CustomFields.html:45
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "Изменение дополнительных полей для %1"
+
+#: html/Ticket/ModifyLinks.html:36
+msgid "Edit Relationships"
+msgstr "Изменение связей"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr ""
+
+#: html/Admin/Global/index.html:46
+msgid "Edit system templates"
+msgstr "Изменение системных шаблонов"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "Изменение шаблонов для %1"
+
+#: html/Admin/Elements/ModifyQueue:25 html/Admin/Queues/Modify.html:117
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "Изменение настроек очереди %1"
+
+#: html/Admin/Elements/ModifyUser:25
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "Изменение настроек пользователя %1"
+
+#: html/Admin/Elements/EditCustomField:74
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "Изменение поля %1"
+
+#: html/Admin/Groups/Members.html:32
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "Пользователи в группе %1"
+
+#: html/User/Groups/Members.html:129
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "Пользователи в личной группе %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "Изменение шаблона %1"
+
+#: lib/RT/Ticket_Overlay.pm:2615 lib/RT/Ticket_Overlay.pm:2683
+msgid "Either base or target must be specified"
+msgstr "Нужно указать либо источник, либо адрес назначения"
+
+#: html/Admin/Users/Modify.html:53 html/Admin/Users/Prefs.html:46 html/Elements/SelectUsers:27 html/Ticket/Elements/AddWatchers:56 html/User/Prefs.html:42
+msgid "Email"
+msgstr "Email"
+
+#: lib/RT/User_Overlay.pm:188
+msgid "Email address in use"
+msgstr "Email уже занят"
+
+#: html/Admin/Elements/ModifyUser:42
+msgid "EmailAddress"
+msgstr "EmailAddress"
+
+#: html/Admin/Elements/ModifyUser:54
+msgid "EmailEncoding"
+msgstr "EmailEncoding"
+
+#: html/Admin/Elements/EditCustomField:36
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:53 html/User/Groups/Modify.html:53
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr ""
+
+#: html/Admin/Queues/Modify.html:84
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "Включена (Снятая галочка означает отключенную очередь)"
+
+#: html/Admin/Elements/EditCustomFields:99
+msgid "Enabled Custom Fields"
+msgstr ""
+
+#: html/Admin/Queues/index.html:56
+msgid "Enabled Queues"
+msgstr "Включенные очереди"
+
+#: html/Admin/Elements/EditCustomField:90 html/Admin/Groups/Modify.html:117 html/Admin/Queues/Modify.html:138 html/Admin/Users/Modify.html:283 html/User/Groups/Modify.html:117
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "Включен статус %1"
+
+#: lib/RT/CustomField_Overlay.pm:361
+msgid "Enter multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:358
+msgid "Enter one value"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:112
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "Введите номера или ссылки на тикеты. Несколько тикетов разделяются пробелами."
+
+#: html/Elements/Login:29 html/SelfService/Error.html:25 html/SelfService/Error.html:26
+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"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "Ошибка в параметрах Queue->DelWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1356
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "Ошибка в параметрах Ticket->AddWatcher"
+
+#: lib/RT/Ticket_Overlay.pm:1532
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "Ошибка в параметрах Ticket->DelWatcher"
+
+#: etc/initialdata:20
+msgid "Everyone"
+msgstr ""
+
+#: bin/rt-crontool:194
+msgid "Example:"
+msgstr "Пример:"
+
+#: html/Admin/Elements/ModifyUser:64
+msgid "ExternalAuthId"
+msgstr "ExternalAuthId"
+
+#: html/Admin/Elements/ModifyUser:58
+msgid "ExternalContactInfoId"
+msgstr "ExternalContactInfoId"
+
+#: html/Admin/Users/Modify.html:73
+msgid "Extra info"
+msgstr "Доп. информация"
+
+#: lib/RT/User_Overlay.pm:302
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "Не могу найти псевдо-группу 'Полномочных' пользователей"
+
+#: lib/RT/User_Overlay.pm:309
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "Не могу найти псевдо-группу 'Неполномочных' пользователей"
+
+#: bin/rt-crontool:138
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr ""
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "Фев."
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "Конец"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:59 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "Конечный приоритет"
+
+#: lib/RT/Ticket_Overlay.pm:1162
+msgid "FinalPriority"
+msgstr ""
+
+#: html/Admin/Queues/People.html:61 html/Ticket/Elements/EditPeople:34
+msgid "Find group whose"
+msgstr ""
+
+#: html/Elements/Quicksearch:25
+msgid "Find new/open tickets"
+msgstr "Информация о тикетах"
+
+#: html/Admin/Queues/People.html:57 html/Admin/Users/index.html:46 html/Ticket/Elements/EditPeople:30
+msgid "Find people whose"
+msgstr "Найти людей, у которых"
+
+#: html/Search/Listing.html:108
+msgid "Find tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Finish Approval"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:58
+msgid "First"
+msgstr "Начало"
+
+#: html/Search/Listing.html:41
+msgid "First page"
+msgstr "Первая страница"
+
+#: 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:87
+msgid "Force change"
+msgstr "Изменить силой"
+
+#: html/Search/Listing.html:106
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:868
+msgid "Found Object"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:44
+msgid "FreeformContactInfo"
+msgstr "FreeformContactInfo"
+
+#: lib/RT/CustomField_Overlay.pm:38
+msgid "FreeformMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformSingle"
+msgstr ""
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "Птн."
+
+#: html/Ticket/Elements/ShowHistory:41 html/Ticket/Elements/ShowHistory:51
+msgid "Full headers"
+msgstr "Полный"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "Берем текущего пользователя из pgp подписи\\n"
+
+#: lib/RT/Transaction_Overlay.pm:595
+#. ($New->Name)
+msgid "Given to %1"
+msgstr ""
+
+#: html/Admin/Elements/Tabs:41 html/Admin/index.html:38
+msgid "Global"
+msgstr "Общие"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr ""
+
+#: html/Admin/Elements/SelectTemplate:38
+#. (loc($Template->Name))
+msgid "Global template: %1"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:75 html/Admin/Queues/People.html:59 html/Admin/Queues/People.html:63 html/Admin/Queues/index.html:44 html/Admin/Users/index.html:49 html/Ticket/Elements/EditPeople:32 html/Ticket/Elements/EditPeople:36 html/index.html:41
+msgid "Go!"
+msgstr "Поехали!"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "Хорошая pgp подпись от %1\\n"
+
+#: html/Search/Listing.html:50
+msgid "Goto page"
+msgstr "Перейти на страницу"
+
+#: html/Elements/GotoTicket:25 html/SelfService/Elements/GotoTicket:25
+msgid "Goto ticket"
+msgstr "Показать тикет"
+
+#: NOT FOUND IN SOURCE
+msgid "Grand"
+msgstr ""
+
+#: html/Ticket/Elements/AddWatchers:46 html/User/Elements/DelegateRights:78
+msgid "Group"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "Группа %1 %2: %3"
+
+#: html/Admin/Elements/GroupTabs:45 html/Admin/Elements/QueueTabs:57 html/Admin/Elements/SystemTabs:44 html/Admin/Global/index.html:55
+msgid "Group Rights"
+msgstr "Права группы"
+
+#: lib/RT/Group_Overlay.pm:965
+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"
+msgstr "Не могу создать группу: %1"
+
+#: lib/RT/Group_Overlay.pm:497
+msgid "Group created"
+msgstr "Создана группа"
+
+#: lib/RT/Group_Overlay.pm:1133
+msgid "Group has no such member"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:945 lib/RT/Queue_Overlay.pm:628 lib/RT/Queue_Overlay.pm:688 lib/RT/Ticket_Overlay.pm:1429 lib/RT/Ticket_Overlay.pm:1507
+msgid "Group not found"
+msgstr "Группа не найдена"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "Группа не найдена.\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "Не задана группа.\\n"
+
+#: html/Admin/Elements/SelectNewGroupMembers:35 html/Admin/Elements/Tabs:35 html/Admin/Groups/Members.html:64 html/Admin/Queues/People.html:83 html/Admin/index.html:32 html/User/Groups/Members.html:67
+msgid "Groups"
+msgstr "Группы"
+
+#: lib/RT/Group_Overlay.pm:971
+msgid "Groups can't be members of their members"
+msgstr "Группы не могут быть членами входящих в них пользователей"
+
+#: lib/RT/Interface/CLI.pm:73 lib/RT/Interface/CLI.pm:73
+msgid "Hello!"
+msgstr "Здравствуйте!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "Hello, %1"
+
+#: html/Ticket/Elements/ShowHistory:30 html/Ticket/Elements/Tabs:88
+msgid "History"
+msgstr "История"
+
+#: html/Admin/Elements/ModifyUser:68
+msgid "HomePhone"
+msgstr "HomePhone"
+
+#: html/Elements/Tabs:46
+msgid "Homepage"
+msgstr "Домой"
+
+#: lib/RT/Base.pm:74
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "I have [quant,_1,concrete mixer]."
+msgstr "I have [quant,_1,concrete mixer]."
+
+#: html/Ticket/Elements/ShowBasics:27 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "Тикет"
+
+#: html/Admin/Users/Modify.html:44 html/User/Prefs.html:39
+msgid "Identity"
+msgstr "Личность"
+
+#: etc/upgrade/2.1.71:86
+msgid "If an approval is rejected, reject the original and delete pending approvals"
+msgstr ""
+
+#: bin/rt-crontool:190
+msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT."
+msgstr "Если бы эта программа имела установленный бит setgid, то зловредный пользователь мог бы воспользоваться этим для получения административных полномочий в RT."
+
+#: 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 "Если вы что-либо изменили, то удостоверьтесь, что"
+
+#: lib/RT/Interface/Web.pm:860
+msgid "Illegal value for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:863
+msgid "Immutable field"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:74
+msgid "Include disabled custom fields in listing."
+msgstr ""
+
+#: html/Admin/Queues/index.html:43
+msgid "Include disabled queues in listing."
+msgstr "Показывать отключенные очереди."
+
+#: html/Admin/Users/index.html:47
+msgid "Include disabled users in search."
+msgstr "Показать отключенных пользователей."
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "Начальный приоритет"
+
+#: lib/RT/Ticket_Overlay.pm:1161 lib/RT/Ticket_Overlay.pm:1163
+msgid "InitialPriority"
+msgstr ""
+
+#: lib/RT/ScripAction_Overlay.pm:105
+msgid "Input error"
+msgstr "Ошибка ввода"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:3729
+msgid "Internal Error"
+msgstr "Внутренняя ошибка"
+
+#: lib/RT/Record.pm:143
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:644
+msgid "Invalid Group Type"
+msgstr "Неправильный тип группы"
+
+#: lib/RT/Principal_Overlay.pm:128
+msgid "Invalid Right"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:865
+msgid "Invalid data"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:438
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "Владелец отсутствует. Заменяем его на 'nobody'."
+
+#: lib/RT/Scrip_Overlay.pm:134 lib/RT/Template_Overlay.pm:251
+msgid "Invalid queue"
+msgstr "Неверная очередь"
+
+#: lib/RT/ACE_Overlay.pm:244 lib/RT/ACE_Overlay.pm:253 lib/RT/ACE_Overlay.pm:259 lib/RT/ACE_Overlay.pm:270 lib/RT/ACE_Overlay.pm:275
+msgid "Invalid right"
+msgstr "Неверные права"
+
+#: lib/RT/Record.pm:118
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "Неправильное значение для %1"
+
+#: lib/RT/Ticket_Overlay.pm:3367
+msgid "Invalid value for custom field"
+msgstr "Неправильное значение для этого поля"
+
+#: lib/RT/Ticket_Overlay.pm:345
+msgid "Invalid value for status"
+msgstr "Такого статуса не бывает"
+
+#: bin/rt-crontool:191
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "Обратите внимание, что обычные пользователи не имеют права запускать эту программу."
+
+#: bin/rt-crontool:192
+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 "Предполагается, что для запуска этой программы вы должны создать учетную запись пользователя Unix с корректными установками групп и доступом к RT."
+
+#: bin/rt-crontool:163
+msgid "It takes several arguments:"
+msgstr "Она требует несколько параметров:"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "Тикеты, ожидающие моей визы"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "Янв."
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "Join or leave this group"
+msgstr ""
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "Июл."
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:99
+msgid "Jumbo"
+msgstr "Все вместе"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "Июн."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "Ключевое слово"
+
+#: html/Admin/Elements/ModifyUser:52
+msgid "Lang"
+msgstr "Язык"
+
+#: html/Ticket/Elements/Tabs:73
+msgid "Last"
+msgstr "Конец"
+
+#: html/Ticket/Elements/EditDates:38 html/Ticket/Elements/ShowDates:39
+msgid "Last Contact"
+msgstr "Контакт"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Contacted"
+msgstr "Контакт"
+
+#: html/Search/Elements/TicketHeader:41
+msgid "Last Notified"
+msgstr ""
+
+#: html/Elements/SelectDateType:30
+msgid "Last Updated"
+msgstr "Обновлен"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "Осталось"
+
+#: html/Admin/Users/Modify.html:83
+msgid "Let this user access RT"
+msgstr "Разрешить доступ к RT"
+
+#: html/Admin/Users/Modify.html:87
+msgid "Let this user be granted rights"
+msgstr "Пользователь может иметь права"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "Ограничиваем владельца %1 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "Ограничиваем очередь для %1 %2"
+
+#: lib/RT/Ticket_Overlay.pm:2697
+msgid "Link already exists"
+msgstr "Связь уже существует"
+
+#: lib/RT/Ticket_Overlay.pm:2709
+msgid "Link could not be created"
+msgstr "Не могу связать тикеты"
+
+#: lib/RT/Ticket_Overlay.pm:2717 lib/RT/Ticket_Overlay.pm:2727
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2638
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "Удалена связь (%1)"
+
+#: lib/RT/Ticket_Overlay.pm:2644
+msgid "Link not found"
+msgstr "Связь не найдена"
+
+#: html/Ticket/ModifyLinks.html:25 html/Ticket/ModifyLinks.html:29
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "Связываем тикет #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr ""
+
+#: html/Ticket/Elements/Tabs:97
+msgid "Links"
+msgstr "Связи"
+
+#: html/Admin/Users/Modify.html:114 html/User/Prefs.html:85
+msgid "Location"
+msgstr "Местонахождение"
+
+#: lib/RT.pm:158
+#. ($RT::LogDir)
+msgid "Log directory %1 not found or couldn't be written.\\n RT can't run."
+msgstr "Не найден каталог для протоколирования %1 или не доступен на запись.\\n RT не может продолжить работу."
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+msgid "Logged in as %1"
+msgstr "Зарегистрирован как %1"
+
+#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:25 html/Elements/Login:34 html/Elements/Login:45
+msgid "Login"
+msgstr "Логин"
+
+#: html/Elements/Header:54
+msgid "Logout"
+msgstr "Выйти"
+
+#: html/Search/Bulk.html:86
+msgid "Make Owner"
+msgstr "Назначить владельцем"
+
+#: html/Search/Bulk.html:102
+msgid "Make Status"
+msgstr "Назначить статус"
+
+#: html/Search/Bulk.html:109
+msgid "Make date Due"
+msgstr "Назначить срок"
+
+#: html/Search/Bulk.html:110
+msgid "Make date Resolved"
+msgstr "Изменить дату решения"
+
+#: html/Search/Bulk.html:107
+msgid "Make date Started"
+msgstr "Изменить дату 'Начался'"
+
+#: html/Search/Bulk.html:106
+msgid "Make date Starts"
+msgstr "Изменить дату 'Начинается'"
+
+#: html/Search/Bulk.html:108
+msgid "Make date Told"
+msgstr "Изменить дату последнего контакта"
+
+#: html/Search/Bulk.html:99
+msgid "Make priority"
+msgstr "Назначить приоритет"
+
+#: html/Search/Bulk.html:100
+msgid "Make queue"
+msgstr "Назначить очередь"
+
+#: html/Search/Bulk.html:98
+msgid "Make subject"
+msgstr "Изменить тему"
+
+#: html/Admin/index.html:33
+msgid "Manage groups and group membership"
+msgstr "Настройка групп и их пользователей"
+
+#: html/Admin/index.html:39
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "Настройки для всех очередей"
+
+#: html/Admin/index.html:36
+msgid "Manage queues and queue-specific properties"
+msgstr "Настройка очередей и их параметров"
+
+#: html/Admin/index.html:30
+msgid "Manage users and passwords"
+msgstr "Настройка пользователей и их паролей"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "Мар."
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr ""
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "Май"
+
+#: lib/RT/Group_Overlay.pm:982
+msgid "Member added"
+msgstr "Пользователь добавлен в группу"
+
+#: lib/RT/Group_Overlay.pm:1140
+msgid "Member deleted"
+msgstr "Пользователь удален из группы"
+
+#: lib/RT/Group_Overlay.pm:1144
+msgid "Member not deleted"
+msgstr "Пользователь не удален из группы"
+
+#: html/Elements/SelectLinkType:26
+msgid "Member of"
+msgstr "Входит в"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:42 html/User/Elements/GroupTabs:42
+msgid "Members"
+msgstr "Пользователи"
+
+#: lib/RT/Ticket_Overlay.pm:2843
+msgid "Merge Successful"
+msgstr "Тикеты успешно склеены"
+
+#: lib/RT/Ticket_Overlay.pm:2804
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "Склейка не удалась. Не смогла установить идентификатор тикета."
+
+#: html/Ticket/Elements/EditLinks:115
+msgid "Merge into"
+msgstr "Приклеить к"
+
+#: html/Ticket/Update.html:102
+msgid "Message"
+msgstr "Текст"
+
+#: lib/RT/Interface/Web.pm:867
+msgid "Missing a primary key?: %1"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:169 html/User/Prefs.html:54
+msgid "Mobile"
+msgstr "Мобильник"
+
+#: html/Admin/Elements/ModifyUser:72
+msgid "MobilePhone"
+msgstr "MobilePhone"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify Access Control List"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Custom Field %1"
+msgstr "Изменение дополнительного поля %1"
+
+#: html/Admin/Global/CustomFields.html:44 html/Admin/Global/index.html:51
+msgid "Modify Custom Fields which apply to all queues"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "Modify Scrip templates for this queue"
+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 ""
+
+#: html/Admin/Queues/CustomField.html:45
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr ""
+
+#: html/Admin/Global/CustomField.html:53
+msgid "Modify a CustomField which applies to all queues"
+msgstr ""
+
+#: html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "Изменить скрипт для очереди %1"
+
+#: html/Admin/Global/Scrip.html:48
+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"
+msgstr "Изменение дат в тикете #%1"
+
+#: html/Ticket/ModifyDates.html:35
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "Изменение дат в тикете #%1"
+
+#: html/Admin/Global/GroupRights.html:25 html/Admin/Global/GroupRights.html:28 html/Admin/Global/index.html:56
+msgid "Modify global group rights"
+msgstr "Изменение глобальных прав группы"
+
+#: html/Admin/Global/GroupRights.html:33
+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 ""
+
+#: html/Admin/Global/UserRights.html:33
+msgid "Modify global user rights."
+msgstr "Изменение глобальных прав пользователя"
+
+#: lib/RT/Group_Overlay.pm:146
+msgid "Modify group metadata or delete group"
+msgstr ""
+
+#: html/Admin/Groups/GroupRights.html:25 html/Admin/Groups/GroupRights.html:29 html/Admin/Groups/GroupRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "Изменение прав групп для группе %1"
+
+#: html/Admin/Queues/GroupRights.html:25 html/Admin/Queues/GroupRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "Изменение прав групп для очереди %1"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Modify membership roster for this group"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "Modify one's own RT account"
+msgstr ""
+
+#: html/Admin/Queues/People.html:25 html/Admin/Queues/People.html:29
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "Изменение пользователей относящихся к очереди %1"
+
+#: html/Ticket/ModifyPeople.html:25 html/Ticket/ModifyPeople.html:29 html/Ticket/ModifyPeople.html:35
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "Изменение пользователей относящихся к тикету #%1"
+
+#: html/Admin/Queues/Scrips.html:44
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "Изменить скрипты для очереди %1"
+
+#: html/Admin/Global/Scrips.html:44 html/Admin/Global/index.html:42
+msgid "Modify scrips which apply to all queues"
+msgstr "Изменение скриптов, которые действуют на все очереди"
+
+#: html/Admin/Global/Template.html:25 html/Admin/Global/Template.html:30 html/Admin/Global/Template.html:81 html/Admin/Queues/Template.html:78
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "Изменение шаблона %1"
+
+#: html/Admin/Global/Templates.html:44
+msgid "Modify templates which apply to all queues"
+msgstr ""
+
+#: html/Admin/Groups/Modify.html:87 html/User/Groups/Modify.html:86
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "Настройки для группы %1"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Modify the queue watchers"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:236
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "Настройки для пользователя %1"
+
+#: html/Ticket/ModifyAll.html:37
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "Изменение тикета # %1"
+
+#: html/Ticket/Modify.html:25 html/Ticket/Modify.html:28 html/Ticket/Modify.html:34
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "Изменение тикета # %1"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Modify tickets"
+msgstr ""
+
+#: html/Admin/Groups/UserRights.html:25 html/Admin/Groups/UserRights.html:29 html/Admin/Groups/UserRights.html:35
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "Изменение прав пользователя для группы %1"
+
+#: html/Admin/Queues/UserRights.html:25 html/Admin/Queues/UserRights.html:29
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "Изменение прав пользователя для очереди %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "Изменение наблюдателей для очереди '%1'"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyACL"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:149
+msgid "ModifyOwnMembership"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "ModifyQueueWatchers"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:76
+msgid "ModifyScrips"
+msgstr ""
+
+#: lib/RT/System.pm:61
+msgid "ModifySelf"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:73
+msgid "ModifyTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "ModifyTicket"
+msgstr ""
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "Пнд."
+
+#: html/Ticket/Elements/ShowRequestor:42
+#. ($name)
+msgid "More about %1"
+msgstr "Информация о %1"
+
+#: html/Admin/Elements/EditCustomFields:61
+msgid "Move down"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFields:53
+msgid "Move up"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:27
+msgid "Multiple"
+msgstr "Несколько значений"
+
+#: lib/RT/User_Overlay.pm:179
+msgid "Must specify 'Name' attribute"
+msgstr "Вы должны указать Имя"
+
+#: NOT FOUND IN SOURCE
+msgid "My Approvals"
+msgstr "Мои визы"
+
+#: html/Approvals/index.html:25 html/Approvals/index.html:26
+msgid "My approvals"
+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"
+msgstr "Имя"
+
+#: lib/RT/User_Overlay.pm:186
+msgid "Name in use"
+msgstr "Имя уже используется"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr ""
+
+#: html/Ticket/Elements/ShowDates:52
+msgid "Never"
+msgstr ""
+
+#: html/Elements/Quicksearch:30
+msgid "New"
+msgstr "Новых"
+
+#: html/Admin/Elements/ModifyUser:32 html/Admin/Users/Modify.html:93 html/User/Prefs.html:65
+msgid "New Password"
+msgstr "Новый пароль"
+
+#: etc/initialdata:311 etc/upgrade/2.1.71:16
+msgid "New Pending Approval"
+msgstr ""
+
+#: html/Ticket/Elements/EditLinks:111
+msgid "New Relationships"
+msgstr "Новые связи"
+
+#: html/Ticket/Elements/Tabs:36
+msgid "New Search"
+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 ""
+
+#: html/Admin/Elements/GroupTabs:54 html/User/Elements/GroupTabs:52
+msgid "New group"
+msgstr ""
+
+#: html/SelfService/Prefs.html:32
+msgid "New password"
+msgstr "Новый пароль"
+
+#: lib/RT/User_Overlay.pm:639
+msgid "New password notification sent"
+msgstr "Отправлено сообщение с новым паролем"
+
+#: html/Admin/Elements/QueueTabs:70
+msgid "New queue"
+msgstr ""
+
+#: html/SelfService/Elements/Tabs:63
+msgid "New request"
+msgstr "Новый запрос"
+
+#: html/Admin/Elements/SelectRights:42
+msgid "New rights"
+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 ""
+
+#: NOT FOUND IN SOURCE
+msgid "New search"
+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 ""
+
+#: lib/RT/Ticket_Overlay.pm:2771
+msgid "New ticket doesn't exist"
+msgstr "Новый тикет не существует"
+
+#: html/Admin/Elements/UserTabs:52
+msgid "New user"
+msgstr ""
+
+#: html/Admin/Elements/CreateUserCalled:26
+msgid "New user called"
+msgstr "Добавить пользователя с именем"
+
+#: html/Admin/Queues/People.html:55 html/Ticket/Elements/EditPeople:29
+msgid "New watchers"
+msgstr "Новые наблюдатели"
+
+#: html/Admin/Users/Prefs.html:42
+msgid "New window setting"
+msgstr "Новые настройки окна"
+
+#: html/Ticket/Elements/Tabs:69
+msgid "Next"
+msgstr "Вперед"
+
+#: html/Search/Listing.html:48
+msgid "Next page"
+msgstr "Следующая страница"
+
+#: html/Admin/Elements/ModifyUser:50
+msgid "NickName"
+msgstr "Псевдоним"
+
+#: html/Admin/Users/Modify.html:63 html/User/Prefs.html:46
+msgid "Nickname"
+msgstr "Псевдоним"
+
+#: html/Admin/Elements/EditCustomField:73 html/Admin/Elements/EditCustomFields:105
+msgid "No CustomField"
+msgstr "Нет такого поля"
+
+#: html/Admin/Groups/GroupRights.html:84 html/Admin/Groups/UserRights.html:71
+msgid "No Group defined"
+msgstr "Нет такой группы"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:68
+msgid "No Queue defined"
+msgstr "Нет такой очереди"
+
+#: bin/rt-crontool:56
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "Пользователь RT не найден. Пожалуйста, обратитесь к вашему администратору RT.\\n"
+
+#: html/Admin/Global/Template.html:79 html/Admin/Queues/Template.html:76
+msgid "No Template"
+msgstr "Шаблон не определен"
+
+#: bin/rt-commit-handler:764
+msgid "No Ticket specified. Aborting ticket "
+msgstr "Тикет не задан. Ничего не делаем."
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "Тикет не задан. Отменяем изменения тикета\\n\\n"
+
+#: html/Approvals/Elements/Approve:47
+msgid "No action"
+msgstr "Нет действия"
+
+#: lib/RT/Interface/Web.pm:862
+msgid "No column specified"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "Команда не найдена\\n"
+
+#: html/Elements/ViewUser:36 html/Ticket/Elements/ShowRequestor:45
+msgid "No comment entered about this user"
+msgstr "Без комментариев"
+
+#: lib/RT/Ticket_Overlay.pm:2189 lib/RT/Ticket_Overlay.pm:2257
+msgid "No correspondence attached"
+msgstr "Пустое сообщение"
+
+#: lib/RT/Action/Generic.pm:150 lib/RT/Condition/Generic.pm:176 lib/RT/Search/ActiveTicketsInQueue.pm:56 lib/RT/Search/Generic.pm:113
+#. (ref $self)
+msgid "No description for %1"
+msgstr "Нет описания для %1"
+
+#: lib/RT/Users_Overlay.pm:151
+msgid "No group specified"
+msgstr "Не указана группа"
+
+#: lib/RT/User_Overlay.pm:857
+msgid "No password set"
+msgstr "Отсутствует пароль"
+
+#: lib/RT/Queue_Overlay.pm:259
+msgid "No permission to create queues"
+msgstr "У вас нет права на создание очереди"
+
+#: lib/RT/Ticket_Overlay.pm:341
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr ""
+
+#: lib/RT/User_Overlay.pm:151
+msgid "No permission to create users"
+msgstr "Вы не имеете права создавать пользователей"
+
+#: html/SelfService/Display.html:174
+msgid "No permission to display that ticket"
+msgstr "Показ этого тикета запрещен"
+
+#: html/SelfService/Update.html:55
+msgid "No permission to view update ticket"
+msgstr "Запрещен показ изменений этого тикета"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1488
+msgid "No principal specified"
+msgstr "Пользователь не указан"
+
+#: html/Admin/Queues/People.html:154 html/Admin/Queues/People.html:164
+msgid "No principals selected."
+msgstr "Пользователи не выбраны."
+
+#: html/Admin/Queues/index.html:35
+msgid "No queues matching search criteria found."
+msgstr "Ничего подходящего не найдено."
+
+#: html/Admin/Elements/SelectRights:81
+msgid "No rights found"
+msgstr ""
+
+#: html/Admin/Elements/SelectRights:33
+msgid "No rights granted."
+msgstr "Нет прав."
+
+#: html/Search/Bulk.html:149
+msgid "No search to operate on."
+msgstr "Нечего делать."
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "Не указан номер тикета"
+
+#: lib/RT/Transaction_Overlay.pm:480 lib/RT/Transaction_Overlay.pm:518
+msgid "No transaction type specified"
+msgstr "Не указан тип транзакции"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr ""
+
+#: html/Admin/Users/index.html:36
+msgid "No users matching search criteria found."
+msgstr "Ни одного подходящего пользователя не найдено."
+
+#: bin/rt-commit-handler:644
+msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n"
+msgstr "Не найден пользователь RT. Обработчик CVS отключен. Обратитесь к администратору RT.\\n"
+
+#: lib/RT/Interface/Web.pm:859
+msgid "No value sent to _Set!\\n"
+msgstr ""
+
+#: html/Search/Elements/TicketRow:37
+msgid "Nobody"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:864
+msgid "Nonexistant field?"
+msgstr ""
+
+#: html/Elements/Login:99
+msgid "Not logged in"
+msgstr ""
+
+#: html/Elements/Header:59 html/SelfService/Elements/Header:58
+msgid "Not logged in."
+msgstr "Не зарегистрирован."
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "Не установлено"
+
+#: html/NoAuth/Reminder.html:27
+msgid "Not yet implemented."
+msgstr "Еще не реализовано."
+
+#: html/Admin/Groups/Rights.html:25
+msgid "Not yet implemented...."
+msgstr "Еще не реализовано..."
+
+#: html/Approvals/Elements/Approve:50
+msgid "Notes"
+msgstr "Примечание"
+
+#: lib/RT/User_Overlay.pm:642
+msgid "Notification could not be sent"
+msgstr "Не могу отослать уведомление"
+
+#: etc/initialdata:94
+msgid "Notify AdminCcs"
+msgstr ""
+
+#: etc/initialdata:90
+msgid "Notify AdminCcs as Comment"
+msgstr ""
+
+#: etc/initialdata:121
+msgid "Notify Other Recipients"
+msgstr ""
+
+#: etc/initialdata:117
+msgid "Notify Other Recipients as Comment"
+msgstr ""
+
+#: etc/initialdata:86
+msgid "Notify Owner"
+msgstr ""
+
+#: etc/initialdata:82
+msgid "Notify Owner as Comment"
+msgstr ""
+
+#: etc/initialdata:313 etc/upgrade/2.1.71:17
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr ""
+
+#: etc/initialdata:78
+msgid "Notify Requestors"
+msgstr ""
+
+#: etc/initialdata:104
+msgid "Notify Requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:99
+msgid "Notify Requestors and Ccs as Comment"
+msgstr ""
+
+#: etc/initialdata:113
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr ""
+
+#: etc/initialdata:109
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr ""
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "Ноя."
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr ""
+
+#: lib/RT/Record.pm:157
+msgid "Object could not be created"
+msgstr "Не могу создать объект"
+
+#: lib/RT/Record.pm:176
+msgid "Object created"
+msgstr "Создан объект"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "Окт."
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr ""
+
+#: html/Elements/SelectDateRelation:35
+msgid "On"
+msgstr "На"
+
+#: etc/initialdata:155
+msgid "On Comment"
+msgstr ""
+
+#: etc/initialdata:148
+msgid "On Correspond"
+msgstr ""
+
+#: etc/initialdata:137
+msgid "On Create"
+msgstr ""
+
+#: etc/initialdata:169
+msgid "On Owner Change"
+msgstr ""
+
+#: etc/initialdata:177
+msgid "On Queue Change"
+msgstr ""
+
+#: etc/initialdata:183
+msgid "On Resolve"
+msgstr ""
+
+#: etc/initialdata:161
+msgid "On Status Change"
+msgstr ""
+
+#: etc/initialdata:142
+msgid "On Transaction"
+msgstr ""
+
+#: html/Approvals/Elements/PendingMyApproval:50
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "Показывать визы только для запросов созданных после %1"
+
+#: html/Approvals/Elements/PendingMyApproval:48
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+msgid "Only show approvals for requests created before %1"
+msgstr "Показывать визы только для запросов созданных до %1"
+
+#: html/Elements/Quicksearch:31
+msgid "Open"
+msgstr "Открытых"
+
+#: html/Ticket/Elements/Tabs:136
+msgid "Open it"
+msgstr "Открыть"
+
+#: html/SelfService/Elements/Tabs:57
+msgid "Open requests"
+msgstr "Открыть запросы"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "Open tickets (from listing) in a new window"
+msgstr "Открыть тикеты (из списка) в новом окне"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in another window"
+msgstr "Открыть тикеты (из списка) в другом окне"
+
+#: etc/initialdata:133
+msgid "Open tickets on correspondence"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:101
+msgid "Ordering and sorting"
+msgstr "Порядок и сортировка"
+
+#: html/Admin/Elements/ModifyUser:46 html/Admin/Users/Modify.html:117 html/Elements/SelectUsers:29 html/User/Prefs.html:86
+msgid "Organization"
+msgstr "Организация"
+
+#: html/Approvals/Elements/Approve:34
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:55 html/Admin/Queues/Modify.html:69
+msgid "Over time, priority moves toward"
+msgstr "Со временем поднять приоритет до"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Own tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "OwnTicket"
+msgstr ""
+
+#: etc/initialdata:38 html/Elements/MyRequests:32 html/SelfService/Elements/MyRequests:30 html/Ticket/Create.html:48 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/EditPeople:44 html/Ticket/Elements/ShowPeople:27 html/Ticket/Update.html:63 lib/RT/ACE_Overlay.pm:86 lib/RT/Tickets_Overlay.pm:1244
+msgid "Owner"
+msgstr "Владелец"
+
+#: lib/RT/Ticket_Overlay.pm:3004
+#. ($OldOwnerObj->Name,  $NewOwnerObj->Name)
+msgid "Owner changed from %1 to %2"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:584
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "Владелец силой изменен с %1 на %2"
+
+#: html/Search/Elements/PickRestriction:31
+msgid "Owner is"
+msgstr "Владелец"
+
+#: html/Admin/Users/Modify.html:174 html/User/Prefs.html:56
+msgid "Pager"
+msgstr "Пейджер"
+
+#: html/Admin/Elements/ModifyUser:74
+msgid "PagerPhone"
+msgstr "Телефон пейджера"
+
+#: NOT FOUND IN SOURCE
+msgid "Parent"
+msgstr ""
+
+#: html/Ticket/Create.html:182 html/Ticket/Elements/EditLinks:127 html/Ticket/Elements/EditLinks:58 html/Ticket/Elements/ShowLinks:43
+msgid "Parents"
+msgstr "Предки"
+
+#: html/Elements/Login:43 html/User/Prefs.html:61
+msgid "Password"
+msgstr "Пароль"
+
+#: html/NoAuth/Reminder.html:25
+msgid "Password Reminder"
+msgstr "Подсказка к паролю"
+
+#: lib/RT/User_Overlay.pm:168 lib/RT/User_Overlay.pm:860
+msgid "Password too short"
+msgstr "Пароль слишком короткий"
+
+#: html/Admin/Users/Modify.html:291 html/User/Prefs.html:172
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "Пароль: %1"
+
+#: html/Ticket/Elements/ShowSummary:43 html/Ticket/Elements/Tabs:96 html/Ticket/ModifyAll.html:51
+msgid "People"
+msgstr "Люди"
+
+#: etc/initialdata:126
+msgid "Perform a user-defined action"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:231 lib/RT/ACE_Overlay.pm:237 lib/RT/ACE_Overlay.pm:563 lib/RT/ACE_Overlay.pm:573 lib/RT/ACE_Overlay.pm:583 lib/RT/ACE_Overlay.pm:648 lib/RT/CurrentUser.pm:83 lib/RT/CurrentUser.pm:92 lib/RT/CustomField_Overlay.pm:445 lib/RT/CustomField_Overlay.pm:451 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1099 lib/RT/Group_Overlay.pm:1108 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1163 lib/RT/Group_Overlay.pm:1169 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:904 lib/RT/Group_Overlay.pm:908 lib/RT/Group_Overlay.pm:921 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:126 lib/RT/Scrip_Overlay.pm:137 lib/RT/Scrip_Overlay.pm:197 lib/RT/Scrip_Overlay.pm:430 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:88 lib/RT/Template_Overlay.pm:94 lib/RT/Ticket_Overlay.pm:1341 lib/RT/Ticket_Overlay.pm:1351 lib/RT/Ticket_Overlay.pm:1365 lib/RT/Ticket_Overlay.pm:1518 lib/RT/Ticket_Overlay.pm:1527 lib/RT/Ticket_Overlay.pm:1540 lib/RT/Ticket_Overlay.pm:1875 lib/RT/Ticket_Overlay.pm:2013 lib/RT/Ticket_Overlay.pm:2177 lib/RT/Ticket_Overlay.pm:2244 lib/RT/Ticket_Overlay.pm:2596 lib/RT/Ticket_Overlay.pm:2668 lib/RT/Ticket_Overlay.pm:2762 lib/RT/Ticket_Overlay.pm:2777 lib/RT/Ticket_Overlay.pm:2910 lib/RT/Ticket_Overlay.pm:3139 lib/RT/Ticket_Overlay.pm:3337 lib/RT/Ticket_Overlay.pm:3499 lib/RT/Ticket_Overlay.pm:3551 lib/RT/Ticket_Overlay.pm:3716 lib/RT/Transaction_Overlay.pm:468 lib/RT/Transaction_Overlay.pm:475 lib/RT/Transaction_Overlay.pm:504 lib/RT/Transaction_Overlay.pm:511 lib/RT/User_Overlay.pm:1334 lib/RT/User_Overlay.pm:562 lib/RT/User_Overlay.pm:597 lib/RT/User_Overlay.pm:853 lib/RT/User_Overlay.pm:941
+msgid "Permission Denied"
+msgstr "В доступе отказано"
+
+#: html/User/Elements/Tabs:35
+msgid "Personal Groups"
+msgstr ""
+
+#: html/User/Groups/index.html:30 html/User/Groups/index.html:40
+msgid "Personal groups"
+msgstr "Личные группы"
+
+#: html/User/Elements/DelegateRights:37
+msgid "Personal groups:"
+msgstr "Личные группы:"
+
+#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:49
+msgid "Phone numbers"
+msgstr "Номера телефонов"
+
+#: html/Admin/Users/Rights.html:25
+msgid "Placeholder"
+msgstr "Заполнитель"
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr ""
+
+#: html/Elements/Header:52 html/Elements/Tabs:55 html/SelfService/Prefs.html:25 html/User/Prefs.html:25 html/User/Prefs.html:28
+msgid "Preferences"
+msgstr "Предпочтения"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "Предпочтения"
+
+#: lib/RT/Action/Generic.pm:160
+msgid "Prepare Stubbed"
+msgstr "Подготовка не реализована"
+
+#: html/Ticket/Elements/Tabs:61
+msgid "Prev"
+msgstr "Назад"
+
+#: html/Search/Listing.html:44
+msgid "Previous page"
+msgstr "Предыдущая страница"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "Приоритет"
+
+#: lib/RT/ACE_Overlay.pm:133 lib/RT/ACE_Overlay.pm:208 lib/RT/ACE_Overlay.pm:552
+#. ($args{'PrincipalId'})
+msgid "Principal %1 not found."
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:54 html/SelfService/Display.html:76 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:54 html/Ticket/Elements/ShowBasics:39 lib/RT/Tickets_Overlay.pm:1042
+msgid "Priority"
+msgstr "Приоритет"
+
+#: html/Admin/Elements/ModifyQueue:51 html/Admin/Queues/Modify.html:65
+msgid "Priority starts at"
+msgstr "Приоритет начинается с"
+
+#: etc/initialdata:25
+msgid "Privileged"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:271 html/User/Prefs.html:163
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "Состояние полномочий: %1"
+
+#: html/Admin/Users/index.html:62
+msgid "Privileged users"
+msgstr "Полномочные пользователи"
+
+#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59
+msgid "Pseudogroup for internal use"
+msgstr ""
+
+#: html/Elements/MyRequests:30 html/Elements/MyTickets:30 html/Elements/Quicksearch:29 html/Search/Elements/PickRestriction:46 html/SelfService/Create.html:35 html/SelfService/Display.html:68 html/Ticket/Create.html:38 html/Ticket/Elements/EditBasics:64 html/Ticket/Elements/ShowBasics:43 html/User/Elements/DelegateRights:80 lib/RT/Tickets_Overlay.pm:883
+msgid "Queue"
+msgstr "Очередь"
+
+#: html/Admin/Queues/CustomField.html:42 html/Admin/Queues/Scrip.html:50 html/Admin/Queues/Scrips.html:46 html/Admin/Queues/Templates.html:43
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "Не найдена очередь %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "Не найдена очередь '%1'\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Keyword Selections"
+msgstr ""
+
+#: html/Admin/Elements/ModifyQueue:31 html/Admin/Queues/Modify.html:43
+msgid "Queue Name"
+msgstr "Имя очереди"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:263
+msgid "Queue already exists"
+msgstr "Очередь уже существует"
+
+#: lib/RT/Queue_Overlay.pm:272 lib/RT/Queue_Overlay.pm:278
+msgid "Queue could not be created"
+msgstr "Не могу создать очередь"
+
+#: html/Ticket/Create.html:209
+msgid "Queue could not be loaded."
+msgstr "Не могу загрузить очередь"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:282
+msgid "Queue created"
+msgstr "Создана очередь"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue is not specified."
+msgstr ""
+
+#: html/SelfService/Display.html:129
+msgid "Queue not found"
+msgstr "Нет такой очереди"
+
+#: html/Admin/Elements/Tabs:38 html/Admin/index.html:35
+msgid "Queues"
+msgstr "Очереди"
+
+#: html/Elements/Login:34
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "RT %1 для %2"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 от <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr ""
+
+#: html/Admin/index.html:25 html/Admin/index.html:26
+msgid "RT Administration"
+msgstr "Настройка RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "Ошибка регистрации в RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "Письмо возвращено RT: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "Ошибка конфигурации RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "Критическая ошибка RT: Сообщение не было сохранено!"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:41
+msgid "RT Error"
+msgstr "Ошибка RT"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT получил свое собственное сообщение (%1)"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr ""
+
+#: html/SelfService/Closed.html:25
+msgid "RT Self Service / Closed Tickets"
+msgstr "Самообслуживание RT / Закрытые тикеты"
+
+#: html/index.html:25 html/index.html:28
+msgid "RT at a glance"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT не может зарегистрировать вас"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT не смог найти просителя во внешней базе данных"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT не смог найти очередь: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+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 ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT выполнил ваши команды"
+
+#: html/Elements/Login:83
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "Все права на RT защищены и охраняются законом.  &copy; 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  ПО распространяется под <a href=\"http://www.gnu.org/copyleft/gpl.html\">Стандартной Общественной Лицензией GNU Версии 2.</a>"
+
+#: NOT FOUND IN SOURCE
+msgid "RT is &copy; Copyright 1996-2002 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT считает, что это сообщение может быть возвратом"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT будет обрабатывать это сообщение как неподписанное.\\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 требует использования подписи .PGP. Вы либо не подписали сообщение, либо ваша подпись не может быть проверена."
+
+#: html/Admin/Users/Modify.html:58 html/Admin/Users/Prefs.html:52 html/User/Prefs.html:44
+msgid "Real Name"
+msgstr "Имя"
+
+#: html/Admin/Elements/ModifyUser:48
+msgid "RealName"
+msgstr "Имя"
+
+#: html/Ticket/Create.html:185 html/Ticket/Elements/EditLinks:139 html/Ticket/Elements/EditLinks:94 html/Ticket/Elements/ShowLinks:63
+msgid "Referred to by"
+msgstr "На него ссылаются"
+
+#: html/Elements/SelectLinkType:28 html/Ticket/Create.html:184 html/Ticket/Elements/EditLinks:135 html/Ticket/Elements/EditLinks:80 html/Ticket/Elements/ShowLinks:55
+msgid "Refers to"
+msgstr "Ссылается на"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "Улучшить"
+
+#: html/Search/Elements/PickRestriction:27
+msgid "Refine search"
+msgstr "Улучшить поиск"
+
+#: html/Elements/Refresh:36
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "Обновлять эту страницу каждые %1 минут."
+
+#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:60 html/Ticket/ModifyAll.html:57
+msgid "Relationships"
+msgstr "Связи"
+
+#: html/Search/Bulk.html:93
+msgid "Remove AdminCc"
+msgstr "Удалить административную копию"
+
+#: html/Search/Bulk.html:91
+msgid "Remove Cc"
+msgstr "Удалить копию"
+
+#: html/Search/Bulk.html:89
+msgid "Remove Requestor"
+msgstr "Удалить просителя"
+
+#: html/Ticket/Elements/ShowTransaction:173 html/Ticket/Elements/Tabs:122
+msgid "Reply"
+msgstr "Ответить"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Reply to tickets"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "ReplyToTicket"
+msgstr ""
+
+#: etc/initialdata:44 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:87
+msgid "Requestor"
+msgstr "Проситель"
+
+#: html/Search/Elements/PickRestriction:38
+msgid "Requestor email address"
+msgstr "Email просителя"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr ""
+
+#: html/SelfService/Create.html:43 html/SelfService/Display.html:42 html/Ticket/Create.html:56 html/Ticket/Elements/EditPeople:48 html/Ticket/Elements/ShowPeople:31
+msgid "Requestors"
+msgstr "Просители"
+
+#: html/Admin/Elements/ModifyQueue:61 html/Admin/Queues/Modify.html:75
+msgid "Requests should be due in"
+msgstr "Запросы должны быть обработаны за"
+
+#: html/Elements/Submit:62
+msgid "Reset"
+msgstr "Очистить"
+
+#: html/Admin/Users/Modify.html:159 html/User/Prefs.html:50
+msgid "Residence"
+msgstr "Домашний"
+
+#: html/Ticket/Elements/Tabs:132
+msgid "Resolve"
+msgstr "Закрыть"
+
+#: html/Ticket/Update.html:133
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Resolve ticket #%1 (%2)"
+msgstr ""
+
+#: etc/initialdata:302 html/Elements/SelectDateType:28 lib/RT/Ticket_Overlay.pm:1170
+msgid "Resolved"
+msgstr "Закрыт"
+
+#: html/Search/Bulk.html:123 html/Ticket/ModifyAll.html:73 html/Ticket/Update.html:73
+msgid "Response to requestors"
+msgstr "Ответ просителям"
+
+#: html/Elements/ListActions:26
+msgid "Results"
+msgstr "Отчет"
+
+#: html/Search/Elements/PickRestriction:105
+msgid "Results per page"
+msgstr "Тикетов на страницу"
+
+#: html/Admin/Elements/ModifyUser:33 html/Admin/Users/Modify.html:100 html/User/Prefs.html:72
+msgid "Retype Password"
+msgstr "Повторите пароль"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "Право %1 не найдено для %2  %3 в рамках %4 (%5)\\n"
+
+#: lib/RT/ACE_Overlay.pm:613
+msgid "Right Delegated"
+msgstr "Право делегировано"
+
+#: lib/RT/ACE_Overlay.pm:303
+msgid "Right Granted"
+msgstr "Право выдано"
+
+#: lib/RT/ACE_Overlay.pm:161
+msgid "Right Loaded"
+msgstr "Право загружено"
+
+#: lib/RT/ACE_Overlay.pm:678 lib/RT/ACE_Overlay.pm:693
+msgid "Right could not be revoked"
+msgstr "Право не может быть отобрано"
+
+#: html/User/Delegation.html:64
+msgid "Right not found"
+msgstr "Право не найдено"
+
+#: lib/RT/ACE_Overlay.pm:543 lib/RT/ACE_Overlay.pm:638
+msgid "Right not loaded."
+msgstr "Право не загружено"
+
+#: lib/RT/ACE_Overlay.pm:689
+msgid "Right revoked"
+msgstr "Право отобрано"
+
+#: html/Admin/Elements/UserTabs:41
+msgid "Rights"
+msgstr "Права"
+
+#: lib/RT/Interface/Web.pm:758
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:791
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr ""
+
+#: html/Admin/Global/GroupRights.html:51 html/Admin/Queues/GroupRights.html:52
+msgid "Roles"
+msgstr "Псевдо-группы"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr ""
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "Суб."
+
+#: html/Admin/Queues/People.html:105 html/Ticket/Modify.html:39 html/Ticket/ModifyAll.html:94 html/Ticket/ModifyPeople.html:38
+msgid "Save Changes"
+msgstr "Сохранить изменения"
+
+#: html/Ticket/ModifyLinks.html:39
+msgid "Save changes"
+msgstr "Сохранить изменения"
+
+#: html/Admin/Global/Scrip.html:49
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:176
+msgid "Scrip Created"
+msgstr "Создан скрипт"
+
+#: html/Admin/Elements/EditScrips:84
+msgid "Scrip deleted"
+msgstr "Удален скрипт"
+
+#: html/Admin/Elements/QueueTabs:46 html/Admin/Elements/SystemTabs:33 html/Admin/Global/index.html:41
+msgid "Scrips"
+msgstr "Скрипты"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "Скрипты для %1\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+msgid "Scrips which apply to all queues"
+msgstr "Скрипты, которые действуют для всех очередей"
+
+#: html/Elements/SimpleSearch:27 html/Search/Elements/PickRestriction:126 html/Ticket/Elements/Tabs:159
+msgid "Search"
+msgstr "Поиск"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "Параметры поиска"
+
+#: html/Approvals/Elements/PendingMyApproval:39
+msgid "Search for approvals"
+msgstr "Искать визы"
+
+#: bin/rt-crontool:188
+msgid "Security:"
+msgstr "Безопасность:"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "SeeQueue"
+msgstr ""
+
+#: html/Admin/Groups/index.html:40
+msgid "Select a group"
+msgstr "Выбор группы"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "Выбор очереди"
+
+#: html/Admin/Users/index.html:25 html/Admin/Users/index.html:28
+msgid "Select a user"
+msgstr "Выбор пользователя"
+
+#: html/Admin/Global/CustomField.html:38 html/Admin/Global/CustomFields.html:36
+msgid "Select custom field"
+msgstr ""
+
+#: html/Admin/Elements/GroupTabs:52 html/User/Elements/GroupTabs:50
+msgid "Select group"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Select multiple values"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:352
+msgid "Select one value"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:67
+msgid "Select queue"
+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 ""
+
+#: html/Admin/Global/Template.html:57 html/Admin/Global/Templates.html:36 html/Admin/Queues/Template.html:55
+msgid "Select template"
+msgstr ""
+
+#: html/Admin/Elements/UserTabs:49
+msgid "Select user"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "SelectMultiple"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectSingle"
+msgstr ""
+
+#: html/SelfService/index.html:25
+msgid "Self Service"
+msgstr "Самообслуживание"
+
+#: etc/initialdata:114
+msgid "Send mail to all watchers"
+msgstr ""
+
+#: etc/initialdata:110
+msgid "Send mail to all watchers as a \"comment\""
+msgstr ""
+
+#: etc/initialdata:105
+msgid "Send mail to requestors and Ccs"
+msgstr ""
+
+#: etc/initialdata:100
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:79
+msgid "Sends a message to the requestors"
+msgstr ""
+
+#: etc/initialdata:118 etc/initialdata:122
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr ""
+
+#: etc/initialdata:95
+msgid "Sends mail to the administrative Ccs"
+msgstr ""
+
+#: etc/initialdata:91
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr ""
+
+#: etc/initialdata:83 etc/initialdata:87
+msgid "Sends mail to the owner"
+msgstr ""
+
+#: lib/RT/Date.pm:419
+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 "Показать завизированные запросы"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show basics"
+msgstr "Показать главное"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show denied requests"
+msgstr "Показать отвергнутые запросы"
+
+#: html/Ticket/Create.html:144 html/Ticket/Create.html:34
+msgid "Show details"
+msgstr "Показать все"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show pending requests"
+msgstr "Показать ожидающие запросы"
+
+#: html/Approvals/Elements/PendingMyApproval:46
+msgid "Show requests awaiting other approvals"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Show ticket private commentary"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "Show ticket summaries"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ShowACL"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowScrips"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ShowTemplate"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:79
+msgid "ShowTicket"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "ShowTicketComments"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Sign up as a ticket or queue AdminCc"
+msgstr ""
+
+#: html/Admin/Elements/ModifyUser:39 html/Admin/Users/Modify.html:191 html/Admin/Users/Prefs.html:32 html/SelfService/Prefs.html:37 html/User/Prefs.html:112
+msgid "Signature"
+msgstr "Подпись"
+
+#: html/SelfService/Elements/Header:52
+#. ($session{'CurrentUser'}->Name)
+msgid "Signed in as %1"
+msgstr ""
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Single"
+msgstr "Одно значение"
+
+#: html/Elements/Header:51
+msgid "Skip Menu"
+msgstr ""
+
+#: html/Admin/Elements/EditCustomFieldValues:31
+msgid "Sort key"
+msgstr "Ключ для сортировки"
+
+#: html/Search/Elements/PickRestriction:109
+msgid "Sort results by"
+msgstr "Сортировать по полю"
+
+#: html/Admin/Elements/AddCustomFieldValue:25
+msgid "SortOrder"
+msgstr "Порядок сортировки"
+
+#: NOT FOUND IN SOURCE
+msgid "Stalled"
+msgstr "Отложенных"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "Начальная страница"
+
+#: html/Elements/SelectDateType:27 html/Ticket/Elements/EditDates:32 html/Ticket/Elements/ShowDates:35
+msgid "Started"
+msgstr "Начался"
+
+#: NOT FOUND IN SOURCE
+msgid "Started date '%1' could not be parsed"
+msgstr "Не могу разобрать дату 'Начался': '%1'"
+
+#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:27 html/Ticket/Elements/ShowDates:31
+msgid "Starts"
+msgstr "Начнется"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "Запуски"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts date '%1' could not be parsed"
+msgstr "Не могу разобрать дату 'Запуски': '%1'"
+
+#: html/Admin/Elements/ModifyUser:82 html/Admin/Users/Modify.html:138 html/User/Prefs.html:94
+msgid "State"
+msgstr "Состояние"
+
+#: html/Elements/MyRequests:31 html/Elements/MyTickets:31 html/Search/Elements/PickRestriction:74 html/SelfService/Display.html:59 html/SelfService/Elements/MyRequests:29 html/SelfService/Update.html:31 html/Ticket/Create.html:42 html/Ticket/Elements/EditBasics:38 html/Ticket/Elements/ShowBasics:31 html/Ticket/Update.html:60 lib/RT/Ticket_Overlay.pm:1164 lib/RT/Tickets_Overlay.pm:908
+msgid "Status"
+msgstr "Статус"
+
+#: etc/initialdata:288
+msgid "Status Change"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:530
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+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 "Отобрать"
+
+#: lib/RT/Transaction_Overlay.pm:589
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "Отобран у %1"
+
+#: html/Elements/MyRequests:29 html/Elements/MyTickets:29 html/Search/Bulk.html:126 html/Search/Elements/PickRestriction:43 html/SelfService/Create.html:59 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:35 html/Ticket/Create.html:84 html/Ticket/Elements/EditBasics:28 html/Ticket/ModifyAll.html:79 html/Ticket/Update.html:77 lib/RT/Ticket_Overlay.pm:1160 lib/RT/Tickets_Overlay.pm:987
+msgid "Subject"
+msgstr "Тема"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:611
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr ""
+
+#: html/Elements/Submit:59
+msgid "Submit"
+msgstr "Готово"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr ""
+
+#: lib/RT/Group_Overlay.pm:749
+msgid "Succeeded"
+msgstr ""
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "Вск."
+
+#: lib/RT/System.pm:54
+msgid "SuperUser"
+msgstr ""
+
+#: html/User/Elements/DelegateRights:77
+msgid "System"
+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 "Ошибка системы. Право не было делегировано."
+
+#: lib/RT/ACE_Overlay.pm:146 lib/RT/ACE_Overlay.pm:223 lib/RT/ACE_Overlay.pm:306 lib/RT/ACE_Overlay.pm:898
+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 ""
+
+#: lib/RT/CurrentUser.pm:320
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: html/Ticket/Elements/Tabs:143
+msgid "Take"
+msgstr "Взять"
+
+#: lib/RT/Transaction_Overlay.pm:575
+msgid "Taken"
+msgstr "Взят"
+
+#: html/Admin/Elements/EditScrip:81
+msgid "Template"
+msgstr "Шаблон"
+
+#: html/Admin/Global/Template.html:91 html/Admin/Queues/Template.html:90
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr ""
+
+#: html/Admin/Elements/EditTemplates:89
+msgid "Template deleted"
+msgstr ""
+
+#: lib/RT/Scrip_Overlay.pm:153
+msgid "Template not found"
+msgstr "Шаблон не найден"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "Шаблон не найден\\n"
+
+#: lib/RT/Template_Overlay.pm:347
+msgid "Template parsed"
+msgstr "Шаблон обработан"
+
+#: html/Admin/Elements/QueueTabs:49 html/Admin/Elements/SystemTabs:36 html/Admin/Global/index.html:45
+msgid "Templates"
+msgstr "Шаблоны"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "Шаблоны для %1\\n"
+
+#: lib/RT/Interface/Web.pm:858
+msgid "That is already the current value"
+msgstr ""
+
+#: lib/RT/CustomField_Overlay.pm:178
+msgid "That is not a value for this custom field"
+msgstr "Это поле не может иметь такого значения"
+
+#: lib/RT/Ticket_Overlay.pm:1886
+msgid "That is the same value"
+msgstr "Значение не изменилось"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "Этот пользователь уже %1 для этой очереди"
+
+#: lib/RT/Ticket_Overlay.pm:1434
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "Этот пользователь уже %1 для этого тикета"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "Этот пользователь не %1 этой очереди"
+
+#: lib/RT/Ticket_Overlay.pm:1551
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "Этот пользователь не %1 этому тикету"
+
+#: lib/RT/Ticket_Overlay.pm:1882
+msgid "That queue does not exist"
+msgstr "Этой очереди не существует"
+
+#: lib/RT/Ticket_Overlay.pm:3143
+msgid "That ticket has unresolved dependencies"
+msgstr "Этот тикет имеет неразрешенные зависимости"
+
+#: lib/RT/ACE_Overlay.pm:288 lib/RT/ACE_Overlay.pm:597
+msgid "That user already has that right"
+msgstr "Пользователь уже имеет это право"
+
+#: lib/RT/Ticket_Overlay.pm:2952
+msgid "That user already owns that ticket"
+msgstr "Пользователь уже владеет этим тикетом"
+
+#: lib/RT/Ticket_Overlay.pm:2918
+msgid "That user does not exist"
+msgstr "Пользователь не существует"
+
+#: lib/RT/User_Overlay.pm:315
+msgid "That user is already privileged"
+msgstr "Этот пользователь уже имеет все полномочия"
+
+#: lib/RT/User_Overlay.pm:332
+msgid "That user is already unprivileged"
+msgstr "Этот пользователь уже не имеет полномочий"
+
+#: lib/RT/User_Overlay.pm:327
+msgid "That user is now privileged"
+msgstr "Этот пользователь теперь имеет все полномочия"
+
+#: lib/RT/User_Overlay.pm:344
+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 "Этот пользователь не может владеть тикетами из этой очереди"
+
+#: lib/RT/Link_Overlay.pm:206
+msgid "That's not a numerical id"
+msgstr "Это не числовой идентификатор"
+
+#: html/Ticket/Create.html:150 html/Ticket/Elements/ShowSummary:28
+msgid "The Basics"
+msgstr "Главное"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The CC of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:89
+msgid "The administrative CC of a ticket"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:2213
+msgid "The comment has been recorded"
+msgstr "Записан комментарий"
+
+#: bin/rt-crontool:198
+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 ""
+
+#: bin/rt-commit-handler:756 bin/rt-commit-handler:766
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "Эти команды не были исполнены:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:861
+msgid "The new value has been set."
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The owner of a ticket"
+msgstr ""
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The requestor of a ticket"
+msgstr ""
+
+#: html/Admin/Elements/EditUserComments:26
+msgid "These comments aren't generally visible to the user"
+msgstr "Эти комментарии не показываются обыкновенному пользователю"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "Этот тикет %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:189
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "Этот инструмент позволяет пользователю запускать некоторые модули Perl из RT."
+
+#: lib/RT/Transaction_Overlay.pm:253
+msgid "This transaction appears to have no content"
+msgstr "Похоже, что эта транзакция не имеет информации"
+
+#: html/Ticket/Elements/ShowRequestor:47
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "25 важнейших тикетов пользователя..."
+
+#: lib/RT/Date.pm:391
+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"
+msgstr "Тикет #%1 Обновление всего: %2"
+
+#: html/Approvals/Elements/ShowDependency:46
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:608
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "Тикет %1 создан в очереди '%2'"
+
+#: bin/rt-commit-handler:760
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "Загружен тикет %1\\n"
+
+#: html/Search/Bulk.html:181
+#. ($Ticket->Id,$_)
+msgid "Ticket %1: %2"
+msgstr "Тикет %1: %2"
+
+#: html/Ticket/History.html:25 html/Ticket/History.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "История тикета # %1 %2"
+
+#: html/SelfService/Display.html:34
+msgid "Ticket Id"
+msgstr "Тикет #"
+
+#: etc/initialdata:303
+msgid "Ticket Resolved"
+msgstr ""
+
+#: html/Search/Elements/PickRestriction:63
+msgid "Ticket attachment"
+msgstr "Для вложений"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "Текст тикета"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+msgid "Ticket content type"
+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 ""
+
+#: lib/RT/Transaction_Overlay.pm:522
+msgid "Ticket created"
+msgstr "Создан тикет"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "Не удалось создать тикет"
+
+#: lib/RT/Transaction_Overlay.pm:527
+msgid "Ticket deleted"
+msgstr "Тикет удален"
+
+#: html/REST/1.0/modify:29 html/REST/1.0/update:34
+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 ""
+
+#: html/Ticket/Update.html:39
+msgid "Ticket watchers"
+msgstr "Наблюдатели для тикета"
+
+#: html/Elements/Tabs:49
+msgid "Tickets"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr ""
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr ""
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Tickets from %1"
+msgstr "Тикеты от %1"
+
+#: html/Approvals/Elements/ShowDependency:27
+msgid "Tickets which depend on this approval:"
+msgstr "От этой визы зависят следующие тикеты:"
+
+#: html/Ticket/Create.html:157 html/Ticket/Elements/EditBasics:48
+msgid "Time Left"
+msgstr "Осталось"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:43
+msgid "Time Worked"
+msgstr "В работе"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "Осталось"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "Время для показа"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "В работе"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr ""
+
+#: lib/RT/Ticket_Overlay.pm:1165
+msgid "TimeWorked"
+msgstr ""
+
+#: bin/rt-commit-handler:402
+msgid "To generate a diff of this commit:"
+msgstr "Для генерации дифа этого коммита:"
+
+#: bin/rt-commit-handler:391
+msgid "To generate a diff of this commit:\\n"
+msgstr "Для генерации дифа этого коммита:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1168
+msgid "Told"
+msgstr "Контакт"
+
+#: etc/initialdata:237
+msgid "Transaction"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:642
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "Транзакция %1 удалена"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "Создана транзакция"
+
+#: lib/RT/Transaction_Overlay.pm:89
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:701
+msgid "Transactions are immutable"
+msgstr "Транзакции не изменены"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "Пытаемся удалить право: %1"
+
+#: lib/RT/Date.pm:389
+msgid "Tue."
+msgstr "Втр."
+
+#: html/Admin/Elements/EditCustomField:34 html/Ticket/Elements/AddWatchers:33 html/Ticket/Elements/AddWatchers:44 html/Ticket/Elements/AddWatchers:54 lib/RT/Ticket_Overlay.pm:1166 lib/RT/Tickets_Overlay.pm:959
+msgid "Type"
+msgstr "Тип"
+
+#: lib/RT/ScripCondition_Overlay.pm:104
+msgid "Unimplemented"
+msgstr "Не реализовано"
+
+#: html/Admin/Users/Modify.html:68
+msgid "Unix login"
+msgstr "Логин UNIX"
+
+#: html/Admin/Elements/ModifyUser:62
+msgid "UnixUsername"
+msgstr "Имя пользователя UNIX"
+
+#: lib/RT/Attachment_Overlay.pm:265
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "Неизвестная кодировка %1"
+
+#: html/Elements/SelectResultsPerPage:37
+msgid "Unlimited"
+msgstr "Не ограничено"
+
+#: etc/initialdata:32
+msgid "Unprivileged"
+msgstr ""
+
+#: lib/RT/Transaction_Overlay.pm:571
+msgid "Untaken"
+msgstr "Ничей"
+
+#: html/Elements/MyTickets:64 html/Search/Bulk.html:33
+msgid "Update"
+msgstr "Обновить"
+
+#: html/Admin/Users/Prefs.html:62
+msgid "Update ID"
+msgstr "Обновить идентификатор"
+
+#: html/Search/Bulk.html:120 html/Ticket/ModifyAll.html:66 html/Ticket/Update.html:67
+msgid "Update Type"
+msgstr "Обновить тип"
+
+#: html/Search/Listing.html:61
+msgid "Update all these tickets at once"
+msgstr "Изменить одним махом"
+
+#: html/Admin/Users/Prefs.html:49
+msgid "Update email"
+msgstr "Обновить e-mail"
+
+#: html/Admin/Users/Prefs.html:55
+msgid "Update name"
+msgstr "Обновить имя"
+
+#: lib/RT/Interface/Web.pm:375
+msgid "Update not recorded."
+msgstr "Изменения не сохранены."
+
+#: html/Search/Bulk.html:81
+msgid "Update selected tickets"
+msgstr "Изменить выбранные тикеты"
+
+#: html/Admin/Users/Prefs.html:36
+msgid "Update signature"
+msgstr "Обновить подпись"
+
+#: html/Ticket/ModifyAll.html:63
+msgid "Update ticket"
+msgstr "Обновить тикет"
+
+#: html/SelfService/Update.html:25 html/SelfService/Update.html:27
+#. ($Ticket->id)
+msgid "Update ticket # %1"
+msgstr "Обновить тикет # %1"
+
+#: html/SelfService/Update.html:50
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "Обновить тикет # %1"
+
+#: html/Ticket/Update.html:135
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr ""
+
+#: lib/RT/Interface/Web.pm:373
+msgid "Update type was neither correspondence nor comment."
+msgstr "Обновление не было ни сообщением, ни комментарием."
+
+#: html/Elements/SelectDateType:33 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1169
+msgid "Updated"
+msgstr "Обновлен"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "Пользователь %1 %2: %3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "Пользователь %1 Пароль: %2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "Пользователь '%1' не найден"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "Пользователь '%1' не найден\\n"
+
+#: etc/initialdata:125 etc/initialdata:191
+msgid "User Defined"
+msgstr ""
+
+#: html/Admin/Users/Prefs.html:59
+msgid "User ID"
+msgstr "Логин"
+
+#: html/Elements/SelectUsers:26
+msgid "User Id"
+msgstr "Логин"
+
+#: html/Admin/Elements/GroupTabs:47 html/Admin/Elements/QueueTabs:60 html/Admin/Elements/SystemTabs:47 html/Admin/Global/index.html:59
+msgid "User Rights"
+msgstr "Права пользователя"
+
+#: html/Admin/Users/Modify.html:226
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "Не могу создать пользователя: %1"
+
+#: lib/RT/User_Overlay.pm:262
+msgid "User created"
+msgstr "Создан пользователь"
+
+#: html/Admin/Global/GroupRights.html:67 html/Admin/Groups/GroupRights.html:54 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "Группы, определенные пользователем"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "Пользователю отослано напоминание"
+
+#: html/Admin/Users/Prefs.html:25 html/Admin/Users/Prefs.html:29
+msgid "User view"
+msgstr "Пользовательские настройки"
+
+#: html/Admin/Users/Modify.html:48 html/Elements/Login:42 html/Ticket/Elements/AddWatchers:35
+msgid "Username"
+msgstr "Логин"
+
+#: html/Admin/Elements/SelectNewGroupMembers:26 html/Admin/Elements/Tabs:32 html/Admin/Groups/Members.html:55 html/Admin/Queues/People.html:68 html/Admin/index.html:29 html/User/Groups/Members.html:58
+msgid "Users"
+msgstr "Пользователи"
+
+#: html/Admin/Users/index.html:65
+msgid "Users matching search criteria"
+msgstr "Найдены пользователи"
+
+#: html/Search/Elements/PickRestriction:51
+msgid "ValueOfQueue"
+msgstr "ValueOfQueue"
+
+#: html/Admin/Elements/EditCustomField:40
+msgid "Values"
+msgstr "Значения"
+
+#: NOT FOUND IN SOURCE
+msgid "VrijevormEnkele"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "Watch"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "WatchAsAdminCc"
+msgstr ""
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr ""
+
+#: html/Admin/Elements/QueueTabs:42
+msgid "Watchers"
+msgstr "Наблюдатели"
+
+#: html/Admin/Elements/ModifyUser:56
+msgid "WebEncoding"
+msgstr "WebEncoding"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "Срд."
+
+#: etc/upgrade/2.1.71:161
+msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/upgrade/2.1.71:135
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr ""
+
+#: etc/initialdata:138
+msgid "When a ticket is created"
+msgstr ""
+
+#: 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 ""
+
+#: etc/initialdata:143
+msgid "When anything happens"
+msgstr ""
+
+#: etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr ""
+
+#: etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr ""
+
+#: etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr ""
+
+#: etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr ""
+
+#: etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr ""
+
+#: etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr ""
+
+#: etc/initialdata:149
+msgid "Whenever correspondence comes in"
+msgstr ""
+
+#: html/Admin/Users/Modify.html:164 html/User/Prefs.html:52
+msgid "Work"
+msgstr "Рабочий"
+
+#: html/Admin/Elements/ModifyUser:70
+msgid "WorkPhone"
+msgstr "Рабочий"
+
+#: html/SelfService/Display.html:86 html/Ticket/Elements/ShowBasics:35 html/Ticket/Update.html:65
+msgid "Worked"
+msgstr "В работе"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "You already own this ticket"
+msgstr "Вы уже владеете этим тикетом"
+
+#: html/autohandler:121
+msgid "You are not an authorized user"
+msgstr "Вам сюда запрещено"
+
+#: lib/RT/Ticket_Overlay.pm:2930
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "Вы можете назначать владельца только для своих или ничьих тикетов."
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "У вас нет права на просмотр этого тикета.\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "You found %1 tickets in queue %2"
+
+#: html/NoAuth/Logout.html:31 html/REST/1.0/logout:25
+msgid "You have been logged out of RT."
+msgstr "Вы вышли из RT."
+
+#: html/SelfService/Display.html:134
+msgid "You have no permission to create tickets in that queue."
+msgstr "У вас нет права создавать тикеты в этой очереди."
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "You may not create requests in that queue."
+msgstr "Вы не можете создавать запросы в этой очереди."
+
+#: html/NoAuth/Logout.html:36
+msgid "You're welcome to login again"
+msgstr "Заходите еще"
+
+#: html/SelfService/Elements/MyRequests:25
+#. ($friendly_status)
+msgid "Your %1 requests"
+msgstr "Ваши запросы: %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Your RT administrator has misconfigured the mail aliases which invoke RT"
+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 ""
+
+#: 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 ""
+
+#: etc/initialdata:384 etc/upgrade/2.1.71:101
+msgid "Your request was rejected."
+msgstr ""
+
+#: html/autohandler:136 html/autohandler:142
+msgid "Your username or password is incorrect"
+msgstr "Вы ввели неверное имя или пароль"
+
+#: html/Admin/Elements/ModifyUser:84 html/Admin/Users/Modify.html:144 html/User/Prefs.html:96
+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"
+msgstr "с правами %1"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:34
+msgid "contains"
+msgstr "содержит"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content"
+msgstr "данные"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "content-type"
+msgstr "тип данных"
+
+#: lib/RT/Ticket_Overlay.pm:2282
+msgid "correspondence (probably) not sent"
+msgstr "сообщение (возможно) не отправлено"
+
+#: lib/RT/Ticket_Overlay.pm:2292
+msgid "correspondence sent"
+msgstr "отправлено сообщение"
+
+#: html/Admin/Elements/ModifyQueue:63 html/Admin/Queues/Modify.html:77 lib/RT/Date.pm:319
+msgid "days"
+msgstr "дней"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr ""
+
+#: html/Search/Listing.html:75
+msgid "delete"
+msgstr "удалить"
+
+#: lib/RT/Queue_Overlay.pm:63
+msgid "deleted"
+msgstr "удален"
+
+#: html/Search/Elements/PickRestriction:68
+msgid "does not match"
+msgstr "не совпадает"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:35
+msgid "doesn't contain"
+msgstr "не содержит"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "equal to"
+msgstr "равняется"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr ""
+
+#: html/Elements/SelectAttachmentField:28
+msgid "filename"
+msgstr "имя файла"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "greater than"
+msgstr "больше чем"
+
+#: lib/RT/Group_Overlay.pm:194
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "группа '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "часов"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "идентификатор"
+
+#: html/Elements/SelectBoolean:32 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:36 html/Search/Elements/PickRestriction:47 html/Search/Elements/PickRestriction:76 html/Search/Elements/PickRestriction:88
+msgid "is"
+msgstr "является"
+
+#: html/Elements/SelectBoolean:36 html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectMatch:37 html/Search/Elements/PickRestriction:48 html/Search/Elements/PickRestriction:77 html/Search/Elements/PickRestriction:89
+msgid "isn't"
+msgstr "не является"
+
+#: html/Elements/SelectCustomFieldOperator:38 html/Elements/SelectEqualityOperator:38
+msgid "less than"
+msgstr "меньше чем"
+
+#: html/Search/Elements/PickRestriction:67
+msgid "matches"
+msgstr "совпадает"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "мин"
+
+#: html/Ticket/Update.html:66
+msgid "minutes"
+msgstr "минут"
+
+#: bin/rt-commit-handler:765
+msgid "modifications\\n\\n"
+msgstr "изменения\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "месяцев"
+
+#: lib/RT/Queue_Overlay.pm:58
+msgid "new"
+msgstr "новый"
+
+#: html/Admin/Elements/EditScrips:43
+msgid "no value"
+msgstr ""
+
+#: html/Ticket/Elements/EditWatchers:28
+msgid "none"
+msgstr "нет"
+
+#: html/Elements/SelectEqualityOperator:38
+msgid "not equal to"
+msgstr "не равен"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr ""
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "open"
+msgstr "открыт"
+
+#: lib/RT/Group_Overlay.pm:199
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "личная группа '%1' для пользователя '%2'"
+
+#: lib/RT/Group_Overlay.pm:207
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "очередь %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "rejected"
+msgstr "отклонен"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "resolved"
+msgstr "решен"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "сек"
+
+#: lib/RT/Queue_Overlay.pm:60
+msgid "stalled"
+msgstr "отложен"
+
+#: lib/RT/Group_Overlay.pm:202
+#. ($self->Type)
+msgid "system %1"
+msgstr "система %1"
+
+#: lib/RT/Group_Overlay.pm:213
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "системная группа '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:42
+msgid "the calling component did not specify why"
+msgstr "вызывающий компонент не указал причину"
+
+#: lib/RT/Group_Overlay.pm:210
+#. ($self->Instance, $self->Type)
+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
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "пользователь %1"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "недель"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+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
new file mode 100644 (file)
index 0000000..ededc1a
--- /dev/null
@@ -0,0 +1,6384 @@
+# Traditional Chinese localization catalog for Request Tracker (RT)
+msgid ""
+msgstr ""
+"Last-Translator: Autrijus Tang <autrijus@autrijus.org>\n"
+"Language-Team: Chinese <members@ourinet.com>\n"
+"MIME-Version: 1.0\n"
+"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
+msgid "#"
+msgstr "#"
+
+#: NOT FOUND IN SOURCE
+msgid "#%1"
+msgstr "#%1"
+
+#: 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
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($Ticket->id, $Ticket->Subject)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%*(%1,group ticket)"
+msgstr "%*(%1) 件参与的申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "%*(%1,ticket) due"
+msgstr "%*(%1) 件限期完成的申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "%*(%1,unresolved ticket)"
+msgstr "%*(%1) 件尚未解决的申请单"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+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
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%2 已新增为 %1"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "%1 %2 之前"
+
+#: lib/RT/Ticket_Overlay.pm:3547 lib/RT/Transaction_Overlay.pm:564
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+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
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%2 已自 %1 删除"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:157
+#. ($depth_str, $role_str, $group_str)
+msgid "%1 %2 of group %3"
+msgstr "%3 群组的 %1 %2"
+
+#: html/Admin/Elements/EditScrips:43 html/Admin/Elements/ListGlobalScrips:27
+#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name))
+msgid "%1 %2 with template %3"
+msgstr "条件:%1 | 动作:%2 | 模板:%3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 这份申请单\\n"
+
+#: html/Search/Listing.html:56 html/Work/Search/index.html:28
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "显示第 %1 - %2 笔"
+
+#: bin/rt-crontool:168 bin/rt-crontool:175 bin/rt-crontool:181
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - 传递给 %2 的一个参数"
+
+#: bin/rt-crontool:184
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - 将更新状态输出到 STDOUT"
+
+#: bin/rt-crontool:178
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - 指定欲使用的动作模块"
+
+#: bin/rt-crontool:172
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - 指定欲使用的条件模块"
+
+#: bin/rt-crontool:165
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - 指定欲使用的查询模块"
+
+#: lib/RT/ScripAction_Overlay.pm:121
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "加载手续 %1"
+
+#: html/Edit/Elements/Page:48
+#. (scalar $count)
+msgid "%1 Total"
+msgstr "共 %1 笔"
+
+#: lib/RT/Ticket_Overlay.pm:3574
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "新增 %1 作为 %2 的值"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "别名 %1 需要可用的申请单编号"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "别名 %1 需要可用的申请单编号 "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "别名 %1 需要可用的申请单编号以处理 %3(出自 %2)"
+
+#: lib/RT/Link_Overlay.pm:116 lib/RT/Link_Overlay.pm:123
+#. ($args{'Base'})
+#. ($args{'Target'})
+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
+#. ($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
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 的值从 %2 改为 %3"
+
+#: lib/RT/Interface/Web.pm:893
+msgid "%1 could not be set to %2."
+msgstr "无法将 %1 设定为 %2。"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 无法初始更新 (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2839
+#. ($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
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "前 %1 份待处理申请单..."
+
+#: html/Elements/MyRequests:24 html/Work/Elements/MyRequests:6
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "前 %1 份送出的申请单..."
+
+#: html/Work/Elements/MyApprovals:5
+#. ($rows)
+msgid "%1 highest priority tickets pending my approval..."
+msgstr "前 %1 份待签核申请单..."
+
+#: bin/rt-crontool:160
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 是从外部排程程序(如 cron)来对申请单进行操作的工具。"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 已不再是此表单的 %2。"
+
+#: lib/RT/Ticket_Overlay.pm:1578
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 已不再是此申请单的 %2。"
+
+#: lib/RT/Ticket_Overlay.pm:3630
+#. ($args{'Value'}, $cf->Name)
+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 "%1 不是一个合法的表单编号。"
+
+#: html/Ticket/Elements/ShowBasics:35
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 分钟"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "没有显示 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 result(s) found"
+msgstr "找到 %1 项结果"
+
+#: html/User/Elements/DelegateRights:75
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1权限"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 完成\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "不知道 $MessageID 的 %1 类别"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "不知道 %2 的 %1 类别"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 was created without a CurrentUser\\n"
+msgstr "%1 新增时未指定现行使用者"
+
+#: lib/RT/Action/ResolveMembers.pm:41
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 会解决在已解决群组里成员的申请单。"
+
+#: lib/RT/Action/StallDependent.pm:40
+#. (ref $self)
+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
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1:未指定附件"
+
+#: html/Ticket/Elements/ShowTransaction:89 html/Work/Tickets/Elements/ShowTransaction:152
+#. ($size)
+msgid "%1b"
+msgstr "%1 字节"
+
+#: html/Ticket/Elements/ShowTransaction:86 html/Work/Tickets/Elements/ShowTransaction:149
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k 字节"
+
+#: NOT FOUND IN SOURCE
+msgid "%quant(%1,result) found"
+msgstr "找到 %1 项结果"
+
+#: lib/RT/Ticket_Overlay.pm:1148
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' 不是一个合法的状态值"
+
+#: NOT FOUND IN SOURCE
+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/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
+msgid "(Check box to delete)"
+msgstr "(点选欲删除的项目)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check boxes to delete)"
+msgstr "(点选欲删除的项目)"
+
+#: html/Ticket/Create.html:177
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(键入申请单编号或网址,以空白分隔)"
+
+#: html/Admin/Queues/Modify.html:53 html/Admin/Queues/Modify.html:59
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(如果留白, 则预设为 %1)"
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(没有值)"
+
+#: html/Admin/Elements/EditCustomFields:32 html/Admin/Elements/ListGlobalCustomFields:31
+msgid "(No custom fields)"
+msgstr "(没有自订字段)"
+
+#: html/Admin/Groups/Members.html:49 html/User/Groups/Members.html:52
+msgid "(No members)"
+msgstr "(没有成员)"
+
+#: html/Admin/Elements/EditScrips:31 html/Admin/Elements/ListGlobalScrips:31
+msgid "(No scrips)"
+msgstr "(没有手续)"
+
+#: html/Admin/Elements/EditTemplates:30
+msgid "(No templates)"
+msgstr "没有模板"
+
+#: html/Admin/Elements/EditWorkflows:31
+msgid "(No workflows)"
+msgstr "没有流程"
+
+#: html/Ticket/Update.html:83 html/Work/Tickets/Update.html:52
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(送出本份更新的密件副本给名单上以逗号隔开的电子邮件地址。这<b>不会</b>更改后续的收件者名单。)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(送出本份更新的密件副本给名单上以逗号隔开的电子邮件地址。这<b>不会</b>更改后续的收件者名单。)"
+
+#: html/Ticket/Create.html:78
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(送出本份更新的副本给名单上以逗号隔开的管理员电子邮件地址。这<b>将会</b>更改后续的收件者名单。)"
+
+#: html/Ticket/Update.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(送出本份更新的副本给名单上以逗号隔开的电子邮件地址。这<b>不会</b>更改后续的收件者名单。)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(送出本份更新的副本给名单上以逗号隔开的电子邮件地址。这<b>不会</b>更改后续的收件者名单。)"
+
+#: html/Ticket/Create.html:68
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(送出本份更新的副本给名单上以逗号隔开的电子邮件地址。这<b>将会</b>更改后续的收件者名单。)"
+
+#: html/Ticket/Elements/EditCustomFieldEntries:35 html/Work/Tickets/Elements/EditCustomFieldEntries:33 html/Work/Tickets/Elements/ShowCustomFieldEntries:13
+msgid "(delete)"
+msgstr "(删除)"
+
+#: html/Admin/Groups/index.html:32 html/User/Groups/index.html:32
+msgid "(empty)"
+msgstr "(空白)"
+
+#: html/Edit/Global/CustomField/index.html:113 html/Edit/Global/Scrip/index.html:111 html/Edit/Global/Template/index.html:106
+msgid "(new)"
+msgstr "(新增)"
+
+#: html/Admin/Users/index.html:38
+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
+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
+msgid "(no value)"
+msgstr "(无)"
+
+#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:115 html/Work/Search/BulkLinks:3
+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
+msgid "(pending approval)"
+msgstr "(等待签核)"
+
+#: html/Elements/MyRequests:53 html/Elements/MyTickets:56 html/Work/Elements/MyRequests:48 html/Work/Elements/MyTickets:58
+msgid "(pending other tickets)"
+msgstr "(等待其它申请单)"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:246
+msgid "(requestor's group)"
+msgstr "(申请人所属)"
+
+#: html/Admin/Users/Modify.html:49
+msgid "(required)"
+msgstr "(必填)"
+
+#: html/Ticket/Elements/ShowTransaction:92 html/Work/Tickets/Elements/ShowTransaction:37
+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 ":"
+
+#: html/Ticket/Elements/ShowBasics:31
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:26
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 html/Work/Elements/104Header:43
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"提出申请单\">&nbsp;%1"
+
+#: etc/initialdata:221
+msgid "A blank template"
+msgstr "空白模板"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE 已删除"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE 已加载"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr "无法删除 ACE"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr "找不到 ACE"
+
+#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:179
+msgid "ACE not found"
+msgstr "找不到 ACE 设定"
+
+#: lib/RT/ACE_Overlay.pm:830
+msgid "ACEs can only be created and deleted."
+msgstr "祇能新增或删除 ACE 设定。"
+
+#: NOT FOUND IN SOURCE
+msgid "ACLEquivalence"
+msgstr "ACLEquivalence"
+
+#: bin/rt-commit-handler:754
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "离开以免不小心更改到申请单。\\n"
+
+#: html/User/Elements/Tabs:31
+msgid "About me"
+msgstr "个人信息"
+
+#: html/Edit/Users/System:12
+msgid "Access Right"
+msgstr "系统使用登录权限"
+
+#: html/Admin/Users/Modify.html:79
+msgid "Access control"
+msgstr "存取权限"
+
+#: html/Admin/Elements/EditScrip:56 html/Work/Tickets/Elements/ShowTransaction:18
+msgid "Action"
+msgstr "动作"
+
+#: lib/RT/Scrip_Overlay.pm:146
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "动作 %1 找不到"
+
+#: bin/rt-crontool:122
+msgid "Action committed."
+msgstr "动作执行完毕"
+
+#: bin/rt-crontool:118
+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
+msgid "Activated Date"
+msgstr "申请激活时间"
+
+#: html/Edit/Elements/104Buttons:71 html/Edit/Elements/ListButtons:7
+msgid "Add"
+msgstr "新增"
+
+#: html/Search/Bulk.html:95 html/Work/Search/Bulk.html:74
+msgid "Add AdminCc"
+msgstr "新增管理员副本收件人"
+
+#: html/Search/Bulk.html:91 html/Work/Search/Bulk.html:68
+msgid "Add Cc"
+msgstr "新增副本收件人"
+
+#: html/Ticket/Elements/EditCustomFieldEntries:71 html/Work/Tickets/Elements/ShowCustomFieldEntries:49
+msgid "Add Entry"
+msgstr "新增列"
+
+#: html/Ticket/Create.html:113 html/Ticket/Update.html:98 html/Work/Tickets/Elements/AddAttachments:18
+msgid "Add More Files"
+msgstr "新增更多附件"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:112 html/Admin/Elements/ModifyTemplateAsWorkflow:45
+msgid "Add Next State"
+msgstr "新增下一项关卡"
+
+#: html/Search/Bulk.html:87 html/Work/Search/Bulk.html:62
+msgid "Add Requestor"
+msgstr "新增申请人"
+
+#: html/Admin/Elements/AddCustomFieldValue:24
+msgid "Add Value"
+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:54
+msgid "Add a scrip which will apply to all queues"
+msgstr "新增一道用于所有表单的手续"
+
+#: html/Search/Bulk.html:127 html/Work/Search/Bulk.html:80
+msgid "Add comments or replies to selected tickets"
+msgstr "新增评论或回复到指定的申请单"
+
+#: html/Admin/Groups/Members.html:41 html/User/Groups/Members.html:38
+msgid "Add members"
+msgstr "新增成员"
+
+#: html/Admin/Queues/People.html:65 html/Ticket/Elements/AddWatchers:27
+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"
+msgstr "单位已新增为此表单的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1462
+#. ($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
+msgid "Address1"
+msgstr "住址"
+
+#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:89 html/Work/Preferences/Info:78
+msgid "Address2"
+msgstr "住址(续)"
+
+#: NOT FOUND IN SOURCE
+msgid "Adjust Blinking Rate"
+msgstr "调整闪烁速度快慢"
+
+#: html/Edit/Groups/Admin:9
+msgid "Admin"
+msgstr "管理员"
+
+#: html/Ticket/Create.html:73
+msgid "Admin Cc"
+msgstr "管理员副本"
+
+#: etc/initialdata:303
+msgid "Admin Comment"
+msgstr "管理员评论"
+
+#: etc/initialdata:261
+msgid "Admin Correspondence"
+msgstr "管理员回复"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin Rights"
+msgstr "管理员权限"
+
+#: html/Admin/Queues/index.html:24 html/Admin/Queues/index.html:27
+msgid "Admin queues"
+msgstr "表单管理"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "使用者管理"
+
+#: html/Admin/Global/index.html:25 html/Admin/Global/index.html:27
+msgid "Admin/Global configuration"
+msgstr "管理/全域设定"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "管理/群组"
+
+#: html/Admin/Queues/Modify.html:24 html/Admin/Queues/Modify.html:28
+msgid "Admin/Queue/Basics"
+msgstr "管理/表单/基本信息"
+
+#: html/Edit/Global/Basic/Top:60
+msgid "AdminAddress"
+msgstr "管理员 Email"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "AdminCc"
+msgstr "管理员副本"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "管理员评论"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "管理员回复"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "AdminCustomFields"
+msgstr "管理自订字段"
+
+#: html/Edit/Groups/Admin:12 lib/RT/Group_Overlay.pm:145
+msgid "AdminGroup"
+msgstr "管理群组"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupDescription"
+msgstr "管理群组描述"
+
+#: lib/RT/Group_Overlay.pm:147
+msgid "AdminGroupMembership"
+msgstr "管理群组成员"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupName"
+msgstr "管理群组名称"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupPermission"
+msgstr "管理群组权限"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupStatus"
+msgstr "管理群组状态"
+
+#: lib/RT/System.pm:58
+msgid "AdminOwnPersonalGroups"
+msgstr "管理代理人群组"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "AdminQueue"
+msgstr "管理表单"
+
+#: lib/RT/System.pm:59
+msgid "AdminUsers"
+msgstr "管理使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "Administrative"
+msgstr "行政类"
+
+#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53
+msgid "Administrative Cc"
+msgstr "管理员副本"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:233
+msgid "Admins"
+msgstr "主管"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "进阶查询"
+
+#: html/Elements/SelectDateRelation:35
+msgid "After"
+msgstr "晚于"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "经历时间"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:172 html/Edit/Global/Workflow/Action:39
+msgid "Alias"
+msgstr "执行其它流程"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:175
+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
+msgid "All"
+msgstr "全部"
+
+#: etc/initialdata:372
+msgid "All Approvals Passed"
+msgstr "完成全部签核"
+
+#: html/Edit/Global/Workflow/Condition:16
+msgid "All Condition"
+msgstr "所有条件"
+
+#: html/Admin/Elements/EditCustomFields:95
+msgid "All Custom Fields"
+msgstr "所有自订字段"
+
+#: html/Admin/Queues/index.html:52
+msgid "All Queues"
+msgstr "所有表单"
+
+#: NOT FOUND IN SOURCE
+msgid "All Users"
+msgstr "全体员工"
+
+#: NOT FOUND IN SOURCE
+msgid "Allowance Request"
+msgstr "福利补助申请"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "无论寄件来源为何,一律寄信给申请人"
+
+#: NOT FOUND IN SOURCE
+msgid "Amount"
+msgstr "数额"
+
+#: html/Edit/Global/Workflow/Condition:13
+msgid "Any Condition"
+msgstr "任意条件"
+
+#: html/Edit/Global/Scrip/List:10 html/Edit/Global/Scrip/Top:74
+msgid "Apply Template"
+msgstr "引用模板"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:138 html/Elements/Tabs:55 html/Work/Approvals/Elements/Approve:6
+msgid "Approval"
+msgstr "签核"
+
+#: html/Approvals/Display.html:45 html/Approvals/Elements/ShowDependency:41 html/Approvals/index.html:64
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "签核单 #%1:%2"
+
+#: html/Approvals/index.html:53
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "签核单 #%1:系统错误,记录失败"
+
+#: html/Approvals/index.html:51
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "签核单 #%1:记录完毕"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:123
+msgid "Approval Details"
+msgstr "签核细节"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Due"
+msgstr "签核时限"
+
+#: html/Work/Approvals/Elements/Approve:37
+msgid "Approval Notes"
+msgstr "签核意见"
+
+#: etc/initialdata:357
+msgid "Approval Passed"
+msgstr "完成某项签核"
+
+#: etc/initialdata:383
+msgid "Approval Rejected"
+msgstr "驳回某项签核"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Result"
+msgstr "签核结果"
+
+#: html/Work/Approvals/Elements/Approve:25
+msgid "Approval Status"
+msgstr "核准结果"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Type"
+msgstr "签核种类"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:25
+msgid "Approval diagram"
+msgstr "签核流程"
+
+#: html/Approvals/Elements/Approve:43 html/Work/Approvals/Elements/Approve:29
+msgid "Approve"
+msgstr "核准"
+
+#: html/Work/Approvals/Elements/Approve:21 html/Work/Elements/List:9
+msgid "Approver"
+msgstr "签核人"
+
+#: html/Edit/Global/Workflow/Action:29 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
+msgid "Approver's notes: %1"
+msgstr "签核备注:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Apr"
+msgstr "四月"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "04"
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "四月"
+
+#: html/Edit/Elements/104Buttons:24
+msgid "Are you sure to delete checked items?"
+msgstr "您确定要删除?"
+
+#: html/Elements/SelectSortOrder:34
+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
+msgid "Attach"
+msgstr "附件"
+
+#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 html/Work/Tickets/Elements/AddAttachments:15
+msgid "Attach file"
+msgstr "附加档案"
+
+#: html/Ticket/Create.html:97 html/Ticket/Update.html:87 html/Work/Tickets/Elements/AddAttachments:6
+msgid "Attached file"
+msgstr "现有附件"
+
+#: NOT FOUND IN SOURCE
+msgid "Attachment '%1' could not be loaded"
+msgstr "无法加载附件 '%1'"
+
+#: lib/RT/Transaction_Overlay.pm:441
+msgid "Attachment created"
+msgstr "附件新增完毕"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "附件档名"
+
+#: html/Ticket/Elements/ShowAttachments:25 html/Work/Tickets/Elements/ShowTransaction:32
+msgid "Attachments"
+msgstr "附件"
+
+#: NOT FOUND IN SOURCE
+msgid "Aug"
+msgstr "八月"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "08"
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "八月"
+
+#: html/Admin/Elements/ModifyUser:65
+msgid "AuthSystem"
+msgstr "认证方式"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoReject"
+msgstr "自动驳回表单"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoResolve"
+msgstr "自动完成表单处理"
+
+#: etc/initialdata:224
+msgid "Autoreply"
+msgstr "自动回复"
+
+#: etc/initialdata:90
+msgid "Autoreply To Requestors"
+msgstr "自动对申请人回复"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "自动对申请人回复"
+
+#: html/Edit/Rights/index.html:16
+msgid "Available Rights:"
+msgstr "权限项目列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Back to Homepage"
+msgstr "回到首页"
+
+#: html/Work/Elements/BackButton:2 html/Work/Search/Bulk.html:101
+msgid "Back to Previous"
+msgstr "回上页"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "错误的 PGP 签章:%1\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "错误的附件编号。无法找到附件 '%1'\\n"
+
+#: bin/rt-commit-handler:826
+#. ($val)
+msgid "Bad data in %1"
+msgstr "%1 的数据错误"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Basics"
+msgstr "基本信息"
+
+#: html/Ticket/Update.html:81 html/Work/Tickets/Update.html:49
+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
+msgid "Be sure to save your changes"
+msgstr "请别忘了储存修改。"
+
+#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:321
+msgid "Before"
+msgstr "早于"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:44
+msgid "Begin Approval"
+msgstr "开始签核"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin From "
+msgstr "起始日"
+
+#: html/Edit/Users/Info:25
+msgid "Birthday"
+msgstr "生日"
+
+#: etc/initialdata:220
+msgid "Blank"
+msgstr "空白模板"
+
+#: html/Search/Listing.html:78 html/Work/Search/index.html:53
+msgid "Bookmarkable URL for this search"
+msgstr "将查询结果转为可放入书签的网址"
+
+#: html/Ticket/Elements/ShowHistory:38 html/Ticket/Elements/ShowHistory:44
+msgid "Brief headers"
+msgstr "精简标头档"
+
+#: html/Search/Bulk.html:24 html/Search/Bulk.html:25
+msgid "Bulk ticket update"
+msgstr "更新整批申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Business Unit"
+msgstr "事业部"
+
+#: NOT FOUND IN SOURCE
+msgid "Business Unit:"
+msgstr "事业部:"
+
+#: lib/RT/User_Overlay.pm:1411
+msgid "Can not modify system users"
+msgstr "无法更改系统使用者"
+
+#: lib/RT/Queue_Overlay.pm:66
+msgid "Can this principal see this queue"
+msgstr "该单位是否能查阅此表单"
+
+#: lib/RT/CustomField_Overlay.pm:205
+msgid "Can't add a custom field value without a name"
+msgstr "不能新增没有名称的自订字段值"
+
+#: lib/RT/Link_Overlay.pm:131
+msgid "Can't link a ticket to itself"
+msgstr "申请单不能链接自己。"
+
+#: lib/RT/Ticket_Overlay.pm:2816
+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
+msgid "Can't specifiy both base and target"
+msgstr "不能同时指定起始申请单与目的申请单"
+
+#: html/Edit/Elements/PopFooter:8
+msgid "Cancel"
+msgstr "取消"
+
+#: html/autohandler:113
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "无法新增使用者:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Card No."
+msgstr "卡号"
+
+#: NOT FOUND IN SOURCE
+msgid "Categories"
+msgstr "分类管理"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Cc"
+msgstr "副本"
+
+#: NOT FOUND IN SOURCE
+msgid "Cc Type"
+msgstr "副本类别"
+
+#: NOT FOUND IN SOURCE
+msgid "Chairperson's Office"
+msgstr "董事长室"
+
+#: NOT FOUND IN SOURCE
+msgid "Change Ticket"
+msgstr "修改申请单"
+
+#: html/SelfService/Prefs.html:30
+msgid "Change password"
+msgstr "更改口令"
+
+#: html/Edit/Global/Basic/Top:70
+msgid "ChangeOwnerUI"
+msgstr "可否选择表单承办人"
+
+#: html/Ticket/Create.html:100 html/Ticket/Elements/EditCustomFieldEntries:35 html/Ticket/Update.html:90 html/Work/Tickets/Elements/ShowCustomFieldEntries:13
+msgid "Check box to delete"
+msgstr "选择欲删除的项目"
+
+#: html/Admin/Elements/SelectRights:30
+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
+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
+msgid "Chinese Name"
+msgstr "中文姓名"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "City"
+msgstr "所在城市"
+
+#: html/Ticket/Elements/ShowDates:46
+msgid "Closed"
+msgstr "已解决"
+
+#: html/SelfService/Closed.html:24
+msgid "Closed Tickets"
+msgstr "已解决的申请单"
+
+#: html/SelfService/Elements/Tabs:44
+msgid "Closed tickets"
+msgstr "已解决的申请单"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:181 html/Edit/Global/Workflow/Action:58 html/Edit/Global/Workflow/Condition:51
+msgid "Code"
+msgstr "执行程序码"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Comment"
+msgstr "评论"
+
+#: html/Admin/Elements/ModifyQueue:44 html/Admin/Queues/Modify.html:57
+msgid "Comment Address"
+msgstr "评论电子邮件地址"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "评论未被纪录"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Comment on tickets"
+msgstr "对申请单提出评论"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "CommentOnTicket"
+msgstr "评论申请单"
+
+#: html/Admin/Elements/ModifyUser:34 html/Work/Tickets/Update.html:59
+msgid "Comments"
+msgstr "评论"
+
+#: html/Ticket/ModifyAll.html:69 html/Ticket/Update.html:68 html/Work/Tickets/Update.html:35
+msgid "Comments (Not sent to requestors)"
+msgstr "评论(不送给申请人)"
+
+#: html/Search/Bulk.html:131 html/Work/Search/Bulk.html:83
+msgid "Comments (not sent to requestors)"
+msgstr "评论(不送给申请人)"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Comments about %1"
+msgstr "对 %1 的评论"
+
+#: html/Admin/Users/Modify.html:184 html/Ticket/Elements/ShowRequestor:43
+msgid "Comments about this user"
+msgstr "使用者描述"
+
+#: lib/RT/Transaction_Overlay.pm:543
+msgid "Comments added"
+msgstr "新增评论完毕"
+
+#: html/Edit/Elements/PopFooter:4 html/Edit/Elements/PopFooter:6
+msgid "Commit"
+msgstr "确认"
+
+#: lib/RT/Action/Generic.pm:139
+msgid "Commit Stubbed"
+msgstr "消除更动完毕"
+
+#: html/Edit/Users/Info:42
+msgid "Company Name"
+msgstr "公司名称"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "设定查询条件"
+
+#: html/Admin/Elements/EditScrip:40 html/Admin/Elements/ModifyTemplateAsWorkflow:127
+msgid "Condition"
+msgstr "条件"
+
+#: bin/rt-crontool:108
+msgid "Condition matches..."
+msgstr "符合条件..."
+
+#: lib/RT/Scrip_Overlay.pm:159
+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
+msgid "Configuration"
+msgstr "设定"
+
+#: html/SelfService/Prefs.html:32
+msgid "Confirm"
+msgstr "确认口令"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Confirm Submit"
+msgstr "确定送出"
+
+#: NOT FOUND IN SOURCE
+msgid "Contact System Administrator"
+msgstr "连络系统管理员"
+
+#: html/Admin/Elements/ModifyUser:59
+msgid "ContactInfoSystem"
+msgstr "连络信息系统"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "无法解读联络日期 '%1'"
+
+#: html/Admin/Elements/ModifyTemplate:43 html/Admin/Elements/ModifyTemplateAsWorkflow:200 html/Ticket/ModifyAll.html:86
+msgid "Content"
+msgstr "内容"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr "无法新增群组"
+
+#: html/Edit/Elements/104Buttons:74
+msgid "Copy"
+msgstr "复制"
+
+#: NOT FOUND IN SOURCE
+msgid "Copy Field From:"
+msgstr "欲复制字段:"
+
+#: etc/initialdata:282
+msgid "Correspondence"
+msgstr "回复"
+
+#: html/Admin/Elements/ModifyQueue:38 html/Admin/Queues/Modify.html:50
+msgid "Correspondence Address"
+msgstr "申请单回复地址"
+
+#: lib/RT/Transaction_Overlay.pm:539
+msgid "Correspondence added"
+msgstr "新增申请单回复"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "未纪录申请单回复"
+
+#: lib/RT/Ticket_Overlay.pm:3561
+msgid "Could not add new custom field value for ticket. "
+msgstr "不能新增自订字段的值 "
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Could not change owner. "
+msgstr "不能更改承办人。 "
+
+#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:165 html/Edit/Global/CustomField/index.html:117
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "无法新增自订字段"
+
+#: html/Edit/Global/Workflow/index.html:126
+#. ($msg)
+msgid "Could not create Scrip"
+msgstr "无法建立讯息通知"
+
+#: html/Edit/Global/Template/index.html:110
+#. ($msg)
+msgid "Could not create Template"
+msgstr "无法建立通知模板"
+
+#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:473 lib/RT/Group_Overlay.pm:480
+msgid "Could not create group"
+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
+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
+msgid "Could not create user"
+msgstr "无法新增使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "无法为申请人新增视察员"
+
+#: html/Admin/Elements/ModifyWorkflow:219 html/Admin/Global/Workflow.html:75 html/Admin/Queues/Workflow.html:71
+#. ($msg)
+msgid "Could not create workflow: %1"
+msgstr "无法新增流程:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "找不到编号 %1 的申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "找不到群组 %1。"
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1430
+msgid "Could not find or create that user"
+msgstr "找不到或无法新增该名使用者"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1509
+msgid "Could not find that principal"
+msgstr "找不到该单位"
+
+#: NOT FOUND IN SOURCE
+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)
+msgid "Could not load group"
+msgstr "无法加载群组"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "无法将该单位设为此表单的 %1。"
+
+#: lib/RT/Ticket_Overlay.pm:1451
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "无法将该单位设为此申请单的 %1。"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "无法将单位 %1 从表单移除。"
+
+#: lib/RT/Ticket_Overlay.pm:1567
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "无法将单位 %1 从申请单移除。"
+
+#: lib/RT/Group_Overlay.pm:984
+msgid "Couldn't add member to group"
+msgstr "无法新增成员至群组"
+
+#: lib/RT/Ticket_Overlay.pm:3571 lib/RT/Ticket_Overlay.pm:3627
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "无法新增更动报告"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "无法从 gpg 回函辨识出该采取的行动\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "找不到群组\\n"
+
+#: lib/RT/Interface/Web.pm:902
+msgid "Couldn't find row"
+msgstr "找不到此列数据"
+
+#: lib/RT/Group_Overlay.pm:958
+msgid "Couldn't find that principal"
+msgstr "找不到该单位"
+
+#: lib/RT/CustomField_Overlay.pm:239
+msgid "Couldn't find that value"
+msgstr "找不到该值"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "找不到该视察员"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "找不到使用者\\n"
+
+#: lib/RT/CurrentUser.pm:111
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "无法从使用者数据库加载 %1。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "无法加载 KeywordSelects。"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "无法加载 RT 设定档 '%1' %2"
+
+#: NOT FOUND IN SOURCE
+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)
+#. ($ObjectGroup)
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "无法加载手续 %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 "无法加载链接。"
+
+#: html/Admin/Elements/EditCustomFields:146 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
+#. ($Queue)
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "无法加载表单 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "无法加载手续"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "无法加载模板"
+
+#: html/Admin/Users/Prefs.html:78
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "无法加载该名使用者(%1)"
+
+#: html/SelfService/Display.html:108
+#. ($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
+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
+msgid "Create"
+msgstr "新增"
+
+#: html/Edit/Groups/MemberGroups/Add.html:17
+msgid "Create Subgroup:"
+msgstr "新增子群组:"
+
+#: etc/initialdata:145
+msgid "Create Tickets"
+msgstr "新增申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Create User:"
+msgstr "新增成员:"
+
+#: html/Admin/Elements/EditCustomField:74
+msgid "Create a CustomField"
+msgstr "新增自订字段"
+
+#: html/Admin/Queues/CustomField.html:47
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "为 %1 表单新增自订字段"
+
+#: html/Admin/Global/CustomField.html:47
+msgid "Create a CustomField which applies to all queues"
+msgstr "为 %1 表单新增自订字段"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "新增自订字段"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr "新增全域手续"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "新增全域手续"
+
+#: html/Admin/Groups/Modify.html:66 html/Admin/Groups/Modify.html:92
+msgid "Create a new group"
+msgstr "新增群组"
+
+#: html/User/Groups/Modify.html:66 html/User/Groups/Modify.html:91
+msgid "Create a new personal group"
+msgstr "新增代理人群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "新增表单"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "新增手续"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "新增模板"
+
+#: html/Ticket/Create.html:24 html/Ticket/Create.html:27 html/Ticket/Create.html:35
+msgid "Create a new ticket"
+msgstr "新增申请单"
+
+#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:240
+msgid "Create a new user"
+msgstr "新增使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new workflow"
+msgstr "新增流程"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "新增表单"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "新增表单名称"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a request"
+msgstr "提出申请"
+
+#: html/Admin/Queues/Scrip.html:58
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "为 %1 表单新增手续"
+
+#: html/Admin/Global/Template.html:68 html/Admin/Queues/Template.html:64
+msgid "Create a template"
+msgstr "新增模板"
+
+#: html/SelfService/Create.html:24
+msgid "Create a ticket"
+msgstr "提出申请单"
+
+#: html/Admin/Elements/ModifyWorkflow:206 html/Admin/Global/Workflow.html:69 html/Admin/Queues/Workflow.html:64
+msgid "Create a workflow"
+msgstr "新增流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "新增失败:%1 / %2 / %3"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr "新增失败:%1/%2/%3"
+
+#: NOT FOUND IN SOURCE
+msgid "Create new item"
+msgstr "建立新项目"
+
+#: etc/initialdata:147
+msgid "Create new tickets based on this scrip's template"
+msgstr "依据此项手续内的模版,新增申请单"
+
+#: html/SelfService/Create.html:77
+msgid "Create ticket"
+msgstr "新增申请单"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Create tickets in this queue"
+msgstr "在此表单中新增申请单"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Create, delete and modify custom fields"
+msgstr "新增、删除及更改自订字段"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Create, delete and modify queues"
+msgstr "新增、删除及更改表单"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "新增、删除及更改任何使用者的代理人群组"
+
+#: lib/RT/System.pm:58
+msgid "Create, delete and modify the members of personal groups"
+msgstr "新增、删除及更改代理人群组"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify users"
+msgstr "新增、删除及更改使用者"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "CreateTicket"
+msgstr "新增申请单"
+
+#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:26 lib/RT/Ticket_Overlay.pm:1175
+msgid "Created"
+msgstr "新增日"
+
+#: html/Admin/Elements/EditCustomField:87
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "自订字段 %1 新增成功"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "模板 %1 新增成功"
+
+#: html/Admin/Elements/ModifyWorkflow:221
+#. (loc( $WorkflowObj->Name() ))
+msgid "Created workflow %1"
+msgstr "流程 %1 新增成功"
+
+#: NOT FOUND IN SOURCE
+msgid "Currency"
+msgstr "币别"
+
+#: NOT FOUND IN SOURCE
+msgid "Current Approval Info"
+msgstr "截至目前签核信息"
+
+#: NOT FOUND IN SOURCE
+msgid "Current Custom Fields"
+msgstr "现有自订字段"
+
+#: html/Edit/Groups/MemberGroups/Add.html:14
+msgid "Current Groups:"
+msgstr "现有群组列表:"
+
+#: html/Ticket/Elements/EditLinks:27
+msgid "Current Relationships"
+msgstr "现有关系"
+
+#: html/Edit/Rights/index.html:19
+msgid "Current Rights:"
+msgstr "现有权限:"
+
+#: html/Admin/Elements/EditScrips:29
+msgid "Current Scrips"
+msgstr "现有手续"
+
+#: html/Work/Tickets/Create.html:48 html/Work/Tickets/Elements/ShowBasics:39
+msgid "Current Status"
+msgstr "目前状态"
+
+#: NOT FOUND IN SOURCE
+msgid "Current Templates"
+msgstr "现有模板"
+
+#: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41
+msgid "Current members"
+msgstr "现有成员"
+
+#: html/Admin/Elements/SelectRights:28
+msgid "Current rights"
+msgstr "现有权限"
+
+#: html/Search/Listing.html:70 html/Work/Search/index.html:42
+msgid "Current search criteria"
+msgstr "现有查询条件"
+
+#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44
+msgid "Current watchers"
+msgstr "现有视察员"
+
+#: html/Admin/Global/CustomField.html:54
+#. ($CustomField)
+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
+msgid "Custom Fields"
+msgstr "自订字段"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom Fields which apply to all queues"
+msgstr "适用于所有表单的自订字段"
+
+#: html/Admin/Elements/EditScrip:72 html/Edit/Global/Scrip/Top:69
+msgid "Custom action cleanup code"
+msgstr "动作后执行程序"
+
+#: html/Admin/Elements/EditScrip:64 html/Edit/Global/Scrip/Top:62
+msgid "Custom action preparation code"
+msgstr "动作前执行程序"
+
+#: html/Admin/Elements/EditScrip:48 html/Edit/Global/Scrip/Top:35 html/Edit/Global/Scrip/Top:61
+msgid "Custom condition"
+msgstr "自订条件"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "自订字段 %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "自订字段 %1 已有值"
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "自订字段 %1 没有值"
+
+#: lib/RT/Ticket_Overlay.pm:3463
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "找不到自订字段 %1"
+
+#: html/Admin/Elements/EditCustomFields:196
+msgid "Custom field deleted"
+msgstr "自订字段已删除"
+
+#: lib/RT/Ticket_Overlay.pm:3613
+msgid "Custom field not found"
+msgstr "找不到自订字段"
+
+#: lib/RT/CustomField_Overlay.pm:349
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "无法从自订字段 %2 中找到 %1 这个字段值"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "自订字段值从 %1 改为 %2"
+
+#: lib/RT/CustomField_Overlay.pm:249
+msgid "Custom field value could not be deleted"
+msgstr "无法删除自订字段值"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Custom field value could not be found"
+msgstr "找不到自订字段值"
+
+#: lib/RT/CustomField_Overlay.pm:247 lib/RT/CustomField_Overlay.pm:357
+msgid "Custom field value deleted"
+msgstr "自订字段值删除成功"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:145 html/Edit/Global/Workflow/Owner.html:90 lib/RT/Transaction_Overlay.pm:548
+msgid "CustomField"
+msgstr "自订字段"
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "数据错误"
+
+#: 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
+msgid "Dates"
+msgstr "日期"
+
+#: NOT FOUND IN SOURCE
+msgid "Dec"
+msgstr "十二月"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "12"
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "十二月"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "预设自动响应模板"
+
+#: etc/initialdata:225
+msgid "Default Autoresponse template"
+msgstr "预设自动响应模板"
+
+#: etc/initialdata:304
+msgid "Default admin comment template"
+msgstr "预设管理员评论模板"
+
+#: etc/initialdata:262
+msgid "Default admin correspondence template"
+msgstr "预设管理员回复模板"
+
+#: etc/initialdata:283
+msgid "Default correspondence template"
+msgstr "预设回复模板"
+
+#: etc/initialdata:240
+msgid "Default transaction template"
+msgstr "预设更动模板"
+
+#: lib/RT/Transaction_Overlay.pm:643
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "预设:%1/%2 已自 %3 改为 %4"
+
+#: html/User/Delegation.html:24 html/User/Delegation.html:27
+msgid "Delegate rights"
+msgstr "代表团权限"
+
+#: lib/RT/System.pm:62
+msgid "Delegate specific rights which have been granted to you."
+msgstr "将拥有的权限委托他人代理"
+
+#: lib/RT/System.pm:62
+msgid "DelegateRights"
+msgstr "设定代理人"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegated Approval"
+msgstr "代理签核"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegated Queue"
+msgstr "代理表单名称"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegated Queue:"
+msgstr "代理表单:"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Delegates"
+msgstr "代理人"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Enabled Status"
+msgstr "代理激活状态"
+
+#: html/Work/Delegates/Info:18 html/Work/Overview/Info:18
+msgid "Delegates Info"
+msgstr "代理人信息"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Period"
+msgstr "代理期间"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Permission Setting"
+msgstr "代理权限设定"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Permission:"
+msgstr "代理权限:"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Setting"
+msgstr "代理人设定"
+
+#: html/Work/Delegates/Info:46 html/Work/Delegates/List:11 html/Work/Overview/Info:39
+msgid "Delegates Status"
+msgstr "代理状态"
+
+#: html/User/Elements/Tabs:37
+msgid "Delegation"
+msgstr "代理人权限"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegation Groups"
+msgstr "代理人群组"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Delete"
+msgstr "删除"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Delete tickets"
+msgstr "删除申请单"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "DeleteTicket"
+msgstr "删除申请单"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "删除此对象可能破坏参考完整性"
+
+#: lib/RT/Queue_Overlay.pm:293
+msgid "Deleting this object would break referential integrity"
+msgstr "删除此对象可能破坏参考完整性"
+
+#: lib/RT/User_Overlay.pm:497
+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:44 html/Work/Approvals/Elements/Approve:32
+msgid "Deny"
+msgstr "驳回"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Department Name"
+msgstr "部门名称"
+
+#: NOT FOUND IN SOURCE
+msgid "Department's"
+msgstr "部门之"
+
+#: NOT FOUND IN SOURCE
+msgid "Departure Details"
+msgstr "差旅明细"
+
+#: NOT FOUND IN SOURCE
+msgid "Departure From"
+msgstr "差旅起始日"
+
+#: NOT FOUND IN SOURCE
+msgid "Departure Request"
+msgstr "请假单"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Depended on by"
+msgstr "可接续处理的申请单"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Depends on"
+msgstr "需先处理"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr "需先处理"
+
+#: html/Elements/SelectSortOrder:34
+msgid "Descending"
+msgstr "递减"
+
+#: html/SelfService/Create.html:72 html/Ticket/Create.html:118
+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
+msgid "Description"
+msgstr "描述"
+
+#: NOT FOUND IN SOURCE
+msgid "Description of Responsibility"
+msgstr "经办业务说明"
+
+#: NOT FOUND IN SOURCE
+msgid "Description:"
+msgstr "描述:"
+
+#: html/Work/Tickets/Create.html:108 html/Work/Tickets/Elements/EditCustomFields:39 html/Work/Tickets/Elements/ShowCustomFields:41
+msgid "Details"
+msgstr "细节"
+
+#: NOT FOUND IN SOURCE
+msgid "Direct"
+msgstr "直接"
+
+#: html/Edit/Users/Info:31
+msgid "Disability"
+msgstr "残障身分"
+
+#: html/Edit/Users/Info:29
+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
+msgid "Disabled"
+msgstr "停用"
+
+#: html/Ticket/Elements/Tabs:84
+msgid "Display"
+msgstr "显示内容"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Display Access Control List"
+msgstr "显示权限控制清单"
+
+#: lib/RT/Queue_Overlay.pm:74
+msgid "Display Scrip templates for this queue"
+msgstr "显示此表单的模板"
+
+#: lib/RT/Queue_Overlay.pm:77
+msgid "Display Scrips for this queue"
+msgstr "显示此表单的手续"
+
+#: html/Ticket/Elements/ShowHistory:34
+msgid "Display mode"
+msgstr "显示模式"
+
+#: NOT FOUND IN SOURCE
+msgid "Display ticket #%1"
+msgstr "显示第%1号申请单"
+
+#: lib/RT/System.pm:53
+msgid "Do anything and everything"
+msgstr "允许一切操作"
+
+#: html/Elements/Refresh:29
+msgid "Don't refresh this page."
+msgstr "不更新此页面。"
+
+#: html/Search/Elements/PickRestriction:113 html/Work/Search/PickRestriction:95
+msgid "Don't show search results"
+msgstr "不显示查询结果"
+
+#: html/Edit/Elements/Page:19 html/Edit/Elements/Page:21
+msgid "Down"
+msgstr "下一页"
+
+#: html/Ticket/Elements/ShowTransaction:92
+msgid "Download"
+msgstr "下载"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Due"
+msgstr "到期日"
+
+#: NOT FOUND IN SOURCE
+msgid "Due Date"
+msgstr "截止日"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "无法解读日期 '%1'"
+
+#: bin/rt-commit-handler:753
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "无法加载申请单 '%1':%2.\\n"
+
+#: html/Work/Tickets/Update.html:46
+msgid "Edit"
+msgstr "编辑"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:132
+msgid "Edit Conditions"
+msgstr "编辑前置条件"
+
+#: html/Admin/Queues/CustomFields.html:44
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "编辑 %1 的自订字段"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Custom Fields for queue %1"
+msgstr "编辑表单 %1 的自订字段"
+
+#: html/Search/Bulk.html:143 html/Ticket/ModifyLinks.html:35 html/Work/Search/Bulk.html:93
+msgid "Edit Relationships"
+msgstr "编辑申请单关系"
+
+#: html/Edit/Groups/MemberGroups/Add.html:3 html/Edit/Groups/MemberGroups/index.html:22
+msgid "Edit Subgroups"
+msgstr "新增/维护子群组"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "编辑表单 %1 的模板"
+
+#: html/Admin/Queues/Workflows.html:42
+#. ($QueueObj->Name)
+msgid "Edit Workflows for queue %1"
+msgstr "编辑表单 %1 的流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr "编辑关键词"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "编辑手续"
+
+#: html/Admin/Global/index.html:45
+msgid "Edit system templates"
+msgstr "编辑全域模板"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit system workflows"
+msgstr "编辑全域流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "编辑 %1 的模板"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit workflows for %1"
+msgstr "编辑 %1 的流程"
+
+#: html/Admin/Elements/ModifyQueue:24 html/Admin/Queues/Modify.html:118
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "编辑表单 %1 的设定"
+
+#: html/Admin/Elements/ModifyUser:24
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "编辑使用者 %1 的设定"
+
+#: html/Admin/Elements/EditCustomField:90
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "编辑自订字段 %1"
+
+#: html/Admin/Groups/Members.html:31
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "编辑群组 %1 的成员信息"
+
+#: html/User/Groups/Members.html:128
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "编辑代理人群组 %1 的成员信息"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "编辑模板 %1"
+
+#: html/Admin/Elements/ModifyWorkflow:238
+#. (loc( $WorkflowObj->Name() ))
+msgid "Editing workflow %1"
+msgstr "编辑流程 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Education"
+msgstr "最高学历"
+
+#: NOT FOUND IN SOURCE
+msgid "EffectiveId"
+msgstr "有效编号"
+
+#: lib/RT/Ticket_Overlay.pm:2644 lib/RT/Ticket_Overlay.pm:2712
+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
+msgid "Email"
+msgstr "电子邮件信箱"
+
+#: lib/RT/User_Overlay.pm:247
+msgid "Email address in use"
+msgstr "此电子邮件信箱已被使用"
+
+#: html/Admin/Elements/ModifyUser:41
+msgid "EmailAddress"
+msgstr "电子邮件信箱地址"
+
+#: html/Admin/Elements/ModifyUser:53
+msgid "EmailEncoding"
+msgstr "电子邮件文字编码方式"
+
+#: NOT FOUND IN SOURCE
+msgid "Embark Date"
+msgstr "外籍员工入境日"
+
+#: NOT FOUND IN SOURCE
+msgid "Embarked Date"
+msgstr "抵达日期"
+
+#: NOT FOUND IN SOURCE
+msgid "Embarked Location"
+msgstr "抵达地点"
+
+#: NOT FOUND IN SOURCE
+msgid "Enable Delegates"
+msgstr "代理激活"
+
+#: html/Admin/Elements/EditCustomField:50
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "启用(取消勾选将停用此自订字段)"
+
+#: html/Admin/Groups/Modify.html:52 html/User/Groups/Modify.html:52
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "启用(取消勾选将停用此群组)"
+
+#: html/Admin/Queues/Modify.html:83
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "启用(取消勾选将停用此表单)"
+
+#: html/Admin/Elements/EditCustomFields:98
+msgid "Enabled Custom Fields"
+msgstr "已启用的自订字段"
+
+#: html/Edit/Queues/Basic/Top:75 html/Edit/Queues/List:15
+msgid "Enabled Date"
+msgstr "启用日期"
+
+#: NOT FOUND IN SOURCE
+msgid "Enabled Date:"
+msgstr "激活日期:"
+
+#: html/Admin/Queues/index.html:55
+msgid "Enabled Queues"
+msgstr "已启用的表单"
+
+#: html/Edit/Queues/Basic/Top:66 html/Edit/Queues/List:11
+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
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "启用状态 %1"
+
+#: html/Edit/Users/Info:35
+msgid "End of Trial"
+msgstr "试用期满日"
+
+#: NOT FOUND IN SOURCE
+msgid "English Name"
+msgstr "英文姓名"
+
+#: lib/RT/CustomField_Overlay.pm:427
+msgid "Enter multiple values"
+msgstr "键入多重项目"
+
+#: html/Edit/Users/Search.html:15
+msgid "Enter one or more conditions below to search for users"
+msgstr "输入下列单一或复式条件,查询用户数据"
+
+#: lib/RT/CustomField_Overlay.pm:424
+msgid "Enter one value"
+msgstr "键入单一项目"
+
+#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:111 html/Work/Search/Bulk.html:95
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "输入申请单可链接到的申请单编号或网址。以空白隔开。"
+
+#: lib/RT/CustomField_Vendor.pm:20
+msgid "EntryBoolean"
+msgstr "是非填表"
+
+#: lib/RT/CustomField_Vendor.pm:17
+msgid "EntryDate"
+msgstr "日期填表"
+
+#: NOT FOUND IN SOURCE
+msgid "EntryExternal"
+msgstr "系统填表"
+
+#: lib/RT/CustomField_Vendor.pm:16
+msgid "EntryFreeform"
+msgstr "输入填表"
+
+#: NOT FOUND IN SOURCE
+msgid "EntryMultiple"
+msgstr "多选填表"
+
+#: lib/RT/CustomField_Vendor.pm:19
+msgid "EntryNumber"
+msgstr "数值填表"
+
+#: lib/RT/CustomField_Vendor.pm:15
+msgid "EntrySelect"
+msgstr "单选填表"
+
+#: lib/RT/CustomField_Vendor.pm:18
+msgid "EntryTime"
+msgstr "时间填表"
+
+#: html/Elements/Login:39 html/SelfService/Error.html:24 html/SelfService/Error.html:25
+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 "表单->新增视察员的参数有误"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "表单->删除视察员的参数有误"
+
+#: lib/RT/Ticket_Overlay.pm:1364
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "申请单->新增视察员的参数有误"
+
+#: lib/RT/Ticket_Overlay.pm:1540
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "申请单->删除视察员的参数有误"
+
+#: etc/initialdata:38
+msgid "Everyone"
+msgstr "所有人"
+
+#: bin/rt-crontool:193
+msgid "Example:"
+msgstr "范例:"
+
+#: html/Edit/Elements/104Buttons:77
+msgid "Export"
+msgstr "汇出"
+
+#: html/Admin/Elements/ModifyUser:63
+msgid "ExternalAuthId"
+msgstr "外部认证帐号"
+
+#: html/Admin/Elements/ModifyUser:57
+msgid "ExternalContactInfoId"
+msgstr "外部联络方式帐号"
+
+#: html/Edit/Global/Basic/Top:64
+msgid "ExternalDatabaseDSN"
+msgstr "外部数据库连结字符串"
+
+#: html/Edit/Global/Basic/Top:68
+msgid "ExternalDatabasePass"
+msgstr "外部数据库口令"
+
+#: html/Edit/Global/Basic/Top:66
+msgid "ExternalDatabaseUser"
+msgstr "外部数据库用户"
+
+#: html/Edit/Global/Basic/Top:62
+msgid "ExternalURL"
+msgstr "外部接口网址"
+
+#: html/Admin/Users/Modify.html:72
+msgid "Extra info"
+msgstr "备注"
+
+#: lib/RT/User_Overlay.pm:361
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "找不到「内部成员」虚拟群组的使用者。"
+
+#: lib/RT/User_Overlay.pm:368
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "找不到「非内部成员」虚拟群组的使用者。"
+
+#: bin/rt-crontool:137
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "无法加载模块 %1. (%2)"
+
+#: NOT FOUND IN SOURCE
+msgid "Feb"
+msgstr "二月"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "02"
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "二月"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Field Description"
+msgstr "字段描述"
+
+#: html/Edit/Global/CustomField/List:6 html/Edit/Global/CustomField/Top:15
+msgid "Field Name"
+msgstr "字段名称"
+
+#: html/Edit/Elements/PickUsers:52 html/Edit/Users/Add.html:47
+msgid "Filter"
+msgstr "筛选"
+
+#: html/Edit/Elements/PickUsers:6 html/Edit/Users/Add.html:7 html/Work/Tickets/Cc:4
+msgid "Filter people"
+msgstr "对象筛选"
+
+#: html/Edit/Elements/PickUsers:68 html/Edit/Users/Add.html:63 html/Work/Tickets/Cc:42
+msgid "Filtered list:"
+msgstr "筛选列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "最终"
+
+#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "最低顺位"
+
+#: lib/RT/Ticket_Overlay.pm:1170
+msgid "FinalPriority"
+msgstr "最低顺位"
+
+#: NOT FOUND IN SOURCE
+msgid "Financial Department:"
+msgstr "财务部:"
+
+#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33
+msgid "Find group whose"
+msgstr "寻找群组的"
+
+#: NOT FOUND IN SOURCE
+msgid "Find new/open tickets"
+msgstr "寻找/开启申请单"
+
+#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29
+msgid "Find people whose"
+msgstr "寻找人员的"
+
+#: html/Search/Listing.html:107 html/Work/Search/index.html:88
+msgid "Find tickets"
+msgstr "寻找申请单"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:118
+msgid "Finish Approval"
+msgstr "签核完毕"
+
+#: html/Ticket/Elements/Tabs:57
+msgid "First"
+msgstr "第一项"
+
+#: html/Search/Listing.html:40 html/Work/Search/index.html:17
+msgid "First page"
+msgstr "第一页"
+
+#: html/Edit/Global/Workflow/Owner.html:30
+msgid "First-"
+msgstr "一"
+
+#: NOT FOUND IN SOURCE
+msgid "First-level Admins"
+msgstr "一阶主管"
+
+#: html/Edit/Users/Info:40
+msgid "First-level Users"
+msgstr "一阶主管员工"
+
+#: NOT FOUND IN SOURCE
+msgid "Fixed shift"
+msgstr "固定班"
+
+#: docs/design_docs/string-extraction-guide.txt:33
+msgid "Foo Bar Baz"
+msgstr "甲 乙 丙"
+
+#: docs/design_docs/string-extraction-guide.txt:24
+msgid "Foo!"
+msgstr "甲!"
+
+#: html/Search/Bulk.html:86 html/Work/Search/Bulk.html:55
+msgid "Force change"
+msgstr "强制更新"
+
+#: html/Work/Elements/104Header:89
+msgid "Form Processing"
+msgstr "电子表单作业区"
+
+#: html/Search/Listing.html:105 html/Work/Search/index.html:86
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "找到 %1 张申请单"
+
+#: lib/RT/Interface/Web.pm:904
+msgid "Found Object"
+msgstr "已找到对象"
+
+#: html/Edit/Global/Workflow/Owner.html:33
+msgid "Fourth-"
+msgstr "四"
+
+#: html/Admin/Elements/ModifyUser:43
+msgid "FreeformContactInfo"
+msgstr "联络方式"
+
+#: lib/RT/CustomField_Vendor.pm:11
+msgid "FreeformDate"
+msgstr "日期输入"
+
+#: NOT FOUND IN SOURCE
+msgid "FreeformExternal"
+msgstr "系统字段"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformMultiple"
+msgstr "多重输入"
+
+#: lib/RT/CustomField_Vendor.pm:13
+msgid "FreeformNumber"
+msgstr "数值输入"
+
+#: lib/RT/CustomField_Vendor.pm:14
+msgid "FreeformPassword"
+msgstr "口令输入"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "FreeformSingle"
+msgstr "单一输入"
+
+#: lib/RT/CustomField_Vendor.pm:12
+msgid "FreeformTime"
+msgstr "时间输入"
+
+#: NOT FOUND IN SOURCE
+msgid "Fri"
+msgstr "星期五"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "星期五"
+
+#: html/Ticket/Elements/ShowHistory:40 html/Ticket/Elements/ShowHistory:50
+msgid "Full headers"
+msgstr "完整标头档"
+
+#: NOT FOUND IN SOURCE
+msgid "Gecos"
+msgstr "登入帐号"
+
+#: html/Edit/Users/Info:26
+msgid "Gender"
+msgstr "性别"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "取得目前使用者的 pgp 签章\\n"
+
+#: lib/RT/Transaction_Overlay.pm:593
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "交予 %1"
+
+#: html/Admin/Elements/Tabs:40 html/Admin/index.html:37
+msgid "Global"
+msgstr "全域设定"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr "全域关键词选取"
+
+#: html/Edit/Users/System:24
+msgid "Global Rights:"
+msgstr "拥有全域权限列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "全域手续"
+
+#: html/Edit/Elements/Tab:38
+msgid "Global Setup"
+msgstr "全域设定"
+
+#: html/Admin/Elements/SelectTemplate:37 html/Edit/Elements/SelectTemplate:11
+#. (loc($Template->Name))
+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
+msgid "Go!"
+msgstr "执行"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "%1 的 pgp 签章是正确的\\n"
+
+#: html/Search/Listing.html:49
+msgid "Goto page"
+msgstr "到页面"
+
+#: html/Elements/GotoTicket:24 html/SelfService/Elements/GotoTicket:24 html/Work/Elements/104Header:49
+msgid "Goto ticket"
+msgstr "跳到申请单"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:224
+msgid "Grand"
+msgstr "上"
+
+#: html/Ticket/Elements/AddWatchers:45 html/User/Elements/DelegateRights:77
+msgid "Group"
+msgstr "群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "群组 %1 %2:%3"
+
+#: html/Edit/Global/GroupRight/List:5 html/Edit/Global/GroupRight/Top:20 html/Edit/Groups/List:7
+msgid "Group Description"
+msgstr "群组描述"
+
+#: NOT FOUND IN SOURCE
+msgid "Group Management"
+msgstr "群组管理"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Group Name"
+msgstr "群组名称"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Group Rights"
+msgstr "群组权限"
+
+#: NOT FOUND IN SOURCE
+msgid "Group Rights:"
+msgstr "拥有群组权限列表:"
+
+#: html/Edit/Elements/Tab:34
+msgid "Group Setup"
+msgstr "群组设定"
+
+#: html/Edit/Global/GroupRight/List:8 html/Edit/Global/GroupRight/Top:14 html/Edit/Groups/List:10 html/Edit/Groups/Top:15
+msgid "Group Status"
+msgstr "群组状态"
+
+#: lib/RT/Group_Overlay.pm:964
+msgid "Group already has member"
+msgstr "群组内已有此成员"
+
+#: NOT FOUND IN SOURCE
+msgid "Group could not be created."
+msgstr "无法新增群组"
+
+#: html/Admin/Groups/Modify.html:76
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "无法新增群组:%1"
+
+#: lib/RT/Group_Overlay.pm:496
+msgid "Group created"
+msgstr "群组新增完毕"
+
+#: lib/RT/Group_Overlay.pm:1132
+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
+msgid "Group not found"
+msgstr "找不到群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "找不到群组。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "未指定群组。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group with Queue Rights"
+msgstr "拥有表单权限群组"
+
+#: html/Edit/Global/Workflow/Owner.html:70
+msgid "Group's"
+msgstr "群组之"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Groups"
+msgstr "群组"
+
+#: lib/RT/Group_Overlay.pm:970
+msgid "Groups can't be members of their members"
+msgstr "不能将群组设为群组内成员"
+
+#: NOT FOUND IN SOURCE
+msgid "Groups with Global Rights"
+msgstr "拥有全域权限群组"
+
+#: html/Edit/Global/GroupRight/List:6 html/Edit/Global/GroupRight/Top:22 html/Edit/Groups/List:8
+msgid "HRMSDefined"
+msgstr "组织架构"
+
+#: html/Edit/Users/Info:32
+msgid "Health Insurance"
+msgstr "健保补助身份"
+
+#: lib/RT/Interface/CLI.pm:72 lib/RT/Interface/CLI.pm:72
+msgid "Hello!"
+msgstr "嗨!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "嗨,%1"
+
+#: html/Edit/Elements/104Top:27
+msgid "Help"
+msgstr "辅助说明"
+
+#: NOT FOUND IN SOURCE
+msgid "Help Desks"
+msgstr "各项业务窗口"
+
+#: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:87 html/Work/Tickets/Elements/ShowHistory:8
+msgid "History"
+msgstr "纪录"
+
+#: html/Admin/Elements/ModifyUser:67
+msgid "HomePhone"
+msgstr "住处电话"
+
+#: html/Edit/Elements/104Top:15 html/Edit/Elements/104Top:23 html/Edit/Elements/EDOMHeader:9 html/Elements/Tabs:43
+msgid "Homepage"
+msgstr "主页"
+
+#: NOT FOUND IN SOURCE
+msgid "Hotel Expense"
+msgstr "住宿费"
+
+#: lib/RT/Base.pm:73
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "我有 %quant(%1,份固体搅拌器)。"
+
+#: NOT FOUND IN SOURCE
+msgid "ID Number"
+msgstr "身分证号"
+
+#: NOT FOUND IN SOURCE
+msgid "ID Type"
+msgstr "身分类别"
+
+#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "编号"
+
+#: html/Admin/Users/Modify.html:43 html/User/Prefs.html:38 html/Work/Preferences/Info:14
+msgid "Identity"
+msgstr "身份"
+
+#: etc/initialdata:439 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 "若签核单遭到驳回,则连带驳回原申请单,并删除其它相关的待签核事项"
+
+#: 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 "如果此工具程序为 setgid,恶意的本地端用户即能由此取得 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 "若您已更新以上数据,请记得按一下"
+
+#: lib/RT/Interface/Web.pm:896
+msgid "Illegal value for %1"
+msgstr "%1 的值错误"
+
+#: lib/RT/Interface/Web.pm:899
+msgid "Immutable field"
+msgstr "此字段值不可更动"
+
+#: html/Edit/Elements/104Buttons:76 html/Edit/Global/Workflow/Import.html:2
+msgid "Import"
+msgstr "汇入"
+
+#: html/Admin/Elements/EditCustomFields:73
+msgid "Include disabled custom fields in listing."
+msgstr "列出停用的自订字段"
+
+#: html/Admin/Queues/index.html:42 html/Edit/Queues/index.html:38
+msgid "Include disabled queues in listing."
+msgstr "列出停用的表单"
+
+#: html/Admin/Users/index.html:46 html/Edit/Users/Search.html:62
+msgid "Include disabled users in search."
+msgstr "列出停用的使用者"
+
+#: html/Edit/Users/Info:37
+msgid "Indirect Employee"
+msgstr "直接/间接员工"
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "初始优先权"
+
+#: lib/RT/Ticket_Overlay.pm:1169 lib/RT/Ticket_Overlay.pm:1171
+msgid "InitialPriority"
+msgstr "初始优先权"
+
+#: lib/RT/ScripAction_Overlay.pm:104
+msgid "Input error"
+msgstr "输入错误"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr "登记成功"
+
+#: lib/RT/Ticket_Overlay.pm:3835
+msgid "Internal Error"
+msgstr "内部错误"
+
+#: lib/RT/Record.pm:142
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "内部错误:%1"
+
+#: lib/RT/Group_Overlay.pm:643
+msgid "Invalid Group Type"
+msgstr "错误的群组类别"
+
+#: lib/RT/Principal_Overlay.pm:126
+msgid "Invalid Right"
+msgstr "错误的权限"
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "错误的类型"
+
+#: lib/RT/Interface/Web.pm:901
+msgid "Invalid data"
+msgstr "错误的数据"
+
+#: lib/RT/Ticket_Overlay.pm:439
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "错误的承办人。改为预设承办人「nobody」。"
+
+#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:250
+msgid "Invalid queue"
+msgstr "错误的表单"
+
+#: 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 "错误的权限"
+
+#: lib/RT/Record.pm:117
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "%1 的值错误"
+
+#: lib/RT/Ticket_Overlay.pm:3470
+msgid "Invalid value for custom field"
+msgstr "错误的自订字段值"
+
+#: lib/RT/Ticket_Overlay.pm:346
+msgid "Invalid value for status"
+msgstr "错误的状态值"
+
+#: NOT FOUND IN SOURCE
+msgid "IssueStatement"
+msgstr "送出陈述"
+
+#: bin/rt-crontool:190
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "请绝对不要让未具权限的使用者执行此工具程序。"
+
+#: 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 "建议您新增一个隶属于正确群组的低权限系统使用者,并以该身份执行此工具程序。"
+
+#: bin/rt-crontool:162
+msgid "It takes several arguments:"
+msgstr "它接受下列参数:"
+
+#: NOT FOUND IN SOURCE
+msgid "Item Name"
+msgstr "品名"
+
+#: NOT FOUND IN SOURCE
+msgid "Items"
+msgstr "笔"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "待签核项目"
+
+#: NOT FOUND IN SOURCE
+msgid "Jan"
+msgstr "一月"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "01"
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "一月"
+
+#: NOT FOUND IN SOURCE
+msgid "Job"
+msgstr "职称"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Join or leave this group"
+msgstr "加入或离开此群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Jul"
+msgstr "七月"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "01"
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "七月"
+
+#: html/Ticket/Elements/Tabs:98
+msgid "Jumbo"
+msgstr "全部信息"
+
+#: NOT FOUND IN SOURCE
+msgid "Jun"
+msgstr "六月"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "06."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "六月"
+
+#: NOT FOUND IN SOURCE
+msgid "Keyword"
+msgstr "关键词"
+
+#: lib/RT/CustomField_Vendor.pm:21
+msgid "LabelURL"
+msgstr "链接卷标"
+
+#: html/Admin/Elements/ModifyUser:51
+msgid "Lang"
+msgstr "使用语言"
+
+#: html/Ticket/Elements/Tabs:72
+msgid "Last"
+msgstr "上次更新"
+
+#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:38
+msgid "Last Contact"
+msgstr "上次联络"
+
+#: html/Elements/SelectDateType:28
+msgid "Last Contacted"
+msgstr "上次联络日期"
+
+#: html/Search/Elements/TicketHeader:40 html/Work/Search/TicketHeader:19
+msgid "Last Notified"
+msgstr "上次通知"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Updated"
+msgstr "上次更新"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr "上次更新"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "剩馀时间"
+
+#: html/Admin/Users/Modify.html:82
+msgid "Let this user access RT"
+msgstr "允许这名使用者登入"
+
+#: html/Admin/Users/Modify.html:86
+msgid "Let this user be granted rights"
+msgstr "内部成员(具有个人权限)"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "限制承办人为 %1 到%2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "限制表单为 %1 到 %2"
+
+#: html/Work/Queues/Select.html:4
+msgid "Link a Queue"
+msgstr "申请表单连结"
+
+#: lib/RT/Ticket_Overlay.pm:2726
+msgid "Link already exists"
+msgstr "此链接已存在"
+
+#: lib/RT/Ticket_Overlay.pm:2738
+msgid "Link could not be created"
+msgstr "无法新增链接"
+
+#: lib/RT/Ticket_Overlay.pm:2746 lib/RT/Ticket_Overlay.pm:2756
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "链接(%1)新增完毕"
+
+#: lib/RT/Ticket_Overlay.pm:2667
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "链接(%1)删除完毕"
+
+#: lib/RT/Ticket_Overlay.pm:2673
+msgid "Link not found"
+msgstr "找不到链接"
+
+#: html/Ticket/ModifyLinks.html:24 html/Ticket/ModifyLinks.html:28
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "链接申请单 #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr "链接申请单 %1"
+
+#: html/Ticket/Elements/Tabs:96
+msgid "Links"
+msgstr "链接"
+
+#: html/Edit/Users/Search.html:11
+msgid "List All Users"
+msgstr "列出所有用户数据"
+
+#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:84 html/Work/Preferences/Info:72
+msgid "Location"
+msgstr "位置"
+
+#: lib/RT.pm:162
+#. ($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
+msgid "LogToFile"
+msgstr "纪录等级"
+
+#: html/Edit/Global/Basic/Top:54
+msgid "LogToFileNamed"
+msgstr "纪录档名"
+
+#: html/Elements/Header:56
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+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
+msgid "Login"
+msgstr "登入"
+
+#: html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:29 html/Elements/Header:53
+msgid "Logout"
+msgstr "注销"
+
+#: NOT FOUND IN SOURCE
+msgid "Long-term contractor"
+msgstr "长期契约员工"
+
+#: html/Search/Bulk.html:85 html/Work/Search/Bulk.html:54
+msgid "Make Owner"
+msgstr "新增承办人"
+
+#: html/Search/Bulk.html:109 html/Work/Search/Bulk.html:63
+msgid "Make Status"
+msgstr "新增现况"
+
+#: html/Search/Bulk.html:117 html/Work/Search/Bulk.html:75
+msgid "Make date Due"
+msgstr "新增到期日"
+
+#: html/Search/Bulk.html:119 html/Work/Search/Bulk.html:78
+msgid "Make date Resolved"
+msgstr "新增解决日期"
+
+#: html/Search/Bulk.html:113 html/Work/Search/Bulk.html:69
+msgid "Make date Started"
+msgstr "新增实际起始日期"
+
+#: html/Search/Bulk.html:111 html/Work/Search/Bulk.html:66
+msgid "Make date Starts"
+msgstr "新增应起始日期"
+
+#: html/Search/Bulk.html:115 html/Work/Search/Bulk.html:72
+msgid "Make date Told"
+msgstr "新增报告日期"
+
+#: html/Search/Bulk.html:105 html/Work/Search/Bulk.html:57
+msgid "Make priority"
+msgstr "新增优先顺位"
+
+#: html/Search/Bulk.html:107 html/Work/Search/Bulk.html:60
+msgid "Make queue"
+msgstr "新增表单"
+
+#: html/Search/Bulk.html:103 html/Work/Search/Bulk.html:59
+msgid "Make subject"
+msgstr "新增主题"
+
+#: NOT FOUND IN SOURCE
+msgid "Male"
+msgstr "男"
+
+#: html/Admin/index.html:32
+msgid "Manage groups and group membership"
+msgstr "管理群组及所属成员"
+
+#: html/Admin/index.html:38
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "管理适用于所有表单的属性与设定"
+
+#: html/Admin/index.html:35
+msgid "Manage queues and queue-specific properties"
+msgstr "管理各表单及相关属性"
+
+#: html/Admin/index.html:29
+msgid "Manage users and passwords"
+msgstr "管理使用者与口令"
+
+#: NOT FOUND IN SOURCE
+msgid "Manager"
+msgstr "经理"
+
+#: NOT FOUND IN SOURCE
+msgid "Mar"
+msgstr "三月"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "03"
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "三月"
+
+#: NOT FOUND IN SOURCE
+msgid "Marketing Department"
+msgstr "行销部"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "五月"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "05"
+
+#: lib/RT/Group_Overlay.pm:981
+msgid "Member added"
+msgstr "新增成员完毕"
+
+#: lib/RT/Group_Overlay.pm:1139
+msgid "Member deleted"
+msgstr "成员已删除"
+
+#: lib/RT/Group_Overlay.pm:1143
+msgid "Member not deleted"
+msgstr "成员未被删除"
+
+#: html/Elements/SelectLinkType:25
+msgid "Member of"
+msgstr "隶属于"
+
+#: html/Work/Preferences/index.html:20
+msgid "Member since"
+msgstr "注册日期"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "隶属于"
+
+#: html/Admin/Elements/GroupTabs:41 html/Admin/Elements/ModifyTemplateAsWorkflow:232 html/User/Elements/GroupTabs:41
+msgid "Members"
+msgstr "成员"
+
+#: lib/RT/Ticket_Overlay.pm:2913
+msgid "Merge Successful"
+msgstr "整合完毕"
+
+#: lib/RT/Ticket_Overlay.pm:2833
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "整合失败。无法设定 EffectiveId"
+
+#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:114 html/Work/Search/BulkLinks:2
+msgid "Merge into"
+msgstr "整合进"
+
+#: html/Search/Bulk.html:137 html/Ticket/Update.html:100
+msgid "Message"
+msgstr "讯息"
+
+#: NOT FOUND IN SOURCE
+msgid "Misc. Expense"
+msgstr "杂费"
+
+#: lib/RT/Interface/Web.pm:903
+msgid "Missing a primary key?: %1"
+msgstr "缺少主键值?(%1)"
+
+#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:53 html/Work/Preferences/Info:33
+msgid "Mobile"
+msgstr "行动电话"
+
+#: html/Admin/Elements/ModifyUser:71
+msgid "MobilePhone"
+msgstr "行动电话"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Modify Access Control List"
+msgstr "更改权限控制清单"
+
+#: html/Admin/Global/CustomFields.html:43 html/Admin/Global/index.html:50
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "更改适用于所有表单的自订字段"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Modify Scrip templates for this queue"
+msgstr "更改此表单的模板"
+
+#: lib/RT/Queue_Overlay.pm:75
+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 "更改模板 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Workflow"
+msgstr "更改流程"
+
+#: html/Admin/Queues/CustomField.html:44
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "更改 %1 表单内的自订字段"
+
+#: html/Admin/Global/CustomField.html:52
+msgid "Modify a CustomField which applies to all queues"
+msgstr "更改适用于所有表单的自订字段"
+
+#: html/Admin/Queues/Scrip.html:53
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "更改 %1 表单内的手续"
+
+#: html/Admin/Global/Scrip.html:47
+msgid "Modify a scrip which applies to all queues"
+msgstr "更改适用于所有表单的手续"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "更改 # %1 的日期"
+
+#: html/Ticket/ModifyDates.html:24 html/Ticket/ModifyDates.html:28
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "更改 #%1 的日期"
+
+#: html/Ticket/ModifyDates.html:34
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "更改申请单 # %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 "更改全域设定的群组权限"
+
+#: html/Admin/Global/GroupRights.html:32
+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:24 html/Admin/Global/UserRights.html:27 html/Admin/Global/index.html:59
+msgid "Modify global user rights"
+msgstr "更改全域设定的使用者权限"
+
+#: html/Admin/Global/UserRights.html:32
+msgid "Modify global user rights."
+msgstr "更改全域设定的使用者权限。"
+
+#: lib/RT/Group_Overlay.pm:145
+msgid "Modify group metadata or delete group"
+msgstr "更改群组数据及删除群组"
+
+#: html/Admin/Groups/GroupRights.html:24 html/Admin/Groups/GroupRights.html:28 html/Admin/Groups/GroupRights.html:34
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "更改 %1 的群组权限"
+
+#: html/Admin/Queues/GroupRights.html:24 html/Admin/Queues/GroupRights.html:28
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "更改表单 %1 的群组权限"
+
+#: lib/RT/Group_Overlay.pm:147
+msgid "Modify membership roster for this group"
+msgstr "更改此群组的成员名单"
+
+#: lib/RT/System.pm:60
+msgid "Modify one's own RT account"
+msgstr "更改个人的帐号信息"
+
+#: html/Admin/Queues/People.html:24 html/Admin/Queues/People.html:28
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "更改链接到表单 %1 的人员"
+
+#: html/Ticket/ModifyPeople.html:24 html/Ticket/ModifyPeople.html:28 html/Ticket/ModifyPeople.html:34
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "更改申请单 #%1 链接到的人员"
+
+#: html/Admin/Queues/Scrips.html:45
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "更改表单 %1 的手续"
+
+#: html/Admin/Global/Scrips.html:43 html/Admin/Global/index.html:41
+msgid "Modify scrips which apply to all queues"
+msgstr "更改适用于所有表单的手续"
+
+#: html/Admin/Global/Template.html:24 html/Admin/Global/Template.html:29 html/Admin/Global/Template.html:80 html/Admin/Queues/Template.html:77
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "更改模板 %1"
+
+#: html/Admin/Global/Templates.html:43
+msgid "Modify templates which apply to all queues"
+msgstr "更改适用于所有表单的模板"
+
+#: html/Admin/Groups/Modify.html:86 html/User/Groups/Modify.html:85
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "更改群组 %1"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify the queue watchers"
+msgstr "更改表单视察员"
+
+#: html/Admin/Users/Modify.html:235
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "更改使用者 %1"
+
+#: html/Ticket/ModifyAll.html:36
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "更改申请单 # %1"
+
+#: html/Ticket/Modify.html:24 html/Ticket/Modify.html:27 html/Ticket/Modify.html:33
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "更改申请单 # %1"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Modify tickets"
+msgstr "更改申请单"
+
+#: html/Admin/Groups/UserRights.html:24 html/Admin/Groups/UserRights.html:28 html/Admin/Groups/UserRights.html:34
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "更改群组 %1 的使用者权限"
+
+#: html/Admin/Queues/UserRights.html:24 html/Admin/Queues/UserRights.html:28
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "更改表单 %1 的使用者权限"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "更改 '%1' 的视察员"
+
+#: html/Admin/Global/Workflow.html:25 html/Admin/Global/Workflow.html:30 html/Admin/Global/Workflow.html:81 html/Admin/Queues/Workflow.html:77
+#. (loc($WorkflowObj->Name()))
+#. ($WorkflowObj->id)
+msgid "Modify workflow %1"
+msgstr "更改流程 %1"
+
+#: html/Admin/Global/Workflows.html:44
+msgid "Modify workflows which apply to all queues"
+msgstr "更改适用于所有表单的流程"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ModifyACL"
+msgstr "更改权限清单"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "ModifyOwnMembership"
+msgstr "更改自己是否属于某群组"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyQueueWatchers"
+msgstr "更改表单视察员"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ModifyScrips"
+msgstr "更改手续"
+
+#: lib/RT/System.pm:60
+msgid "ModifySelf"
+msgstr "更改个人帐号"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "ModifyTemplate"
+msgstr "更改模板"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "ModifyTicket"
+msgstr "更改申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Mon"
+msgstr "星期一"
+
+#: lib/RT/Date.pm:388
+msgid "Mon."
+msgstr "星期一"
+
+#: html/Ticket/Elements/ShowRequestor:41
+#. ($name)
+msgid "More about %1"
+msgstr "关于 %1 的进一步信息"
+
+#: NOT FOUND IN SOURCE
+msgid "Morning Shift"
+msgstr "早班"
+
+#: html/Edit/Elements/ListButtons:16
+msgid "Move All"
+msgstr "全移"
+
+#: html/Admin/Elements/EditCustomFields:60
+msgid "Move down"
+msgstr "下移"
+
+#: html/Admin/Elements/EditCustomFields:52
+msgid "Move up"
+msgstr "上移"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Multiple"
+msgstr "多重"
+
+#: lib/RT/User_Overlay.pm:238
+msgid "Must specify 'Name' attribute"
+msgstr "必须指定 'Name' 的属性"
+
+#: html/SelfService/Elements/MyRequests:48
+#. ($friendly_status)
+msgid "My %1 tickets"
+msgstr "我的 %1 申请单"
+
+#: html/Work/Elements/Tab:35
+msgid "My Approvals"
+msgstr "表单签核"
+
+#: html/Work/Elements/Tab:33
+msgid "My Requests"
+msgstr "表单申请追踪"
+
+#: html/Work/Elements/Tab:37
+msgid "My Tickets"
+msgstr "表单处理"
+
+#: html/Approvals/index.html:24 html/Approvals/index.html:25
+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
+msgid "Name"
+msgstr "名称"
+
+#: lib/RT/User_Overlay.pm:245
+msgid "Name in use"
+msgstr "帐号已有人使用"
+
+#: html/Edit/Users/Info:27
+msgid "Nationality"
+msgstr "国籍"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "需先由系统管理员进行批准"
+
+#: html/Ticket/Elements/ShowDates:51
+msgid "Never"
+msgstr "从未更动"
+
+#: html/Elements/Quicksearch:29 html/Work/Elements/Quicksearch:15 html/Work/Tickets/Create.html:52
+msgid "New"
+msgstr "新建立"
+
+#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/User/Prefs.html:64 html/Work/Preferences/Info:44
+msgid "New Password"
+msgstr "新的口令"
+
+#: etc/initialdata:341 etc/upgrade/2.1.71:16 html/Edit/Elements/CreateApprovalsQueue:21
+msgid "New Pending Approval"
+msgstr "新的待签核事项"
+
+#: html/Ticket/Elements/EditLinks:110
+msgid "New Relationships"
+msgstr "新增关系"
+
+#: html/Work/Elements/Tab:31
+msgid "New Request"
+msgstr "表单申请"
+
+#: html/Ticket/Elements/Tabs:35
+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
+msgid "New custom field"
+msgstr "新增自订字段"
+
+#: html/Admin/Elements/GroupTabs:53 html/User/Elements/GroupTabs:51
+msgid "New group"
+msgstr "新增群组"
+
+#: html/SelfService/Prefs.html:31
+msgid "New password"
+msgstr "新的口令"
+
+#: lib/RT/User_Overlay.pm:706
+msgid "New password notification sent"
+msgstr "送出新口令通知"
+
+#: html/Admin/Elements/QueueTabs:69
+msgid "New queue"
+msgstr "新增表单"
+
+#: NOT FOUND IN SOURCE
+msgid "New request"
+msgstr "提出申请单"
+
+#: html/Admin/Elements/SelectRights:41
+msgid "New rights"
+msgstr "新增权限"
+
+#: html/Admin/Global/Scrip.html:39 html/Admin/Global/Scrips.html:38 html/Admin/Queues/Scrip.html:42 html/Admin/Queues/Scrips.html:54
+msgid "New scrip"
+msgstr "新增手续"
+
+#: html/Work/Search/index.html:62
+msgid "New search"
+msgstr "重新查询"
+
+#: 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 "新增模板"
+
+#: html/SelfService/Elements/Tabs:47
+msgid "New ticket"
+msgstr "提出申请单"
+
+#: lib/RT/Ticket_Overlay.pm:2800
+msgid "New ticket doesn't exist"
+msgstr "没有新申请单"
+
+#: html/Admin/Elements/UserTabs:51
+msgid "New user"
+msgstr "新增使用者"
+
+#: html/Admin/Elements/CreateUserCalled:25
+msgid "New user called"
+msgstr "新使用者名字"
+
+#: html/Admin/Queues/People.html:54 html/Ticket/Elements/EditPeople:28
+msgid "New watchers"
+msgstr "新视察员"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "New window setting"
+msgstr "更新窗口设定"
+
+#: html/Admin/Global/Workflow.html:60 html/Admin/Global/Workflows.html:39 html/Admin/Queues/Workflow.html:57 html/Admin/Queues/Workflows.html:50
+msgid "New workflow"
+msgstr "新增流程"
+
+#: html/Ticket/Elements/Tabs:68
+msgid "Next"
+msgstr "下一项"
+
+#: html/Search/Listing.html:47 html/Work/Search/index.html:24
+msgid "Next page"
+msgstr "下一页"
+
+#: html/Admin/Elements/ModifyUser:49
+msgid "NickName"
+msgstr "昵称"
+
+#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:45 html/Work/Preferences/Info:23
+msgid "Nickname"
+msgstr "昵称"
+
+#: NOT FOUND IN SOURCE
+msgid "Night Shift"
+msgstr "小夜班"
+
+#: html/Edit/Global/Basic/Top:27
+msgid "No"
+msgstr "否"
+
+#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:104
+msgid "No CustomField"
+msgstr "无自订字段"
+
+#: html/Admin/Groups/GroupRights.html:83 html/Admin/Groups/UserRights.html:70
+msgid "No Group defined"
+msgstr "尚未定义群组"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:67
+msgid "No Queue defined"
+msgstr "没有定义好的表单"
+
+#: bin/rt-crontool:55
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "找不到 RT 使用者。请向 RT 管理员查询。\\n"
+
+#: html/Admin/Global/Template.html:78 html/Admin/Queues/Template.html:75
+msgid "No Template"
+msgstr "没有模板"
+
+#: bin/rt-commit-handler:763
+msgid "No Ticket specified. Aborting ticket "
+msgstr "未指定申请单。退出申请单 "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "未指定申请单。退出申请单更改\\n\\n"
+
+#: html/Admin/Elements/ModifyWorkflow:237 html/Admin/Global/Workflow.html:79 html/Admin/Queues/Workflow.html:75
+msgid "No Workflow"
+msgstr "没有流程"
+
+#: html/Approvals/Elements/Approve:45 html/Work/Approvals/Elements/Approve:35
+msgid "No action"
+msgstr "暂不处理"
+
+#: lib/RT/Interface/Web.pm:898
+msgid "No column specified"
+msgstr "未指定字段"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "找不到命令"
+
+#: html/Elements/ViewUser:35 html/Ticket/Elements/ShowRequestor:44
+msgid "No comment entered about this user"
+msgstr "没有对这名使用者的评论"
+
+#: lib/RT/Ticket_Overlay.pm:2211 lib/RT/Ticket_Overlay.pm:2279
+msgid "No correspondence attached"
+msgstr "没有附上申请单回复"
+
+#: lib/RT/Action/Generic.pm:149 lib/RT/Condition/Generic.pm:175 lib/RT/Search/ActiveTicketsInQueue.pm:55 lib/RT/Search/Generic.pm:112
+#. (ref $self)
+msgid "No description for %1"
+msgstr "没有对 %1 的描述"
+
+#: lib/RT/Users_Overlay.pm:150
+msgid "No group specified"
+msgstr "未指定群组"
+
+#: lib/RT/User_Overlay.pm:924
+msgid "No password set"
+msgstr "没有设定口令"
+
+#: lib/RT/Queue_Overlay.pm:260
+msgid "No permission to create queues"
+msgstr "没有新增表单的权限"
+
+#: lib/RT/Ticket_Overlay.pm:342
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "没有在表单 '%1' 新增申请单的权限"
+
+#: lib/RT/User_Overlay.pm:211
+msgid "No permission to create users"
+msgstr "没有新增使用者的权限"
+
+#: html/SelfService/Display.html:117
+msgid "No permission to display that ticket"
+msgstr "没有显示该申请单的权限"
+
+#: html/SelfService/Update.html:51
+msgid "No permission to view update ticket"
+msgstr "没有检视申请单更新的权限"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1496
+msgid "No principal specified"
+msgstr "未指定单位"
+
+#: html/Admin/Queues/People.html:153 html/Admin/Queues/People.html:163
+msgid "No principals selected."
+msgstr "未指定单位。"
+
+#: NOT FOUND IN SOURCE
+msgid "No protocol specified in %1"
+msgstr "%1 内未指定协议"
+
+#: html/Admin/Queues/index.html:34
+msgid "No queues matching search criteria found."
+msgstr "找不到符合查询条件的表单。"
+
+#: html/Admin/Elements/SelectRights:80
+msgid "No rights found"
+msgstr "找不到权限"
+
+#: html/Admin/Elements/SelectRights:32
+msgid "No rights granted."
+msgstr "没有选定权限"
+
+#: html/Search/Bulk.html:160 html/Work/Search/Bulk.html:117
+msgid "No search to operate on."
+msgstr "没有要进行的查询"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "未指定申请单编号"
+
+#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516
+msgid "No transaction type specified"
+msgstr "未指定更动报告类别"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "未指定使用者或电子邮件地址"
+
+#: html/Admin/Users/index.html:35
+msgid "No users matching search criteria found."
+msgstr "找不到符合查询条件的使用者。"
+
+#: bin/rt-commit-handler:643
+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
+msgid "No value sent to _Set!\\n"
+msgstr "_Set 没有收到任何值!\\n"
+
+#: html/Search/Elements/TicketRow:36 html/Work/Search/TicketRow:9
+msgid "Nobody"
+msgstr "没有人"
+
+#: lib/RT/Interface/Web.pm:900
+msgid "Nonexistant field?"
+msgstr "字段不存在?"
+
+#: NOT FOUND IN SOURCE
+msgid "Normal Users"
+msgstr "一般用户群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Not configured to fetch the content from a %1 in %2"
+msgstr "未设定成从 %2 内撷取 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Not logged in"
+msgstr "尚未登入"
+
+#: html/Elements/Header:58
+msgid "Not logged in."
+msgstr "尚未登入"
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "尚未设定"
+
+#: html/NoAuth/Reminder.html:26
+msgid "Not yet implemented."
+msgstr "尚未完工。"
+
+#: NOT FOUND IN SOURCE
+msgid "Not yet implemented...."
+msgstr "尚未完工..."
+
+#: html/Approvals/Elements/Approve:48 html/Work/Tickets/Create.html:134
+msgid "Notes"
+msgstr "备注"
+
+#: NOT FOUND IN SOURCE
+msgid "Notes:"
+msgstr "备注:"
+
+#: lib/RT/User_Overlay.pm:709
+msgid "Notification could not be sent"
+msgstr "无法送出通知"
+
+#: etc/initialdata:111
+msgid "Notify AdminCcs"
+msgstr "通知管理员副本收件人"
+
+#: etc/initialdata:107
+msgid "Notify AdminCcs as Comment"
+msgstr "以评论方式通知管理员副本收件人"
+
+#: etc/initialdata:138
+msgid "Notify Other Recipients"
+msgstr "通知其它收件人"
+
+#: etc/initialdata:134
+msgid "Notify Other Recipients as Comment"
+msgstr "以评论方式通知其它收件人"
+
+#: etc/initialdata:103
+msgid "Notify Owner"
+msgstr "通知承办人"
+
+#: etc/initialdata:99
+msgid "Notify Owner as Comment"
+msgstr "以评论方式通知承办人"
+
+#: etc/initialdata:385
+msgid "Notify Owner of their rejected ticket"
+msgstr "通知承办人申请单已驳回"
+
+#: etc/initialdata:374
+msgid "Notify Owner of their ticket has been approved by all approvers"
+msgstr "通知承办人申请单已完成全部签核"
+
+#: etc/initialdata:359
+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
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "整理待签核事项,通知承办人及管理员副本收件人"
+
+#: etc/initialdata:95
+msgid "Notify Requestors"
+msgstr "通知申请人"
+
+#: etc/initialdata:121
+msgid "Notify Requestors and Ccs"
+msgstr "通知申请人及副本收件人"
+
+#: etc/initialdata:116
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "以评论方式通知申请人及副本收件人"
+
+#: etc/initialdata:130
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "通知申请人、副本及管理员副本收件人"
+
+#: etc/initialdata:126
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "以评论方式通知申请人、副本及管理员副本收件人"
+
+#: html/Work/Tickets/Cc:55
+msgid "Notify people:"
+msgstr "通知对象"
+
+#: NOT FOUND IN SOURCE
+msgid "Nov"
+msgstr "十一月"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "11"
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "十一月"
+
+#: html/Edit/Global/Basic/Top:74
+msgid "OIN104"
+msgstr "配合 104eHRMS 接口"
+
+#: html/Edit/Global/Workflow/Export.html:30 html/Work/Copyright.html:23
+msgid "OK"
+msgstr "确定"
+
+#: lib/RT/Record.pm:156
+msgid "Object could not be created"
+msgstr "无法新增对象"
+
+#: lib/RT/Record.pm:175
+msgid "Object created"
+msgstr "对象新增完毕"
+
+#: html/Edit/Users/Info:36
+msgid "Occupation Status"
+msgstr "在职状态"
+
+#: NOT FOUND IN SOURCE
+msgid "Oct"
+msgstr "十月"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "10"
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "十月"
+
+#: html/Edit/Users/Info:33
+msgid "Office Phone"
+msgstr "办公室电话"
+
+#: html/Elements/SelectDateRelation:34
+msgid "On"
+msgstr "等于"
+
+#: etc/initialdata:173
+msgid "On Comment"
+msgstr "评论时"
+
+#: etc/initialdata:166
+msgid "On Correspond"
+msgstr "回复申请单时"
+
+#: etc/initialdata:155
+msgid "On Create"
+msgstr "新增申请单时"
+
+#: etc/initialdata:187
+msgid "On Owner Change"
+msgstr "承办人改变时"
+
+#: etc/initialdata:195
+msgid "On Queue Change"
+msgstr "表单改变时"
+
+#: etc/initialdata:201
+msgid "On Resolve"
+msgstr "解决申请单时"
+
+#: etc/initialdata:179
+msgid "On Status Change"
+msgstr "现况改变时"
+
+#: etc/initialdata:160
+msgid "On Transaction"
+msgstr "发生更动时"
+
+#: html/Approvals/Elements/PendingMyApproval:49
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "仅显示 %1 之后新增的申请单"
+
+#: html/Approvals/Elements/PendingMyApproval:47
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+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
+msgid "Open"
+msgstr "开启"
+
+#: html/Ticket/Elements/Tabs:135
+msgid "Open it"
+msgstr "开启"
+
+#: html/SelfService/Elements/Tabs:41
+msgid "Open tickets"
+msgstr "开启的申请单"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in a new window"
+msgstr "在新窗口开启(列表的)申请单"
+
+#: html/Admin/Users/Prefs.html:39
+msgid "Open tickets (from listing) in another window"
+msgstr "在另一个窗口开启(列表的)申请单"
+
+#: etc/initialdata:150
+msgid "Open tickets on correspondence"
+msgstr "收到回复时即开启申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Opened Tickets"
+msgstr "已申请运行中表单"
+
+#: NOT FOUND IN SOURCE
+msgid "Opinion"
+msgstr "意见"
+
+#: html/Edit/Global/CustomField/Info:35
+msgid "Option Description"
+msgstr "选项描述"
+
+#: html/Edit/Global/CustomField/Info:29
+msgid "Option Name"
+msgstr "选项名称"
+
+#: html/Search/Elements/PickRestriction:100 html/Work/Search/PickRestriction:81
+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
+msgid "Organization"
+msgstr "组织名称"
+
+#: NOT FOUND IN SOURCE
+msgid "Organization:"
+msgstr "组织:"
+
+#: html/Approvals/Elements/Approve:32
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "原申请单:#%1"
+
+#: html/Edit/Elements/PickUsers:109 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
+msgid "Over time, priority moves toward"
+msgstr "优先顺位随时间增加调整为"
+
+#: NOT FOUND IN SOURCE
+msgid "Override current custom fields with fields from %1"
+msgstr "以 %1 表单的自订字段取代现有字段"
+
+#: html/Admin/Elements/CheckOverrideGlobalACL:25
+msgid "Override global rights"
+msgstr "取代全域权限"
+
+#: html/Admin/Elements/CheckOverrideGlobalACL:34
+#. (loc_fuzzy($msg))
+msgid "OverrideGlobalACL status %1"
+msgstr "取代全域权限 %1"
+
+#: html/Work/Elements/Tab:29
+msgid "Overview"
+msgstr "总览"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Own tickets"
+msgstr "承办申请单"
+
+#: lib/RT/Queue_Overlay.pm:86
+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
+msgid "Owner"
+msgstr "承办人"
+
+#: NOT FOUND IN SOURCE
+msgid "Owner changed from %1 to %2"
+msgstr "承办人已从 %1 改为 %2"
+
+#: lib/RT/Transaction_Overlay.pm:582
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "强制将承办人从 %1 改为 %2"
+
+#: html/Search/Elements/PickRestriction:30 html/Work/Search/PickRestriction:10
+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
+msgid "Owner's Phone"
+msgstr "承办人电话"
+
+#: html/Edit/Elements/Page:39
+msgid "Page"
+msgstr " "
+
+#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:55 html/Work/Preferences/Info:35
+msgid "Pager"
+msgstr "呼叫器"
+
+#: html/Admin/Elements/ModifyUser:73
+msgid "PagerPhone"
+msgstr "呼叫器号码"
+
+#: html/Edit/Global/Workflow/Action:81 html/Edit/Global/Workflow/Condition:66
+msgid "Parameter"
+msgstr "呼叫参数"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:225
+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
+msgid "Parents"
+msgstr "母申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Park Space"
+msgstr "停车位申请"
+
+#: html/Elements/Login:52 html/User/Prefs.html:60 html/Work/Preferences/Info:41
+msgid "Password"
+msgstr "口令"
+
+#: html/NoAuth/Reminder.html:24
+msgid "Password Reminder"
+msgstr "口令提示"
+
+#: lib/RT/User_Overlay.pm:228 lib/RT/User_Overlay.pm:927
+msgid "Password too short"
+msgstr "口令太短"
+
+#: html/Admin/Users/Modify.html:290 html/User/Prefs.html:171 html/Work/Preferences/Info:162
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "口令:%1"
+
+#: html/Admin/Users/Modify.html:292
+msgid "Passwords do not match."
+msgstr "口令确认失败。"
+
+#: html/User/Prefs.html:173 html/Work/Preferences/Info:164
+msgid "Passwords do not match. Your password has not been changed"
+msgstr "口令确认失败。您的口令并未改变。"
+
+#: NOT FOUND IN SOURCE
+msgid "Pelase select a queue"
+msgstr "请选择表单名称"
+
+#: NOT FOUND IN SOURCE
+msgid "Pending Approval"
+msgstr "等待签核"
+
+#: html/Ticket/Elements/ShowSummary:44 html/Ticket/Elements/Tabs:95 html/Ticket/ModifyAll.html:50
+msgid "People"
+msgstr "人员"
+
+#: NOT FOUND IN SOURCE
+msgid "People with Queue Rights"
+msgstr "拥有表单权限人员"
+
+#: etc/initialdata:143
+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
+msgid "Permission Denied"
+msgstr "权限不足"
+
+#: html/Edit/Rights/index.html:3
+msgid "Permission Settings"
+msgstr "权限设定"
+
+#: NOT FOUND IN SOURCE
+msgid "Permitted Queues:"
+msgstr "拥有权限表单列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Personal"
+msgstr "代理人群组"
+
+#: html/User/Elements/Tabs:34
+msgid "Personal Groups"
+msgstr "代理人群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Personal Todo"
+msgstr "私人待办事项"
+
+#: html/User/Groups/index.html:29 html/User/Groups/index.html:39
+msgid "Personal groups"
+msgstr "代理人群组"
+
+#: html/User/Elements/DelegateRights:36
+msgid "Personal groups:"
+msgstr "代理人群组:"
+
+#: html/Work/Preferences/Info:21
+msgid "PersonalHomepage"
+msgstr "个人首页"
+
+#: NOT FOUND IN SOURCE
+msgid "Phone"
+msgstr "电话"
+
+#: html/Work/Delegates/Info:90 html/Work/Overview/Info:72
+msgid "Phone number"
+msgstr "电话号码"
+
+#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:48 html/Work/Preferences/Info:27
+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
+msgid "Pick"
+msgstr "挑选"
+
+#: NOT FOUND IN SOURCE
+msgid "Place of Departure"
+msgstr "出发地点"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Please Select"
+msgstr "请选择"
+
+#: html/Edit/Elements/104Buttons:30
+msgid "Please check items to be deleted first."
+msgstr "请先选中要删除的对象"
+
+#: NOT FOUND IN SOURCE
+msgid "Please select a group"
+msgstr "请选择群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Please select a queue's workflow"
+msgstr "请选择表单流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Please select role"
+msgstr "请选择角色"
+
+#: NOT FOUND IN SOURCE
+msgid "Policy"
+msgstr "经营规章"
+
+#: NOT FOUND IN SOURCE
+msgid "Position"
+msgstr "职务"
+
+#: html/Edit/Users/Info:43
+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
+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
+msgid "Position Number"
+msgstr "职务代码"
+
+#: html/Edit/Users/Info:44
+msgid "Position Rank"
+msgstr "职级"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Preferences"
+msgstr "偏好"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "个人信息"
+
+#: lib/RT/Action/Generic.pm:159
+msgid "Prepare Stubbed"
+msgstr "预备动作完毕"
+
+#: html/Ticket/Elements/Tabs:60
+msgid "Prev"
+msgstr "上一项"
+
+#: html/Search/Listing.html:43 html/Work/Search/index.html:20
+msgid "Previous page"
+msgstr "前一页"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "优先顺位"
+
+#: lib/RT/ACE_Overlay.pm:132 lib/RT/ACE_Overlay.pm:207 lib/RT/ACE_Overlay.pm:551
+#. ($args{'PrincipalId'})
+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
+msgid "Priority"
+msgstr "优先顺位"
+
+#: html/Admin/Elements/ModifyQueue:50 html/Admin/Queues/Modify.html:64
+msgid "Priority starts at"
+msgstr "优先顺位起始值"
+
+#: etc/initialdata:43
+msgid "Privileged"
+msgstr "内部成员"
+
+#: html/Admin/Users/Modify.html:270 html/User/Prefs.html:162 html/Work/Preferences/Info:153
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "内部成员状态:%1"
+
+#: html/Admin/Users/index.html:61
+msgid "Privileged users"
+msgstr "内部成员"
+
+#: html/Work/Elements/SelectSearch:16
+msgid "Process Status"
+msgstr "处理状态"
+
+#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 etc/initialdata:77
+msgid "Pseudogroup for internal use"
+msgstr "内部用的虚拟群组"
+
+#: html/Work/Preferences/Info:64
+msgid "Public Info"
+msgstr "公开信息"
+
+#: html/Work/Elements/104Header:88
+msgid "Public Service"
+msgstr "公共事务区"
+
+#: 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
+msgid "Queue"
+msgstr "表单"
+
+#: html/Admin/Queues/CustomField.html:41 html/Admin/Queues/Scrip.html:49 html/Admin/Queues/Scrips.html:47 html/Admin/Queues/Templates.html:43 html/Admin/Queues/Workflows.html:44
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "找不到表单 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "找不到表单 '%1'\\n"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Queue Owner"
+msgstr "业务承办人"
+
+#: html/Edit/Queues/Basic/Top:35
+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
+msgid "Queue Rights"
+msgstr "表单权限"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "表单手续"
+
+#: html/Edit/Elements/Tab:36
+msgid "Queue Setup"
+msgstr "表单设定"
+
+#: lib/RT/Queue_Overlay.pm:264
+msgid "Queue already exists"
+msgstr "表单已存在"
+
+#: lib/RT/Queue_Overlay.pm:273 lib/RT/Queue_Overlay.pm:279
+msgid "Queue could not be created"
+msgstr "无法新增表单"
+
+#: html/Edit/Queues/autohandler:8 html/Ticket/Create.html:204 html/Work/Tickets/Create.html:176
+msgid "Queue could not be loaded."
+msgstr "无法加载表单"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283
+msgid "Queue created"
+msgstr "表单新增完毕"
+
+#: html/Admin/Elements/ModifyWorkflow:32
+msgid "Queue is not specified."
+msgstr "未指定表单。"
+
+#: html/SelfService/Display.html:70 lib/RT/CustomField_Overlay.pm:97
+msgid "Queue not found"
+msgstr "找不到表单"
+
+#: html/Admin/Elements/Tabs:37 html/Admin/index.html:34
+msgid "Queues"
+msgstr "表单"
+
+#: html/Work/Elements/Quicksearch:10
+msgid "Quick Search"
+msgstr "表单现况"
+
+#: html/Elements/Quicksearch:24
+msgid "Quick search"
+msgstr "表单一览"
+
+#: html/Elements/Login:44
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "%2:RT %1 版"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 版,<a href=\"http://bestpractical.com\">Best Practical Solutions 公司</a>出品。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1。版权所有 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1。版权所有 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:24 html/Admin/index.html:25
+msgid "RT Administration"
+msgstr "RT 管理页面"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "RT 认证错误。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RT 退信:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "RT 设定错误"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "RT 致命错误。讯息未被纪录。"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:40
+msgid "RT Error"
+msgstr "RT 错误"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT 收到从自己寄出的邮件 (%1)。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr "RT 收到从自己寄出的邮件 (%1)。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT 自助服务/已解决的申请单"
+
+#: html/index.html:24 html/index.html:27
+msgid "RT at a glance"
+msgstr "RT 一览"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT 无法认证你"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT 无法从外部数据库查询找到申请人信息"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT 找不到表单:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT 无法确认这个 PGP 签章。\\n"
+
+#: html/Edit/Elements/104Header:7 html/Edit/Elements/104Top:20 html/Elements/PageLayout:85 html/Work/Elements/104Header:7
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "%1 专用流程系统"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "%1 专用 RT 系统:%2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT 已执行您的命令"
+
+#: html/Elements/Login:94
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT 版权所有 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;。<br>本软体依 <a href=\"http://www.gnu.org/copyleft/gpl.html\">GNU 通用公共授权第二版</a> 散布。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT 认为这可能是退信"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT 以未签章方式处理这封邮件。\\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 的电子邮件命令模式须要 PGP 认证。您可能没有签章,或是您的签章无法辨识。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT::Queue-Role"
+msgstr "表单运行角色"
+
+#: NOT FOUND IN SOURCE
+msgid "RT::System-Role"
+msgstr "系统运行角色"
+
+#: NOT FOUND IN SOURCE
+msgid "RT::Ticket-Role"
+msgstr "申请单运行角色"
+
+#: html/Work/Tickets/Elements/ShowTransaction:11
+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
+msgid "Real Name"
+msgstr "真实姓名"
+
+#: html/Admin/Elements/ModifyUser:47
+msgid "RealName"
+msgstr "真实姓名"
+
+#: html/Work/Approvals/Display.html:27 html/Work/Tickets/Update.html:85
+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
+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
+msgid "Refers to"
+msgstr "参考"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr "参考"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "在结果范围内查询"
+
+#: html/Search/Elements/PickRestriction:26 html/Work/Search/PickRestriction:7
+msgid "Refine search"
+msgstr "调整查询条件"
+
+#: html/Work/Overview/index.html:12
+msgid "Refresh"
+msgstr "更新"
+
+#: html/Elements/Refresh:35
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "每 %1 分钟更新页面"
+
+#: html/Ticket/Create.html:173 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56
+msgid "Relationships"
+msgstr "关系"
+
+#: html/Edit/Elements/ListButtons:13
+msgid "Remove"
+msgstr "移除"
+
+#: html/Search/Bulk.html:97 html/Work/Search/Bulk.html:77
+msgid "Remove AdminCc"
+msgstr "移除管理员副本"
+
+#: html/Search/Bulk.html:93 html/Work/Search/Bulk.html:71
+msgid "Remove Cc"
+msgstr "移除副本"
+
+#: html/Search/Bulk.html:89 html/Work/Search/Bulk.html:65
+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
+msgid "Reply"
+msgstr "回复"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Reply to tickets"
+msgstr "对申请单进行回复"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "ReplyToTicket"
+msgstr "回复申请单"
+
+#: html/Edit/Users/Info:46
+msgid "Report to Duty"
+msgstr "上下班刷卡"
+
+#: html/Edit/Users/Info:34
+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
+msgid "Requestor"
+msgstr "申请人"
+
+#: html/Edit/Global/Workflow/Owner.html:44
+msgid "Requestor Group's"
+msgstr "申请人所属群组之"
+
+#: html/Search/Elements/PickRestriction:37 html/Work/Search/PickRestriction:17
+msgid "Requestor email address"
+msgstr "申请人电子邮件信箱地址"
+
+#: html/Edit/Global/Workflow/Owner.html:28
+msgid "Requestor's"
+msgstr "申请人所属之第上"
+
+#: html/Work/Elements/List:23
+msgid "Requestor's Phone"
+msgstr "申请人电话"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "申请人"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "申请人地址"
+
+#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30
+msgid "Requestors"
+msgstr "申请人"
+
+#: html/Admin/Elements/ModifyQueue:60 html/Admin/Queues/Modify.html:74
+msgid "Requests should be due in"
+msgstr "申请单处理期限"
+
+#: html/Elements/Submit:61
+msgid "Reset"
+msgstr "重设"
+
+#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:49 html/Work/Preferences/Info:29
+msgid "Residence"
+msgstr "住处"
+
+#: NOT FOUND IN SOURCE
+msgid "Resolution"
+msgstr "解决状态"
+
+#: html/Ticket/Elements/Tabs:131 html/Work/Tickets/Display.html:34
+msgid "Resolve"
+msgstr "解决"
+
+#: html/Ticket/Update.html:136 html/Work/Tickets/Update.html:120
+#. ($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
+msgid "Resolved"
+msgstr "已解决"
+
+#: html/Search/Bulk.html:132 html/Ticket/ModifyAll.html:72 html/Ticket/Update.html:71 html/Work/Search/Bulk.html:84 html/Work/Tickets/Update.html:38
+msgid "Response to requestors"
+msgstr "回复申请人"
+
+#: html/Edit/Users/Info:45
+msgid "Responsibility Type"
+msgstr "责任区分"
+
+#: html/Elements/ListActions:25
+msgid "Results"
+msgstr "结果"
+
+#: html/Search/Elements/PickRestriction:104 html/Work/Search/PickRestriction:84
+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
+msgid "Retype Password"
+msgstr "再次输入口令"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "在 %4 (%5) 的范围内找不到 %2 %3 的 %1 权限\\n"
+
+#: lib/RT/ACE_Overlay.pm:612
+msgid "Right Delegated"
+msgstr "权限代理完毕"
+
+#: lib/RT/ACE_Overlay.pm:302
+msgid "Right Granted"
+msgstr "权限设定完毕"
+
+#: lib/RT/ACE_Overlay.pm:160
+msgid "Right Loaded"
+msgstr "权限加载完毕"
+
+#: lib/RT/ACE_Overlay.pm:677 lib/RT/ACE_Overlay.pm:692
+msgid "Right could not be revoked"
+msgstr "无法撤消权限"
+
+#: html/User/Delegation.html:63
+msgid "Right not found"
+msgstr "找不到权限"
+
+#: lib/RT/ACE_Overlay.pm:542 lib/RT/ACE_Overlay.pm:637
+msgid "Right not loaded."
+msgstr "权限并未加载。"
+
+#: lib/RT/ACE_Overlay.pm:688
+msgid "Right revoked"
+msgstr "权限撤消完毕"
+
+#: html/Admin/Elements/UserTabs:40
+msgid "Rights"
+msgstr "权限及代理人"
+
+#: lib/RT/Interface/Web.pm:794
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "无法将权限赋予 %1"
+
+#: lib/RT/Interface/Web.pm:827
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "无法撤消 %1 的权限"
+
+#: html/Edit/Groups/Member:55 html/Edit/Groups/Members/List:10
+msgid "Role Members"
+msgstr "角色成员"
+
+#: html/Edit/Groups/Member:37 html/Edit/Groups/Members/Add.html:13 html/Edit/Groups/Members/List:7 html/Edit/Groups/Roles/List:4 html/Edit/Groups/Roles/Top:7
+msgid "Role Name"
+msgstr "角色名称"
+
+#: html/Admin/Global/GroupRights.html:50 html/Admin/Queues/GroupRights.html:52 html/Edit/Global/Workflow/Owner.html:55 html/Edit/Global/Workflow/Owner.html:81 html/Edit/Groups/Member:24
+msgid "Roles"
+msgstr "角色"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "交由系统管理员签核"
+
+#: html/Edit/Global/Workflow/Action:27
+msgid "Run Approval"
+msgstr "签核执行"
+
+#: html/Edit/Global/Basic/Top:72
+msgid "SMTPDebug"
+msgstr "SMTP 侦错纪录"
+
+#: html/Edit/Global/Basic/Top:58
+msgid "SMTPFrom"
+msgstr "SMTP 寄件地址"
+
+#: html/Edit/Global/Basic/Top:56
+msgid "SMTPServer"
+msgstr "SMTP 服务器"
+
+#: NOT FOUND IN SOURCE
+msgid "Sat"
+msgstr "星期六"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "星期六"
+
+#: html/Edit/Elements/104Buttons:72 html/Work/Preferences/index.html:35
+msgid "Save"
+msgstr "储存"
+
+#: 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 "储存更改"
+
+#: NOT FOUND IN SOURCE
+msgid "Save changes"
+msgstr "储存更改"
+
+#: html/Admin/Global/Scrip.html:48 html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->id)
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "手续 #%1"
+
+#: html/Edit/Global/Scrip/List:9 html/Edit/Global/Scrip/Top:41
+msgid "Scrip Action"
+msgstr "讯息通知动作"
+
+#: html/Edit/Global/Scrip/List:8 html/Edit/Global/Scrip/Top:15
+msgid "Scrip Condition"
+msgstr "讯息通知条件"
+
+#: lib/RT/Scrip_Overlay.pm:175
+msgid "Scrip Created"
+msgstr "手续新增完毕"
+
+#: html/Edit/Global/Scrip/List:7 html/Edit/Global/Scrip/Top:9
+msgid "Scrip Name"
+msgstr "讯息名称"
+
+#: html/Admin/Elements/EditScrips:83
+msgid "Scrip deleted"
+msgstr "手续删除完毕"
+
+#: html/Admin/Elements/QueueTabs:45 html/Admin/Elements/SystemTabs:32 html/Admin/Global/index.html:40
+msgid "Scrips"
+msgstr "手续"
+
+#: html/Edit/Global/autohandler:9 html/Edit/Queues/autohandler:20
+msgid "Scrips "
+msgstr "讯息通知"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "%1 的手续\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+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
+msgid "Search"
+msgstr "查询"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "查询条件"
+
+#: html/Approvals/Elements/PendingMyApproval:38
+msgid "Search for approvals"
+msgstr "签核单查询"
+
+#: html/Edit/Global/Workflow/Owner.html:31
+msgid "Second-"
+msgstr "二"
+
+#: html/Edit/Users/Info:41
+msgid "Second-level Users"
+msgstr "二阶主管员工"
+
+#: bin/rt-crontool:187
+msgid "Security:"
+msgstr "安全性:"
+
+#: lib/RT/Queue_Overlay.pm:66
+msgid "SeeQueue"
+msgstr "查阅表单"
+
+#: html/Edit/Elements/ListButtons:10
+msgid "Select All"
+msgstr "全选"
+
+#: html/Admin/Groups/index.html:39
+msgid "Select a group"
+msgstr "选择群组"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "选择表单"
+
+#: html/Work/Queues/Select.html:8
+msgid "Select a queue to link to"
+msgstr "请选择欲连结表单"
+
+#: html/Admin/Users/index.html:24 html/Admin/Users/index.html:27
+msgid "Select a user"
+msgstr "选择使用者"
+
+#: html/Admin/Global/CustomField.html:37 html/Admin/Global/CustomFields.html:35
+msgid "Select custom field"
+msgstr "选择自订字段"
+
+#: html/Admin/Elements/GroupTabs:51 html/User/Elements/GroupTabs:49
+msgid "Select group"
+msgstr "选择群组"
+
+#: lib/RT/CustomField_Overlay.pm:421
+msgid "Select multiple values"
+msgstr "选择多重项目"
+
+#: lib/RT/CustomField_Overlay.pm:418
+msgid "Select one value"
+msgstr "选择单一项目"
+
+#: html/Admin/Elements/QueueTabs:66
+msgid "Select queue"
+msgstr "选择表单"
+
+#: html/Admin/Global/Scrip.html:36 html/Admin/Global/Scrips.html:35 html/Admin/Queues/Scrip.html:39 html/Admin/Queues/Scrips.html:51
+msgid "Select scrip"
+msgstr "选择手续"
+
+#: 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 "选择模板"
+
+#: html/Admin/Elements/UserTabs:48
+msgid "Select user"
+msgstr "选择使用者"
+
+#: html/Admin/Global/Workflow.html:57 html/Admin/Global/Workflows.html:36 html/Admin/Queues/Workflow.html:54 html/Admin/Queues/Workflows.html:47
+msgid "Select workflow"
+msgstr "选择流程"
+
+#: NOT FOUND IN SOURCE
+msgid "SelectExternal"
+msgstr "系统选项"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectMultiple"
+msgstr "多重选项"
+
+#: lib/RT/CustomField_Overlay.pm:34
+msgid "SelectSingle"
+msgstr "单一选项"
+
+#: html/Edit/Elements/PickUsers:85 html/Edit/Users/Add.html:78
+msgid "Selected users:"
+msgstr "新增对象:"
+
+#: NOT FOUND IN SOURCE
+msgid "Self Service"
+msgstr "自助服务"
+
+#: etc/initialdata:131
+msgid "Send mail to all watchers"
+msgstr "寄信给所有视察员"
+
+#: etc/initialdata:127
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "以评论方式寄信给所有视察员"
+
+#: etc/initialdata:122
+msgid "Send mail to requestors and Ccs"
+msgstr "寄信给申请人及副本收件人"
+
+#: etc/initialdata:117
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "以评论方式寄信给申请人及副本收件人"
+
+#: etc/initialdata:96
+msgid "Sends a message to the requestors"
+msgstr "寄信给申请人"
+
+#: etc/initialdata:135 etc/initialdata:139
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "寄信给特定的副本及密件副本收件人"
+
+#: etc/initialdata:112
+msgid "Sends mail to the administrative Ccs"
+msgstr "寄信给管理员副本收件人"
+
+#: etc/initialdata:108
+msgid "Sends mail to the administrative Ccs as a comment"
+msgstr "以评论寄信给管理员副本收件人"
+
+#: etc/initialdata:100 etc/initialdata:104
+msgid "Sends mail to the owner"
+msgstr "寄信给申请人"
+
+#: NOT FOUND IN SOURCE
+msgid "Sep"
+msgstr "九月"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "09"
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr "九月"
+
+#: html/Edit/Users/Info:39
+msgid "Shift Type"
+msgstr "班别属性"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "显示结果"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show approved requests"
+msgstr "显示已批准的签核单"
+
+#: html/Ticket/Create.html:143 html/Ticket/Create.html:33
+msgid "Show basics"
+msgstr "显示基本信息"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show denied requests"
+msgstr "显示已驳回的签核单"
+
+#: html/Ticket/Create.html:143 html/Ticket/Create.html:33
+msgid "Show details"
+msgstr "显示细节"
+
+#: html/Approvals/Elements/PendingMyApproval:42
+msgid "Show pending requests"
+msgstr "显示待处理的签核单"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show requests awaiting other approvals"
+msgstr "显示尚待他人批准的签核单"
+
+#: lib/RT/Queue_Overlay.pm:80
+msgid "Show ticket private commentary"
+msgstr "显示申请单内的私人评论"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Show ticket summaries"
+msgstr "显示申请单摘要"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "ShowACL"
+msgstr "显示权限清单"
+
+#: lib/RT/Queue_Overlay.pm:77
+msgid "ShowScrips"
+msgstr "显示手续"
+
+#: lib/RT/Queue_Overlay.pm:74
+msgid "ShowTemplate"
+msgstr "显示模板"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowTicket"
+msgstr "显示申请单"
+
+#: lib/RT/Queue_Overlay.pm:80
+msgid "ShowTicketComments"
+msgstr "显示申请单的评论"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "登记成为申请人或副本收件人"
+
+#: lib/RT/Queue_Overlay.pm:82
+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
+msgid "Signature"
+msgstr "签名档"
+
+#: NOT FOUND IN SOURCE
+msgid "Signed in as %1"
+msgstr "使用者:%1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:25
+msgid "Single"
+msgstr "单一"
+
+#: html/Elements/Header:50
+msgid "Skip Menu"
+msgstr "略过选单"
+
+#: html/Admin/Elements/AddCustomFieldValue:27
+msgid "Sort"
+msgstr "顺序"
+
+#: NOT FOUND IN SOURCE
+msgid "Sort key"
+msgstr "排序方式"
+
+#: html/Search/Elements/PickRestriction:108 html/Work/Search/PickRestriction:89
+msgid "Sort results by"
+msgstr "结果排序方式"
+
+#: NOT FOUND IN SOURCE
+msgid "SortOrder"
+msgstr "排序顺序"
+
+#: html/Work/Elements/List:8 html/Work/Elements/MyApprovals:11
+msgid "Stage"
+msgstr "关卡"
+
+#: html/Edit/Global/Workflow/Top:8
+msgid "Stage Action"
+msgstr "关卡运行动作"
+
+#: html/Edit/Global/Workflow/Top:5
+msgid "Stage Condition"
+msgstr "关卡运行条件"
+
+#: html/Work/Elements/Quicksearch:17
+msgid "Stalled"
+msgstr "延宕"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "首页"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:34
+msgid "Started"
+msgstr "实际起始日"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Starts"
+msgstr "应起始日"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "应起始日"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Status"
+msgstr "现况"
+
+#: etc/initialdata:317
+msgid "Status Change"
+msgstr "现况改变时"
+
+#: lib/RT/Transaction_Overlay.pm:528
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "现况从 %1 改为 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "现况改变时"
+
+#: html/Ticket/Elements/Tabs:146
+msgid "Steal"
+msgstr "强制更换承办人"
+
+#: lib/RT/Queue_Overlay.pm:91
+msgid "Steal tickets"
+msgstr "强制承办申请单"
+
+#: lib/RT/Queue_Overlay.pm:91
+msgid "StealTicket"
+msgstr "强制承办申请单"
+
+#: lib/RT/Transaction_Overlay.pm:587
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "被 %1 强制更换 "
+
+#: html/Edit/Groups/Member:69
+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
+msgid "Subject"
+msgstr "主题"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "标题已改为 %1"
+
+#: html/Elements/Submit:58 html/Work/Search/Bulk.html:103
+msgid "Submit"
+msgstr "送出"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "送出流程"
+
+#: lib/RT/Group_Overlay.pm:748
+msgid "Succeeded"
+msgstr "设定成功"
+
+#: NOT FOUND IN SOURCE
+msgid "Sun"
+msgstr "星期日"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "星期日"
+
+#: html/Edit/Users/System:17 lib/RT/System.pm:53
+msgid "SuperUser"
+msgstr "系统管理员"
+
+#: html/User/Elements/DelegateRights:76
+msgid "System"
+msgstr "系统"
+
+#: html/Edit/Global/Scrip/Top:18 html/Edit/Global/Scrip/Top:44
+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
+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 "系统错误。设定权限失败。"
+
+#: html/Edit/Users/index.html:122
+msgid "System Rights"
+msgstr "系统权限"
+
+#: lib/RT/ACE_Overlay.pm:615
+msgid "System error. Right not delegated."
+msgstr "系统错误。权限代理失败。"
+
+#: 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 "系统错误。设定权限失败。"
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "系统错误。无法设定权限。"
+
+#: html/Admin/Global/GroupRights.html:34 html/Admin/Groups/GroupRights.html:36 html/Admin/Queues/GroupRights.html:35
+msgid "System groups"
+msgstr "系统群组"
+
+#: NOT FOUND IN SOURCE
+msgid "SystemInternal"
+msgstr "系统内部用"
+
+#: etc/initialdata:59 etc/initialdata:65 etc/initialdata:71
+msgid "SystemRolegroup for internal use"
+msgstr "内部使用的系统角色群组"
+
+#: lib/RT/CurrentUser.pm:319
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: html/Ticket/Elements/Tabs:142
+msgid "Take"
+msgstr "受理"
+
+#: lib/RT/Queue_Overlay.pm:89
+msgid "Take tickets"
+msgstr "自行承办申请单"
+
+#: lib/RT/Queue_Overlay.pm:89
+msgid "TakeTicket"
+msgstr "自行承办申请单"
+
+#: lib/RT/Transaction_Overlay.pm:573
+msgid "Taken"
+msgstr "已受理"
+
+#: html/Admin/Elements/EditScrip:80
+msgid "Template"
+msgstr "模板"
+
+#: html/Admin/Global/Template.html:90 html/Admin/Queues/Template.html:89
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "模板 #%1"
+
+#: html/Edit/Global/Template/List:9 html/Edit/Global/Template/Top:17
+msgid "Template Content"
+msgstr "通知模板内容"
+
+#: html/Edit/Global/Template/List:8 html/Edit/Global/Template/Top:13
+msgid "Template Description"
+msgstr "通知模板描述"
+
+#: html/Edit/Global/Template/List:7 html/Edit/Global/Template/Top:9
+msgid "Template Name"
+msgstr "通知模板名称"
+
+#: html/Admin/Elements/EditTemplates:88
+msgid "Template deleted"
+msgstr "模板已删除"
+
+#: lib/RT/Scrip_Overlay.pm:152
+msgid "Template not found"
+msgstr "找不到模板"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "找不到模板\\n"
+
+#: lib/RT/Template_Overlay.pm:352
+msgid "Template parsed"
+msgstr "模板剖析完毕"
+
+#: html/Admin/Elements/QueueTabs:48 html/Admin/Elements/SystemTabs:35 html/Admin/Global/index.html:44
+msgid "Templates"
+msgstr "模板"
+
+#: html/Edit/Global/autohandler:8 html/Edit/Queues/autohandler:19
+msgid "Templates "
+msgstr "通知模板"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "找不到 %1 的模板\\n"
+
+#: lib/RT/Interface/Web.pm:894
+msgid "That is already the current value"
+msgstr "已经是目前字段的值"
+
+#: lib/RT/CustomField_Overlay.pm:242
+msgid "That is not a value for this custom field"
+msgstr "这不是该自订字段的值"
+
+#: lib/RT/Ticket_Overlay.pm:1908
+msgid "That is the same value"
+msgstr "同样的值"
+
+#: lib/RT/ACE_Overlay.pm:287 lib/RT/ACE_Overlay.pm:596
+msgid "That principal already has that right"
+msgstr "这项单位已经拥有该权限"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "这项单位已经是这个表单的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1442
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "这项单位已经是这份申请单的 %1"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "这项单位不是这个表单的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1559
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "这项单位不是这份申请单的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1904
+msgid "That queue does not exist"
+msgstr "此表单不存在"
+
+#: lib/RT/Ticket_Overlay.pm:3246
+msgid "That ticket has unresolved dependencies"
+msgstr "这份申请单有尚未解决的附属申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "That user already has that right"
+msgstr "使用者已具有该项权限"
+
+#: lib/RT/Ticket_Overlay.pm:3056
+msgid "That user already owns that ticket"
+msgstr "该使用者已经承办这份申请单"
+
+#: lib/RT/Ticket_Overlay.pm:3028
+msgid "That user does not exist"
+msgstr "使用者不存在"
+
+#: lib/RT/User_Overlay.pm:374
+msgid "That user is already privileged"
+msgstr "这名使用者已经是内部成员"
+
+#: lib/RT/User_Overlay.pm:395
+msgid "That user is already unprivileged"
+msgstr "这名使用者属于非内部成员群组"
+
+#: lib/RT/User_Overlay.pm:387
+msgid "That user is now privileged"
+msgstr "使用者加入内部成员群组完毕"
+
+#: lib/RT/User_Overlay.pm:408
+msgid "That user is now unprivileged"
+msgstr "这名使用者已加入非内部成员群组"
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr "这名使用者已加入非内部成员群组"
+
+#: lib/RT/Ticket_Overlay.pm:3049
+msgid "That user may not own tickets in that queue"
+msgstr "使用者可能没有承办表单里的申请单"
+
+#: lib/RT/Link_Overlay.pm:205
+msgid "That's not a numerical id"
+msgstr "这不是一个数字编号"
+
+#: html/SelfService/Display.html:31 html/Ticket/Create.html:149 html/Ticket/Elements/ShowSummary:27
+msgid "The Basics"
+msgstr "基本信息"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The CC of a ticket"
+msgstr "申请单的副本收件人"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The administrative CC of a ticket"
+msgstr "申请单的管理员副本收件人"
+
+#: lib/RT/Ticket_Overlay.pm:2235
+msgid "The comment has been recorded"
+msgstr "评论已被纪录"
+
+#: 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 "下列命令会找到 'general' 表单内所有运作中的申请单,并将其中 4 小时内未处理的申请单优先程度设为 99:"
+
+#: bin/rt-commit-handler:755 bin/rt-commit-handler:765
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "以下命令未被执行:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:897
+msgid "The new value has been set."
+msgstr "新的字段值设定完成。"
+
+#: lib/RT/ACE_Overlay.pm:85
+msgid "The owner of a ticket"
+msgstr "申请单的承办人"
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The requestor of a ticket"
+msgstr "申请单的申请人"
+
+#: html/Admin/Elements/EditUserComments:25
+msgid "These comments aren't generally visible to the user"
+msgstr "该使用者不会看见这些评论"
+
+#: html/Edit/Global/Workflow/Owner.html:32
+msgid "Third-"
+msgstr "三"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "申请单 %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:188
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "此工具程序会让使用者经由 RT 执行任意命令。"
+
+#: lib/RT/Transaction_Overlay.pm:251
+msgid "This transaction appears to have no content"
+msgstr "此项更动报告没有内容"
+
+#: html/Ticket/Elements/ShowRequestor:46
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "使用者送出的前 %1 份优先处理申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "使用者送出的前 25 份优先处理申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Thu"
+msgstr "星期四"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "星期四"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:163
+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 "更新申请单 # %1 的全部信息:%2"
+
+#: html/Ticket/ModifyAll.html:24 html/Ticket/ModifyAll.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "更新申请单 #%1 的全部信息:%2"
+
+#: html/Approvals/Elements/ShowDependency:45
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "申请单 #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:595 lib/RT/Ticket_Overlay.pm:616
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "申请单 #%1 成功新增于 '%2' 表单"
+
+#: bin/rt-commit-handler:759
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "加载申请单 %1\\n"
+
+#: html/Search/Bulk.html:212 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
+msgid "Ticket Due"
+msgstr "表单处理期限"
+
+#: html/Ticket/History.html:24 html/Ticket/History.html:27
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "申请单处理纪录 # %1 %2"
+
+#: html/Work/Elements/List:6
+msgid "Ticket ID"
+msgstr "单号"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Id"
+msgstr "申请单编号"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Processing Due"
+msgstr "表单运行期限"
+
+#: etc/initialdata:332
+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
+msgid "Ticket Type"
+msgstr "表单种类"
+
+#: html/Search/Elements/PickRestriction:62 html/Work/Search/PickRestriction:43
+msgid "Ticket attachment"
+msgstr "申请单附件"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "申请单内容"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+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
+msgid "Ticket could not be created due to an internal error"
+msgstr "内部错误,无法新增申请单"
+
+#: lib/RT/Transaction_Overlay.pm:520
+msgid "Ticket created"
+msgstr "申请单新增完毕"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "申请单新增失败"
+
+#: lib/RT/Transaction_Overlay.pm:525
+msgid "Ticket deleted"
+msgstr "申请单删除完毕"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket id not found"
+msgstr "找不到申请单编号"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket killed"
+msgstr "申请单删除完毕"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket not found"
+msgstr "找不到申请单"
+
+#: etc/initialdata:318
+msgid "Ticket status changed"
+msgstr "申请单现况已改变"
+
+#: html/Ticket/Update.html:38
+msgid "Ticket watchers"
+msgstr "申请单视察员"
+
+#: html/Elements/Tabs:46
+msgid "Tickets"
+msgstr "申请单"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "申请单 %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'}))
+msgid "Tickets %1 by %2"
+msgstr "申请单 %1 (%2)"
+
+#: html/Elements/ViewUser:25
+#. ($name)
+msgid "Tickets from %1"
+msgstr "%1 的申请单"
+
+#: html/Approvals/Elements/ShowDependency:26
+msgid "Tickets which depend on this approval:"
+msgstr "批准之后,可接续处理:"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47
+msgid "Time Left"
+msgstr "剩馀时间"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42
+msgid "Time Worked"
+msgstr "处理时间"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "剩馀时间"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "显示时间"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "已处理时间"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "剩馀时间"
+
+#: lib/RT/Ticket_Overlay.pm:1173
+msgid "TimeWorked"
+msgstr "已处理时间"
+
+#: bin/rt-commit-handler:401
+msgid "To generate a diff of this commit:"
+msgstr "产生这次更动的差异档:"
+
+#: bin/rt-commit-handler:390
+msgid "To generate a diff of this commit:\\n"
+msgstr "产生这次更动的差异档:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1176
+msgid "Told"
+msgstr "告知日期"
+
+#: html/Edit/Elements/Page:46
+msgid "Total"
+msgstr "页"
+
+#: etc/initialdata:239
+msgid "Transaction"
+msgstr "更动"
+
+#: lib/RT/Transaction_Overlay.pm:640
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "清除更动报告 %1"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "更动报告已新增"
+
+#: lib/RT/Transaction_Overlay.pm:88
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "未指定申请单编号,无法新增更动"
+
+#: lib/RT/Transaction_Overlay.pm:699
+msgid "Transactions are immutable"
+msgstr "不可更改更动报告"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "试图删除某项权限:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Tue"
+msgstr "星期二"
+
+#: lib/RT/Date.pm:389
+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
+msgid "Type"
+msgstr "类别"
+
+#: lib/RT/ScripCondition_Overlay.pm:103
+msgid "Unimplemented"
+msgstr "尚无实作"
+
+#: html/Admin/Users/Modify.html:67
+msgid "Unix login"
+msgstr "外部系统登入帐号"
+
+#: html/Admin/Elements/ModifyUser:61
+msgid "UnixUsername"
+msgstr "外部系统登入帐号"
+
+#: lib/RT/Attachment_Overlay.pm:273 lib/RT/Attachment_Overlay.pm:303
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "不可解的内容文字编码方式 %1"
+
+#: html/Elements/SelectResultsPerPage:36
+msgid "Unlimited"
+msgstr "全数显示"
+
+#: etc/initialdata:50
+msgid "Unprivileged"
+msgstr "非内部成员"
+
+#: lib/RT/Transaction_Overlay.pm:569
+msgid "Untaken"
+msgstr "未被受理"
+
+#: html/Edit/Elements/Page:13 html/Edit/Elements/Page:15
+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
+msgid "Update"
+msgstr "处理"
+
+#: html/Admin/Users/Prefs.html:61
+msgid "Update ID"
+msgstr "更新编号"
+
+#: html/Search/Bulk.html:129 html/Ticket/ModifyAll.html:65 html/Ticket/Update.html:65 html/Work/Search/Bulk.html:81 html/Work/Tickets/Update.html:32
+msgid "Update Type"
+msgstr "更新类别"
+
+#: html/Search/Listing.html:60 html/Work/Search/index.html:32
+msgid "Update all these tickets at once"
+msgstr "整批更新申请单"
+
+#: html/Admin/Users/Prefs.html:48
+msgid "Update email"
+msgstr "更新电子邮件信箱"
+
+#: html/Admin/Users/Prefs.html:54
+msgid "Update name"
+msgstr "更新帐号"
+
+#: lib/RT/Interface/Web.pm:409
+msgid "Update not recorded."
+msgstr "更新未被记录"
+
+#: html/Search/Bulk.html:80 html/Work/Search/Bulk.html:52
+msgid "Update selected tickets"
+msgstr "更新选择的申请单"
+
+#: html/Admin/Users/Prefs.html:35
+msgid "Update signature"
+msgstr "更新签章"
+
+#: html/Ticket/ModifyAll.html:62
+msgid "Update ticket"
+msgstr "更新申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "Update ticket # %1"
+msgstr "更新申请单 # %1"
+
+#: html/SelfService/Update.html:24 html/SelfService/Update.html:46
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "更新申请单 #%1"
+
+#: html/Ticket/Update.html:138 html/Work/Tickets/Update.html:122
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "更新申请单 #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:407
+msgid "Update type was neither correspondence nor comment."
+msgstr "更新的内容并非申请单回复也不是评论"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:50 lib/RT/Ticket_Overlay.pm:1177
+msgid "Updated"
+msgstr "前次更新"
+
+#: html/Work/Preferences/index.html:15
+msgid "User"
+msgstr "使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "使用者 %1 %2:%3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "使用者 %1 口令:%2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "找不到使用者 '%1'"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "找不到使用者 '%1'\\n"
+
+#: etc/initialdata:142 etc/initialdata:209
+msgid "User Defined"
+msgstr "使用者自订"
+
+#: html/Admin/Users/Prefs.html:58 html/Edit/Users/List:13 html/Edit/Users/Top:42
+msgid "User ID"
+msgstr "使用者 ID"
+
+#: 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
+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
+msgid "User Rights"
+msgstr "使用者权限"
+
+#: html/Edit/Elements/Tab:32
+msgid "User Setup"
+msgstr "使用者设定"
+
+#: html/Edit/Users/Info:38
+msgid "User Shift"
+msgstr "员工班别"
+
+#: html/Admin/Users/Modify.html:225
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "无法新增使用者:%1"
+
+#: lib/RT/User_Overlay.pm:321
+msgid "User created"
+msgstr "使用者新增完毕"
+
+#: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68
+msgid "User defined groups"
+msgstr "使用者定义的群组"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "已通知使用者"
+
+#: html/Admin/Users/Prefs.html:24 html/Admin/Users/Prefs.html:28
+msgid "User view"
+msgstr "使用者私人数据"
+
+#: NOT FOUND IN SOURCE
+msgid "UserDefined"
+msgstr "使用者自定"
+
+#: html/Admin/Users/Modify.html:47 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:34
+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
+msgid "Users"
+msgstr "使用者"
+
+#: html/Admin/Users/index.html:64
+msgid "Users matching search criteria"
+msgstr "符合查询条件的使用者"
+
+#: html/Search/Elements/PickRestriction:50 html/Work/Search/PickRestriction:31
+msgid "ValueOfQueue"
+msgstr "选择表单"
+
+#: html/Admin/Elements/EditCustomField:56
+msgid "Values"
+msgstr "字段值"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Watch"
+msgstr "视察"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "WatchAsAdminCc"
+msgstr "以管理员副本收件人身份视察"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "成功加载视察员信息"
+
+#: html/Admin/Elements/QueueTabs:41
+msgid "Watchers"
+msgstr "视察员"
+
+#: html/Admin/Elements/ModifyUser:55
+msgid "WebEncoding"
+msgstr "网页文字编码方式"
+
+#: NOT FOUND IN SOURCE
+msgid "Wed"
+msgstr "星期三"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "星期三"
+
+#: etc/initialdata:533 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
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "当申请单通过某项签核后,将此讯息回复到原申请单"
+
+#: etc/initialdata:156
+msgid "When a ticket is created"
+msgstr "新增申请单时"
+
+#: etc/initialdata:428 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
+msgid "When anything happens"
+msgstr "当任何事情发生时"
+
+#: etc/initialdata:202
+msgid "Whenever a ticket is resolved"
+msgstr "当申请单解决时"
+
+#: etc/initialdata:188
+msgid "Whenever a ticket's owner changes"
+msgstr "当申请单更换承办人时"
+
+#: etc/initialdata:196
+msgid "Whenever a ticket's queue changes"
+msgstr "当申请单更换表单时"
+
+#: etc/initialdata:180
+msgid "Whenever a ticket's status changes"
+msgstr "当申请单更新现况时"
+
+#: etc/initialdata:210
+msgid "Whenever a user-defined condition occurs"
+msgstr "当使用者自订的情况发生时"
+
+#: etc/initialdata:174
+msgid "Whenever comments come in"
+msgstr "当评论送达时"
+
+#: etc/initialdata:167
+msgid "Whenever correspondence comes in"
+msgstr "当回复送达时"
+
+#: html/Admin/Users/Modify.html:163 html/User/Prefs.html:51 html/Work/Preferences/Info:31
+msgid "Work"
+msgstr "公司"
+
+#: html/Admin/Elements/ModifyUser:69
+msgid "WorkPhone"
+msgstr "公司电话"
+
+#: html/Ticket/Elements/ShowBasics:34 html/Ticket/Update.html:64
+msgid "Worked"
+msgstr "处理时间"
+
+#: html/Admin/Global/Workflow.html:91 html/Admin/Queues/Workflow.html:89
+#. ($WorkflowObj->Id())
+msgid "Workflow #%1"
+msgstr "流程 #%1"
+
+#: html/Edit/Global/Workflow/List:15
+msgid "Workflow Begin"
+msgstr "流程开始"
+
+#: html/Edit/Global/Workflow/List:20
+msgid "Workflow End"
+msgstr "流程结束"
+
+#: html/Admin/Elements/EditWorkflows:90
+msgid "Workflow deleted"
+msgstr "流程已删除"
+
+#: html/Edit/Global/autohandler:10 html/Edit/Queues/autohandler:21
+msgid "Workflows"
+msgstr "流程"
+
+#: html/Edit/Global/Basic/Top:25
+msgid "Yes"
+msgstr "是"
+
+#: lib/RT/Ticket_Overlay.pm:3159
+msgid "You already own this ticket"
+msgstr "您已是这份申请单的承办人"
+
+#: html/autohandler:122
+msgid "You are not an authorized user"
+msgstr "您不是被授权的使用者"
+
+#: lib/RT/Ticket_Overlay.pm:3041
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "祇能重新指派您所承办或是没有承办人的申请单"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "您没有看那份申请单的权限。\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "您会在表单 %2 找到 %1 的申请单"
+
+#: html/NoAuth/Logout.html:30
+msgid "You have been logged out of RT."
+msgstr "您已注销 RT。"
+
+#: html/SelfService/Display.html:77
+msgid "You have no permission to create tickets in that queue."
+msgstr "您没有在该表单新增申请单的权限。"
+
+#: lib/RT/Ticket_Overlay.pm:1917
+msgid "You may not create requests in that queue."
+msgstr "您不能在该表单中提出申请。"
+
+#: html/Edit/Global/Basic/Top:38
+msgid "You need to restart the Request Tracker service for saved changes to take effect."
+msgstr "您必须重新激活 Request Tracker 服务,储存的更动才会生效。"
+
+#: html/NoAuth/Logout.html:34
+msgid "You're welcome to login again"
+msgstr "欢迎下次再来"
+
+#: NOT FOUND IN SOURCE
+msgid "Your %1 requests"
+msgstr "您提出的 %1 申请单"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Your request has been approved."
+msgstr "您的申请单已完成签核程序。"
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "您的申请单已被驳回"
+
+#: etc/initialdata:455
+msgid "Your request was rejected by %1."
+msgstr "您的申请单已被 %1 驳回。"
+
+#: etc/upgrade/2.1.71:101 html/Edit/Elements/CreateApprovalsQueue:73
+msgid "Your request was rejected."
+msgstr "您的申请单已被驳回。"
+
+#: html/autohandler:144
+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
+msgid "Zip"
+msgstr "邮政编码"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr "[没有标题]"
+
+#: NOT FOUND IN SOURCE
+msgid "ago"
+msgstr "过期"
+
+#: NOT FOUND IN SOURCE
+msgid "alert"
+msgstr "急讯"
+
+#: html/User/Elements/DelegateRights:58
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "权限同 %1"
+
+#: html/SelfService/Closed.html:27
+msgid "closed"
+msgstr "已解决"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:33
+msgid "contains"
+msgstr "包含"
+
+#: html/Elements/SelectAttachmentField:25
+msgid "content"
+msgstr "内容"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content-type"
+msgstr "类型"
+
+#: lib/RT/Ticket_Overlay.pm:2304
+msgid "correspondence (probably) not sent"
+msgstr "申请单回复(可能)未送出"
+
+#: lib/RT/Ticket_Overlay.pm:2314
+msgid "correspondence sent"
+msgstr "申请单回复已送出"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "days"
+msgstr "天"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "拒绝处理"
+
+#: NOT FOUND IN SOURCE
+msgid "debug"
+msgstr "侦错"
+
+#: html/Search/Listing.html:74
+msgid "delete"
+msgstr "删除"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "deleted"
+msgstr "已删除"
+
+#: html/Search/Elements/PickRestriction:67 html/Work/Search/PickRestriction:47
+msgid "does not match"
+msgstr "不符合"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:34
+msgid "doesn't contain"
+msgstr "不包含"
+
+#: NOT FOUND IN SOURCE
+msgid "emergency"
+msgstr "危难"
+
+#: html/Elements/SelectEqualityOperator:37
+msgid "equal to"
+msgstr "等于"
+
+#: NOT FOUND IN SOURCE
+msgid "error"
+msgstr "错误"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr "假"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "filename"
+msgstr "档名"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37
+msgid "greater than"
+msgstr "大于"
+
+#: lib/RT/Group_Overlay.pm:193
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "群组 '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "小时"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "编号"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "isn't"
+msgstr "不是"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37
+msgid "less than"
+msgstr "小于"
+
+#: html/Edit/Global/Workflow/Owner.html:35
+msgid "level Admins"
+msgstr "层主管"
+
+#: html/Search/Elements/PickRestriction:66 html/Work/Search/PickRestriction:46
+msgid "matches"
+msgstr "符合"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "分"
+
+#: html/Ticket/Update.html:64
+msgid "minutes"
+msgstr "分钟"
+
+#: bin/rt-commit-handler:764
+msgid "modifications\\n\\n"
+msgstr "更改\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "月"
+
+#: lib/RT/Queue_Overlay.pm:57
+msgid "new"
+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
+msgid "none"
+msgstr "无"
+
+#: html/Elements/SelectEqualityOperator:37
+msgid "not equal to"
+msgstr "不等于"
+
+#: NOT FOUND IN SOURCE
+msgid "notice"
+msgstr "提示"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr "不符合"
+
+#: html/Edit/Elements/PickUsers:17 html/Edit/Users/Add.html:18 html/Edit/Users/Search.html:28 html/Work/Tickets/Cc:15
+msgid "number"
+msgstr "号"
+
+#: html/SelfService/Elements/MyRequests:60 lib/RT/Queue_Overlay.pm:58
+msgid "open"
+msgstr "开启"
+
+#: NOT FOUND IN SOURCE
+msgid "opened"
+msgstr "已开启"
+
+#: lib/RT/Group_Overlay.pm:198
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "使用者「%2」的「%1」代理人群组"
+
+#: lib/RT/Group_Overlay.pm:206
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "表单 %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "rejected"
+msgstr "已驳回"
+
+#: html/Work/Elements/SelectSearch:21 lib/RT/Queue_Overlay.pm:60
+msgid "resolved"
+msgstr "已处理"
+
+#: html/Edit/Global/Basic/Top:48
+msgid "rtname"
+msgstr "服务器名称"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "秒"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "stalled"
+msgstr "延宕"
+
+#: lib/RT/Group_Overlay.pm:201
+#. ($self->Type)
+msgid "system %1"
+msgstr "系统 %1"
+
+#: lib/RT/Group_Overlay.pm:212
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "系统群组 '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:41
+msgid "the calling component did not specify why"
+msgstr "呼叫组件未指明原因"
+
+#: lib/RT/Group_Overlay.pm:209
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "申请单 #%1 %2"
+
+#: html/Work/Elements/SelectSearch:27
+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
+msgid "to"
+msgstr "到"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr "真"
+
+#: lib/RT/Group_Overlay.pm:215
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "没有描述的群组 %1"
+
+#: html/Work/Elements/SelectSearch:19
+msgid "unresolved"
+msgstr "未处理"
+
+#: lib/RT/Group_Overlay.pm:190
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "使用者 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "warning"
+msgstr "警告"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "周"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "模板:%1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "年"
+
diff --git a/rt/lib/RT/I18N/zh_tw.po b/rt/lib/RT/I18N/zh_tw.po
new file mode 100644 (file)
index 0000000..8c8c86e
--- /dev/null
@@ -0,0 +1,6416 @@
+# Traditional Chinese localization catalog for Request Tracker (RT)
+msgid ""
+msgstr ""
+"Last-Translator: Autrijus Tang <autrijus@autrijus.org>\n"
+"Language-Team: Chinese <members@ourinet.com>\n"
+"MIME-Version: 1.0\n"
+"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:15 html/Work/Elements/MyTickets:15
+msgid "#"
+msgstr "#"
+
+#: NOT FOUND IN SOURCE
+msgid "#%1"
+msgstr "#%1"
+
+#: 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
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($Ticket->id, $Ticket->Subject)
+#. ($ticket->Id, $ticket->Subject)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "#%1: %2"
+msgstr "#%1: %2"
+
+#: NOT FOUND IN SOURCE
+msgid "%*(%1,group ticket)"
+msgstr "%*(%1) 件參與的申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "%*(%1,ticket) due"
+msgstr "%*(%1) 件限期完成的申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "%*(%1,unresolved ticket)"
+msgstr "%*(%1) 件尚未解決的申請單"
+
+#: lib/RT/Date.pm:337
+#. ($s, $time_unit)
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:771
+#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'})
+msgid "%1 %2 %3"
+msgstr "%1 %2 %3"
+
+#: lib/RT/Date.pm:373
+#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900))
+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
+#. ($cf->Name, $new_value->Content)
+#. ($field, $self->NewValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 added"
+msgstr "%2 已新增為 %1"
+
+#: lib/RT/Date.pm:334
+#. ($s, $time_unit)
+msgid "%1 %2 ago"
+msgstr "%1 %2 之前"
+
+#: lib/RT/Ticket_Overlay.pm:3538 lib/RT/Transaction_Overlay.pm:564
+#. ($cf->Name, $old_value, $new_value->Content)
+#. ($field, $self->OldValue, $self->NewValue)
+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
+#. ($cf->Name, $old_value)
+#. ($field, $self->OldValue)
+#. ($self->Field, $principal->Object->Name)
+msgid "%1 %2 deleted"
+msgstr "%2 已自 %1 刪除"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:157
+#. ($depth_str, $role_str, $group_str)
+msgid "%1 %2 of group %3"
+msgstr "%3 群組的 %1 %2"
+
+#: html/Admin/Elements/EditScrips:43 html/Admin/Elements/ListGlobalScrips:27
+#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name))
+msgid "%1 %2 with template %3"
+msgstr "條件:%1 | 動作:%2 | 範本:%3"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 (%2) %3 this ticket\\n"
+msgstr "%1 (%2) %3 這份申請單\\n"
+
+#: html/Search/Listing.html:56 html/Work/Search/index.html:28
+#. (($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage()  ))
+msgid "%1 - %2 shown"
+msgstr "顯示第 %1 - %2 筆"
+
+#: bin/rt-crontool:168 bin/rt-crontool:175 bin/rt-crontool:181
+#. ("--search-argument", "--search")
+#. ("--condition-argument", "--condition")
+#. ("--action-argument", "--action")
+msgid "%1 - An argument to pass to %2"
+msgstr "%1 - 傳遞給 %2 的一個參數"
+
+#: bin/rt-crontool:184
+#. ("--verbose")
+msgid "%1 - Output status updates to STDOUT"
+msgstr "%1 - 將更新狀態輸出到 STDOUT"
+
+#: bin/rt-crontool:178
+#. ("--action")
+msgid "%1 - Specify the action module you want to use"
+msgstr "%1 - 指定欲使用的動作模組"
+
+#: bin/rt-crontool:172
+#. ("--condition")
+msgid "%1 - Specify the condition module you want to use"
+msgstr "%1 - 指定欲使用的條件模組"
+
+#: bin/rt-crontool:165
+#. ("--search")
+msgid "%1 - Specify the search module you want to use"
+msgstr "%1 - 指定欲使用的查詢模組"
+
+#: lib/RT/ScripAction_Overlay.pm:121
+#. ($self->Id)
+msgid "%1 ScripAction loaded"
+msgstr "載入手續 %1"
+
+#: html/Edit/Elements/Page:48
+#. (scalar $count)
+msgid "%1 Total"
+msgstr "共 %1 筆"
+
+#: lib/RT/Ticket_Overlay.pm:3565
+#. ($args{'Value'}, $cf->Name)
+msgid "%1 added as a value for %2"
+msgstr "新增 %1 作為 %2 的值"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on"
+msgstr "別名 %1 需要可用的申請單編號"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on "
+msgstr "別名 %1 需要可用的申請單編號 "
+
+#: NOT FOUND IN SOURCE
+msgid "%1 aliases require a TicketId to work on (from %2) %3"
+msgstr "別名 %1 需要可用的申請單編號以處理 %3(出自 %2)"
+
+#: lib/RT/Link_Overlay.pm:116 lib/RT/Link_Overlay.pm:123
+#. ($args{'Base'})
+#. ($args{'Target'})
+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
+#. ($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
+#. ($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)
+msgid "%1 changed from %2 to %3"
+msgstr "%1 的值從 %2 改為 %3"
+
+#: lib/RT/Interface/Web.pm:893 x:896
+msgid "%1 could not be set to %2."
+msgstr "無法將 %1 設定為 %2。"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 couldn't init a transaction (%2)\\n"
+msgstr "%1 無法初始更新 (%2)\\n"
+
+#: lib/RT/Ticket_Overlay.pm:2830
+#. ($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:9
+#. ($rows)
+msgid "%1 highest priority tickets I own..."
+msgstr "前 %1 份待處理申請單..."
+
+#: html/Elements/MyRequests:24 html/Work/Elements/MyRequests:9
+#. ($rows)
+msgid "%1 highest priority tickets I requested..."
+msgstr "前 %1 份送出的申請單..."
+
+#: html/Work/Elements/MyApprovals:5
+#. ($rows)
+msgid "%1 highest priority tickets pending my approval..."
+msgstr "前 %1 份待簽核申請單..."
+
+#: bin/rt-crontool:160
+#. ($0)
+msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron."
+msgstr "%1 是從外部排程程式(如 cron)來對申請單進行操作的工具。"
+
+#: lib/RT/Queue_Overlay.pm:743
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this queue."
+msgstr "%1 已不再是此表單的 %2。"
+
+#: lib/RT/Ticket_Overlay.pm:1569
+#. ($principal->Object->Name, $args{'Type'})
+msgid "%1 is no longer a %2 for this ticket."
+msgstr "%1 已不再是此申請單的 %2。"
+
+#: lib/RT/Ticket_Overlay.pm:3621
+#. ($args{'Value'}, $cf->Name)
+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 "%1 不是一個合法的表單編號。"
+
+#: html/Ticket/Elements/ShowBasics:35
+#. ($TimeWorked)
+msgid "%1 min"
+msgstr "%1 分鐘"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 not shown"
+msgstr "沒有顯示 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 result(s) found"
+msgstr "找到 %1 項結果"
+
+#: html/User/Elements/DelegateRights:75
+#. (loc($ObjectType =~ /^RT::(.*)$/))
+msgid "%1 rights"
+msgstr "%1權限"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 succeeded\\n"
+msgstr "%1 完成\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for $MessageId"
+msgstr "不知道 $MessageID 的 %1 類別"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 type unknown for %2"
+msgstr "不知道 %2 的 %1 類別"
+
+#: NOT FOUND IN SOURCE
+msgid "%1 was created without a CurrentUser\\n"
+msgstr "%1 新增時未指定現行使用者"
+
+#: lib/RT/Action/ResolveMembers.pm:41
+#. (ref $self)
+msgid "%1 will resolve all members of a resolved group ticket."
+msgstr "%1 會解決在已解決群組裡成員的申請單。"
+
+#: lib/RT/Action/StallDependent.pm:40
+#. (ref $self)
+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
+#. ($self)
+msgid "%1: no attachment specified"
+msgstr "%1:未指定附件"
+
+#: html/Ticket/Elements/ShowTransaction:89 html/Work/Tickets/Elements/ShowTransaction:154
+#. ($size)
+msgid "%1b"
+msgstr "%1 位元組"
+
+#: html/Ticket/Elements/ShowTransaction:86 html/Work/Tickets/Elements/ShowTransaction:151
+#. (int($size/102.4)/10)
+msgid "%1k"
+msgstr "%1k 位元組"
+
+#: NOT FOUND IN SOURCE
+msgid "%quant(%1,result) found"
+msgstr "找到 %1 項結果"
+
+#: lib/RT/Ticket_Overlay.pm:1158
+#. ($args{'Status'})
+msgid "'%1' is an invalid value for status"
+msgstr "'%1' 不是一個合法的狀態值"
+
+#: NOT FOUND IN SOURCE
+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/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
+msgid "(Check box to delete)"
+msgstr "(點選欲刪除的項目)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Check boxes to delete)"
+msgstr "(點選欲刪除的項目)"
+
+#: html/Ticket/Create.html:177
+msgid "(Enter ticket ids or URLs, seperated with spaces)"
+msgstr "(鍵入申請單編號或網址,以空白分隔)"
+
+#: html/Admin/Queues/Modify.html:53 html/Admin/Queues/Modify.html:59
+#. ($RT::CorrespondAddress)
+#. ($RT::CommentAddress)
+msgid "(If left blank, will default to %1"
+msgstr "(如果留白, 則預設為 %1)"
+
+#: NOT FOUND IN SOURCE
+msgid "(No Value)"
+msgstr "(沒有值)"
+
+#: html/Admin/Elements/EditCustomFields:32 html/Admin/Elements/ListGlobalCustomFields:31
+msgid "(No custom fields)"
+msgstr "(沒有自訂欄位)"
+
+#: html/Admin/Groups/Members.html:49 html/User/Groups/Members.html:52
+msgid "(No members)"
+msgstr "(沒有成員)"
+
+#: html/Admin/Elements/EditScrips:31 html/Admin/Elements/ListGlobalScrips:31
+msgid "(No scrips)"
+msgstr "(沒有手續)"
+
+#: html/Admin/Elements/EditTemplates:30
+msgid "(No templates)"
+msgstr "沒有範本"
+
+#: html/Admin/Elements/EditWorkflows:31
+msgid "(No workflows)"
+msgstr "沒有流程"
+
+#: html/Ticket/Update.html:83 html/Work/Tickets/Update.html:52
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(送出本份更新的密件副本給名單上以逗號隔開的電子郵件位址。這<b>不會</b>更改後續的收件者名單。)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(送出本份更新的密件副本給名單上以逗號隔開的電子郵件位址。這<b>不會</b>更改後續的收件者名單。)"
+
+#: html/Ticket/Create.html:78
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(送出本份更新的副本給名單上以逗號隔開的管理員電子郵件位址。這<b>將會</b>更改後續的收件者名單。)"
+
+#: html/Ticket/Update.html:79
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)"
+msgstr "(送出本份更新的副本給名單上以逗號隔開的電子郵件位址。這<b>不會</b>更改後續的收件者名單。)"
+
+#: NOT FOUND IN SOURCE
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will recieve future updates.)"
+msgstr "(送出本份更新的副本給名單上以逗號隔開的電子郵件位址。這<b>不會</b>更改後續的收件者名單。)"
+
+#: html/Ticket/Create.html:68
+msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)"
+msgstr "(送出本份更新的副本給名單上以逗號隔開的電子郵件位址。這<b>將會</b>更改後續的收件者名單。)"
+
+#: html/Ticket/Elements/EditCustomFieldEntries:35 html/Work/Tickets/Elements/EditCustomFieldEntries:48 html/Work/Tickets/Elements/ShowCustomFieldEntries:13
+msgid "(delete)"
+msgstr "(刪除)"
+
+#: html/Admin/Groups/index.html:32 html/User/Groups/index.html:32
+msgid "(empty)"
+msgstr "(空白)"
+
+#: html/Edit/Global/CustomField/index.html:113 html/Edit/Global/Scrip/index.html:111 html/Edit/Global/Template/index.html:106
+msgid "(new)"
+msgstr "(新增)"
+
+#: html/Admin/Users/index.html:38
+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
+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
+msgid "(no value)"
+msgstr "(無)"
+
+#: html/Ticket/Elements/BulkLinks:27 html/Ticket/Elements/EditLinks:115 html/Work/Search/BulkLinks:3
+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
+msgid "(pending approval)"
+msgstr "(等待簽核)"
+
+#: html/Elements/MyRequests:53 html/Elements/MyTickets:56 html/Work/Elements/MyRequests:54 html/Work/Elements/MyTickets:68
+msgid "(pending other tickets)"
+msgstr "(等待其他申請單)"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:246
+msgid "(requestor's group)"
+msgstr "(申請人所屬)"
+
+#: html/Admin/Users/Modify.html:49
+msgid "(required)"
+msgstr "(必填)"
+
+#: html/Ticket/Elements/ShowTransaction:92 html/Work/Tickets/Elements/ShowTransaction:39
+msgid "(untitled)"
+msgstr "(未命名)"
+
+#: NOT FOUND IN SOURCE
+msgid ":"
+msgstr ":"
+
+#: html/Ticket/Elements/ShowBasics:31
+msgid "<% $Ticket->Status%>"
+msgstr "<% $Ticket->Status%>"
+
+#: html/Elements/SelectTicketTypes:26
+msgid "<% $_ %>"
+msgstr "<% $_ %>"
+
+#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 html/Work/Elements/104Header:43
+#. ($m->scomp('/Elements/SelectNewTicketQueue'))
+msgid "<input type=\"submit\" value=\"New ticket in\">&nbsp;%1"
+msgstr "<input type=\"submit\" value=\"提出申請單\">&nbsp;%1"
+
+#: etc/initialdata.zh:221 etc/initialdata:203
+msgid "A blank template"
+msgstr "空白範本"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Deleted"
+msgstr "ACE 已刪除"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE Loaded"
+msgstr "ACE 已載入"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be deleted"
+msgstr "無法刪除 ACE"
+
+#: NOT FOUND IN SOURCE
+msgid "ACE could not be found"
+msgstr "找不到 ACE"
+
+#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:180
+msgid "ACE not found"
+msgstr "找不到 ACE 設定"
+
+#: lib/RT/ACE_Overlay.pm:830
+msgid "ACEs can only be created and deleted."
+msgstr "祇能新增或刪除 ACE 設定。"
+
+#: NOT FOUND IN SOURCE
+msgid "ACLEquivalence"
+msgstr "ACLEquivalence"
+
+#: bin/rt-commit-handler:754
+msgid "Aborting to avoid unintended ticket modifications.\\n"
+msgstr "離開以免不小心更改到申請單。\\n"
+
+#: html/User/Elements/Tabs:31
+msgid "About me"
+msgstr "個人資訊"
+
+#: html/Edit/Users/System:12
+msgid "Access Right"
+msgstr "系統使用登錄權限"
+
+#: html/Admin/Users/Modify.html:79
+msgid "Access control"
+msgstr "存取權限"
+
+#: html/Admin/Elements/EditScrip:56 html/Work/Tickets/Elements/ShowTransaction:18
+msgid "Action"
+msgstr "動作"
+
+#: lib/RT/Scrip_Overlay.pm:146
+#. ($args{'ScripAction'})
+msgid "Action %1 not found"
+msgstr "動作 %1 找不到"
+
+#: bin/rt-crontool:122
+msgid "Action committed."
+msgstr "動作執行完畢"
+
+#: bin/rt-crontool:118
+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
+msgid "Activated Date"
+msgstr "申請啟動時間"
+
+#: html/Edit/Elements/104Buttons:71 html/Edit/Elements/ListButtons:7
+msgid "Add"
+msgstr "新增"
+
+#: html/Search/Bulk.html:95 html/Work/Search/Bulk.html:74
+msgid "Add AdminCc"
+msgstr "新增管理員副本收件人"
+
+#: html/Search/Bulk.html:91 html/Work/Search/Bulk.html:68
+msgid "Add Cc"
+msgstr "新增副本收件人"
+
+#: html/Ticket/Elements/EditCustomFieldEntries:71 html/Work/Tickets/Elements/ShowCustomFieldEntries:49
+msgid "Add Entry"
+msgstr "新增列"
+
+#: html/Ticket/Create.html:113 html/Ticket/Update.html:98 html/Work/Tickets/Elements/AddAttachments:18
+msgid "Add More Files"
+msgstr "新增更多附件"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:112 html/Admin/Elements/ModifyTemplateAsWorkflow:45
+msgid "Add Next State"
+msgstr "新增下一項關卡"
+
+#: html/Search/Bulk.html:87 html/Work/Search/Bulk.html:62
+msgid "Add Requestor"
+msgstr "新增申請人"
+
+#: html/Admin/Elements/AddCustomFieldValue:24
+msgid "Add Value"
+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:54
+msgid "Add a scrip which will apply to all queues"
+msgstr "新增一道用於所有表單的手續"
+
+#: html/Search/Bulk.html:127 html/Work/Search/Bulk.html:80
+msgid "Add comments or replies to selected tickets"
+msgstr "新增評論或回覆到指定的申請單"
+
+#: html/Admin/Groups/Members.html:41 html/User/Groups/Members.html:38
+msgid "Add members"
+msgstr "新增成員"
+
+#: html/Admin/Queues/People.html:65 html/Ticket/Elements/AddWatchers:27
+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"
+msgstr "單位已新增為此表單的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1453
+#. ($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
+msgid "Address1"
+msgstr "住址"
+
+#: html/Admin/Elements/ModifyUser:77 html/Admin/Users/Modify.html:126 html/User/Prefs.html:89 html/Work/Preferences/Info:79
+msgid "Address2"
+msgstr "住址(續)"
+
+#: NOT FOUND IN SOURCE
+msgid "Adjust Blinking Rate"
+msgstr "調整閃爍速度快慢"
+
+#: html/Edit/Groups/Admin:9
+msgid "Admin"
+msgstr "管理員"
+
+#: html/Ticket/Create.html:73
+msgid "Admin Cc"
+msgstr "管理員副本"
+
+#: etc/initialdata.zh:303 etc/initialdata:280
+msgid "Admin Comment"
+msgstr "管理員評論"
+
+#: etc/initialdata.zh:261 etc/initialdata:259
+msgid "Admin Correspondence"
+msgstr "管理員回覆"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin Rights"
+msgstr "管理員權限"
+
+#: html/Admin/Queues/index.html:24 html/Admin/Queues/index.html:27
+msgid "Admin queues"
+msgstr "表單管理"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin users"
+msgstr "使用者管理"
+
+#: html/Admin/Global/index.html:25 html/Admin/Global/index.html:27
+msgid "Admin/Global configuration"
+msgstr "管理/全域設定"
+
+#: NOT FOUND IN SOURCE
+msgid "Admin/Groups"
+msgstr "管理/群組"
+
+#: html/Admin/Queues/Modify.html:24 html/Admin/Queues/Modify.html:28
+msgid "Admin/Queue/Basics"
+msgstr "管理/表單/基本資訊"
+
+#: html/Edit/Global/Basic/Top:60
+msgid "AdminAddress"
+msgstr "管理員 Email"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "AdminCc"
+msgstr "管理員副本"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminComment"
+msgstr "管理員評論"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminCorrespondence"
+msgstr "管理員回覆"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "AdminCustomFields"
+msgstr "管理自訂欄位"
+
+#: html/Edit/Groups/Admin:12 lib/RT/Group_Overlay.pm:145
+msgid "AdminGroup"
+msgstr "管理群組"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupDescription"
+msgstr "管理群組描述"
+
+#: lib/RT/Group_Overlay.pm:147
+msgid "AdminGroupMembership"
+msgstr "管理群組成員"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupName"
+msgstr "管理群組名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupPermission"
+msgstr "管理群組權限"
+
+#: NOT FOUND IN SOURCE
+msgid "AdminGroupStatus"
+msgstr "管理群組狀態"
+
+#: lib/RT/System.pm:58
+msgid "AdminOwnPersonalGroups"
+msgstr "管理代理人群組"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "AdminQueue"
+msgstr "管理表單"
+
+#: lib/RT/System.pm:59
+msgid "AdminUsers"
+msgstr "管理使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "Administrative"
+msgstr "行政類"
+
+#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53
+msgid "Administrative Cc"
+msgstr "管理員副本"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:233
+msgid "Admins"
+msgstr "主管"
+
+#: NOT FOUND IN SOURCE
+msgid "Advanced Search"
+msgstr "進階查詢"
+
+#: html/Elements/SelectDateRelation:35
+msgid "After"
+msgstr "晚於"
+
+#: NOT FOUND IN SOURCE
+msgid "Age"
+msgstr "經歷時間"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:172 html/Edit/Global/Workflow/Action:39
+msgid "Alias"
+msgstr "執行其他流程"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:175
+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
+msgid "All"
+msgstr "全部"
+
+#: etc/initialdata.zh:372 etc/initialdata:348
+msgid "All Approvals Passed"
+msgstr "完成全部簽核"
+
+#: html/Edit/Global/Workflow/Condition:16
+msgid "All Condition"
+msgstr "所有條件"
+
+#: html/Admin/Elements/EditCustomFields:95
+msgid "All Custom Fields"
+msgstr "所有自訂欄位"
+
+#: html/Admin/Queues/index.html:52
+msgid "All Queues"
+msgstr "所有表單"
+
+#: NOT FOUND IN SOURCE
+msgid "All Users"
+msgstr "全體員工"
+
+#: NOT FOUND IN SOURCE
+msgid "Allowance Request"
+msgstr "福利補助申請"
+
+#: NOT FOUND IN SOURCE
+msgid "Always sends a message to the requestors independent of message sender"
+msgstr "無論寄件來源為何,一律寄信給申請人"
+
+#: NOT FOUND IN SOURCE
+msgid "Amount"
+msgstr "數額"
+
+#: html/Edit/Global/Workflow/Condition:13
+msgid "Any Condition"
+msgstr "任意條件"
+
+#: html/Edit/Global/Scrip/List:10 html/Edit/Global/Scrip/Top:74
+msgid "Apply Template"
+msgstr "引用範本"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:138 html/Elements/Tabs:55 html/Work/Approvals/Elements/Approve:6
+msgid "Approval"
+msgstr "簽核"
+
+#: html/Approvals/Display.html:45 html/Approvals/Elements/ShowDependency:41 html/Approvals/index.html:64
+#. ($Ticket->Id, $Ticket->Subject)
+#. ($ticket->id, $msg)
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Approval #%1: %2"
+msgstr "簽核單 #%1:%2"
+
+#: html/Approvals/index.html:53
+#. ($ticket->Id)
+msgid "Approval #%1: Notes not recorded due to a system error"
+msgstr "簽核單 #%1:系統錯誤,記錄失敗"
+
+#: html/Approvals/index.html:51
+#. ($ticket->Id)
+msgid "Approval #%1: Notes recorded"
+msgstr "簽核單 #%1:記錄完畢"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:123
+msgid "Approval Details"
+msgstr "簽核細節"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Due"
+msgstr "簽核時限"
+
+#: html/Work/Approvals/Elements/Approve:37
+msgid "Approval Notes"
+msgstr "簽核意見"
+
+#: etc/initialdata.zh:357 etc/initialdata:336
+msgid "Approval Passed"
+msgstr "完成某項簽核"
+
+#: etc/initialdata.zh:383 etc/initialdata:359
+msgid "Approval Rejected"
+msgstr "駁回某項簽核"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Result"
+msgstr "簽核結果"
+
+#: html/Work/Approvals/Elements/Approve:25
+msgid "Approval Status"
+msgstr "核准結果"
+
+#: NOT FOUND IN SOURCE
+msgid "Approval Type"
+msgstr "簽核種類"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:25
+msgid "Approval diagram"
+msgstr "簽核流程"
+
+#: html/Approvals/Elements/Approve:43 html/Work/Approvals/Elements/Approve:29
+msgid "Approve"
+msgstr "核准"
+
+#: html/Work/Approvals/Elements/Approve:21 html/Work/Elements/List:9
+msgid "Approver"
+msgstr "簽核人"
+
+#: html/Edit/Global/Workflow/Action:29 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
+msgid "Approver's notes: %1"
+msgstr "簽核備註:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Apr"
+msgstr "四月"
+
+#: lib/RT/Date.pm:414
+msgid "Apr."
+msgstr "04"
+
+#: NOT FOUND IN SOURCE
+msgid "April"
+msgstr "四月"
+
+#: html/Edit/Elements/104Buttons:24
+msgid "Are you sure to delete checked items?"
+msgstr "您確定要刪除?"
+
+#: html/Elements/SelectSortOrder:34
+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
+msgid "Attach"
+msgstr "附件"
+
+#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 html/Work/Tickets/Elements/AddAttachments:15
+msgid "Attach file"
+msgstr "附加檔案"
+
+#: html/Ticket/Create.html:97 html/Ticket/Update.html:87 html/Work/Tickets/Elements/AddAttachments:6
+msgid "Attached file"
+msgstr "現有附件"
+
+#: NOT FOUND IN SOURCE
+msgid "Attachment '%1' could not be loaded"
+msgstr "無法載入附件 '%1'"
+
+#: lib/RT/Transaction_Overlay.pm:441
+msgid "Attachment created"
+msgstr "附件新增完畢"
+
+#: lib/RT/Tickets_Overlay.pm:1189
+msgid "Attachment filename"
+msgstr "附件檔名"
+
+#: html/Ticket/Elements/ShowAttachments:25 html/Work/Tickets/Elements/ShowTransaction:32
+msgid "Attachments"
+msgstr "附件"
+
+#: NOT FOUND IN SOURCE
+msgid "Aug"
+msgstr "八月"
+
+#: lib/RT/Date.pm:418
+msgid "Aug."
+msgstr "08"
+
+#: NOT FOUND IN SOURCE
+msgid "August"
+msgstr "八月"
+
+#: html/Admin/Elements/ModifyUser:65
+msgid "AuthSystem"
+msgstr "認證方式"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoReject"
+msgstr "自動駁回表單"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoResolve"
+msgstr "自動完成表單處理"
+
+#: etc/initialdata.zh:224 etc/initialdata:206
+msgid "Autoreply"
+msgstr "自動回覆"
+
+#: etc/initialdata.zh:90 etc/initialdata:72
+msgid "Autoreply To Requestors"
+msgstr "自動對申請人回覆"
+
+#: NOT FOUND IN SOURCE
+msgid "AutoreplyToRequestors"
+msgstr "自動對申請人回覆"
+
+#: html/Edit/Rights/index.html:16
+msgid "Available Rights:"
+msgstr "權限項目列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Back to Homepage"
+msgstr "回到首頁"
+
+#: html/Work/Elements/BackButton:2 html/Work/Search/Bulk.html:101
+msgid "Back to Previous"
+msgstr "回上頁"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad PGP Signature: %1\\n"
+msgstr "錯誤的 PGP 簽章:%1\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Bad attachment id. Couldn't find attachment '%1'\\n"
+msgstr "錯誤的附件編號。無法找到附件 '%1'\\n"
+
+#: bin/rt-commit-handler:826
+#. ($val)
+msgid "Bad data in %1"
+msgstr "%1 的資料錯誤"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Basics"
+msgstr "基本資訊"
+
+#: html/Ticket/Update.html:81 html/Work/Tickets/Update.html:49
+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
+msgid "Be sure to save your changes"
+msgstr "請別忘了儲存修改。"
+
+#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:321
+msgid "Before"
+msgstr "早於"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:44
+msgid "Begin Approval"
+msgstr "開始簽核"
+
+#: NOT FOUND IN SOURCE
+msgid "Begin From "
+msgstr "起始日"
+
+#: html/Edit/Users/Info:25
+msgid "Birthday"
+msgstr "生日"
+
+#: etc/initialdata.zh:220 etc/initialdata:202
+msgid "Blank"
+msgstr "空白範本"
+
+#: html/Search/Listing.html:78 html/Work/Search/index.html:53
+msgid "Bookmarkable URL for this search"
+msgstr "將查詢結果轉為可放入書籤的網址"
+
+#: html/Ticket/Elements/ShowHistory:38 html/Ticket/Elements/ShowHistory:44
+msgid "Brief headers"
+msgstr "精簡標頭檔"
+
+#: html/Search/Bulk.html:24 html/Search/Bulk.html:25
+msgid "Bulk ticket update"
+msgstr "更新整批申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Business Unit"
+msgstr "事業部"
+
+#: NOT FOUND IN SOURCE
+msgid "Business Unit:"
+msgstr "事業部:"
+
+#: lib/RT/User_Overlay.pm:1524
+msgid "Can not modify system users"
+msgstr "無法更改系統使用者"
+
+#: lib/RT/Queue_Overlay.pm:66
+msgid "Can this principal see this queue"
+msgstr "該單位是否能查閱此表單"
+
+#: lib/RT/CustomField_Overlay.pm:205
+msgid "Can't add a custom field value without a name"
+msgstr "不能新增沒有名稱的自訂欄位值"
+
+#: lib/RT/Link_Overlay.pm:131
+msgid "Can't link a ticket to itself"
+msgstr "申請單不能鏈結自己。"
+
+#: lib/RT/Ticket_Overlay.pm:2807
+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
+msgid "Can't specifiy both base and target"
+msgstr "不能同時指定起始申請單與目的申請單"
+
+#: html/Edit/Elements/PopFooter:8
+msgid "Cancel"
+msgstr "取消"
+
+#: html/autohandler:113
+#. ($msg)
+msgid "Cannot create user: %1"
+msgstr "無法新增使用者:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Card No."
+msgstr "卡號"
+
+#: NOT FOUND IN SOURCE
+msgid "Categories"
+msgstr "分類管理"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Cc"
+msgstr "副本"
+
+#: NOT FOUND IN SOURCE
+msgid "Cc Type"
+msgstr "副本類別"
+
+#: NOT FOUND IN SOURCE
+msgid "Chairperson's Office"
+msgstr "董事長室"
+
+#: NOT FOUND IN SOURCE
+msgid "Change Ticket"
+msgstr "修改申請單"
+
+#: html/SelfService/Prefs.html:30
+msgid "Change password"
+msgstr "更改密碼"
+
+#: html/Edit/Global/Basic/Top:70
+msgid "ChangeOwnerUI"
+msgstr "可否選擇表單承辦人"
+
+#: html/Ticket/Create.html:100 html/Ticket/Elements/EditCustomFieldEntries:35 html/Ticket/Update.html:90 html/Work/Tickets/Elements/ShowCustomFieldEntries:13
+msgid "Check box to delete"
+msgstr "選擇欲刪除的項目"
+
+#: html/Admin/Elements/SelectRights:30
+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
+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
+msgid "Chinese Name"
+msgstr "中文姓名"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "City"
+msgstr "所在城市"
+
+#: html/Edit/Elements/104Top:30
+msgid "ClassicUI"
+msgstr "傳統介面"
+
+#: html/Ticket/Elements/ShowDates:46
+msgid "Closed"
+msgstr "已解決"
+
+#: html/SelfService/Closed.html:24
+msgid "Closed Tickets"
+msgstr "已解決的申請單"
+
+#: html/SelfService/Elements/Tabs:44
+msgid "Closed tickets"
+msgstr "已解決的申請單"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:181 html/Edit/Global/Workflow/Action:58 html/Edit/Global/Workflow/Condition:51
+msgid "Code"
+msgstr "執行程式碼"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Comment"
+msgstr "評論"
+
+#: html/Admin/Elements/ModifyQueue:44 html/Admin/Queues/Modify.html:57
+msgid "Comment Address"
+msgstr "評論電子郵件地址"
+
+#: NOT FOUND IN SOURCE
+msgid "Comment not recorded"
+msgstr "評論未被紀錄"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "Comment on tickets"
+msgstr "對申請單提出評論"
+
+#: lib/RT/Queue_Overlay.pm:85
+msgid "CommentOnTicket"
+msgstr "評論申請單"
+
+#: html/Admin/Elements/ModifyUser:34 html/Work/Tickets/Update.html:59
+msgid "Comments"
+msgstr "評論"
+
+#: html/Ticket/ModifyAll.html:69 html/Ticket/Update.html:68 html/Work/Tickets/Update.html:35
+msgid "Comments (Not sent to requestors)"
+msgstr "評論(不送給申請人)"
+
+#: html/Search/Bulk.html:131 html/Work/Search/Bulk.html:83
+msgid "Comments (not sent to requestors)"
+msgstr "評論(不送給申請人)"
+
+#: html/Elements/ViewUser:26
+#. ($name)
+msgid "Comments about %1"
+msgstr "對 %1 的評論"
+
+#: html/Admin/Users/Modify.html:184 html/Ticket/Elements/ShowRequestor:43
+msgid "Comments about this user"
+msgstr "使用者描述"
+
+#: lib/RT/Transaction_Overlay.pm:543
+msgid "Comments added"
+msgstr "新增評論完畢"
+
+#: html/Edit/Elements/PopFooter:4 html/Edit/Elements/PopFooter:6
+msgid "Commit"
+msgstr "確認"
+
+#: lib/RT/Action/Generic.pm:139
+msgid "Commit Stubbed"
+msgstr "消除更動完畢"
+
+#: html/Edit/Users/Info:41
+msgid "Company Name"
+msgstr "公司名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Compile Restrictions"
+msgstr "設定查詢條件"
+
+#: html/Admin/Elements/EditScrip:40 html/Admin/Elements/ModifyTemplateAsWorkflow:127
+msgid "Condition"
+msgstr "條件"
+
+#: bin/rt-crontool:108
+msgid "Condition matches..."
+msgstr "符合條件..."
+
+#: lib/RT/Scrip_Overlay.pm:159
+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
+msgid "Configuration"
+msgstr "設定"
+
+#: html/SelfService/Prefs.html:32
+msgid "Confirm"
+msgstr "確認密碼"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Confirm Submit"
+msgstr "確定送出"
+
+#: NOT FOUND IN SOURCE
+msgid "Contact System Administrator"
+msgstr "連絡系統管理員"
+
+#: html/Admin/Elements/ModifyUser:59
+msgid "ContactInfoSystem"
+msgstr "連絡資訊系統"
+
+#: NOT FOUND IN SOURCE
+msgid "Contacted date '%1' could not be parsed"
+msgstr "無法解讀聯絡日期 '%1'"
+
+#: html/Admin/Elements/ModifyTemplate:43 html/Admin/Elements/ModifyTemplateAsWorkflow:200 html/Ticket/ModifyAll.html:86
+msgid "Content"
+msgstr "內容"
+
+#: NOT FOUND IN SOURCE
+msgid "Coould not create group"
+msgstr "無法新增群組"
+
+#: html/Edit/Elements/104Buttons:74
+msgid "Copy"
+msgstr "複製"
+
+#: NOT FOUND IN SOURCE
+msgid "Copy Field From:"
+msgstr "欲複製欄位:"
+
+#: etc/initialdata.zh:282 etc/initialdata:271
+msgid "Correspondence"
+msgstr "回覆"
+
+#: html/Admin/Elements/ModifyQueue:38 html/Admin/Queues/Modify.html:50
+msgid "Correspondence Address"
+msgstr "申請單回覆地址"
+
+#: lib/RT/Transaction_Overlay.pm:539
+msgid "Correspondence added"
+msgstr "新增申請單回覆"
+
+#: NOT FOUND IN SOURCE
+msgid "Correspondence not recorded"
+msgstr "未紀錄申請單回覆"
+
+#: lib/RT/Ticket_Overlay.pm:3552
+msgid "Could not add new custom field value for ticket. "
+msgstr "不能新增自訂欄位的值 "
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Could not change owner. "
+msgstr "不能更改承辦人。 "
+
+#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:165 html/Edit/Global/CustomField/index.html:117
+#. ($msg)
+msgid "Could not create CustomField"
+msgstr "無法新增自訂欄位"
+
+#: html/Edit/Global/Workflow/index.html:126
+#. ($msg)
+msgid "Could not create Scrip"
+msgstr "無法建立訊息通知"
+
+#: html/Edit/Global/Template/index.html:110
+#. ($msg)
+msgid "Could not create Template"
+msgstr "無法建立通知範本"
+
+#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:473 lib/RT/Group_Overlay.pm:480
+msgid "Could not create group"
+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
+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
+msgid "Could not create user"
+msgstr "無法新增使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not create watcher for requestor"
+msgstr "無法為申請人新增視察員"
+
+#: html/Admin/Elements/ModifyWorkflow:219 html/Admin/Global/Workflow.html:75 html/Admin/Queues/Workflow.html:71
+#. ($msg)
+msgid "Could not create workflow: %1"
+msgstr "無法新增流程:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find a ticket with id %1"
+msgstr "找不到編號 %1 的申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Could not find group %1."
+msgstr "找不到群組 %1。"
+
+#: lib/RT/Queue_Overlay.pm:621 lib/RT/Ticket_Overlay.pm:1421
+msgid "Could not find or create that user"
+msgstr "找不到或無法新增該名使用者"
+
+#: lib/RT/Queue_Overlay.pm:682 lib/RT/Ticket_Overlay.pm:1500
+msgid "Could not find that principal"
+msgstr "找不到該單位"
+
+#: NOT FOUND IN SOURCE
+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)
+msgid "Could not load group"
+msgstr "無法載入群組"
+
+#: lib/RT/Queue_Overlay.pm:641
+#. ($args{'Type'})
+msgid "Could not make that principal a %1 for this queue"
+msgstr "無法將該單位設為此表單的 %1。"
+
+#: lib/RT/Ticket_Overlay.pm:1442
+#. ($self->loc($args{'Type'}))
+msgid "Could not make that principal a %1 for this ticket"
+msgstr "無法將該單位設為此申請單的 %1。"
+
+#: lib/RT/Queue_Overlay.pm:740
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this queue"
+msgstr "無法將單位 %1 從表單移除。"
+
+#: lib/RT/Ticket_Overlay.pm:1558
+#. ($args{'Type'})
+msgid "Could not remove that principal as a %1 for this ticket"
+msgstr "無法將單位 %1 從申請單移除。"
+
+#: lib/RT/Group_Overlay.pm:984
+msgid "Couldn't add member to group"
+msgstr "無法新增成員至群組"
+
+#: lib/RT/Ticket_Overlay.pm:3562 lib/RT/Ticket_Overlay.pm:3618
+#. ($Msg)
+msgid "Couldn't create a transaction: %1"
+msgstr "無法新增更動報告"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't figure out what to do from gpg's reply\\n"
+msgstr "無法從 gpg 回函辨識出該採取的行動\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find group\\n"
+msgstr "找不到群組\\n"
+
+#: lib/RT/Interface/Web.pm:902 x:905
+msgid "Couldn't find row"
+msgstr "找不到此列資料"
+
+#: lib/RT/Group_Overlay.pm:958
+msgid "Couldn't find that principal"
+msgstr "找不到該單位"
+
+#: lib/RT/CustomField_Overlay.pm:239
+msgid "Couldn't find that value"
+msgstr "找不到該值"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find that watcher"
+msgstr "找不到該視察員"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't find user\\n"
+msgstr "找不到使用者\\n"
+
+#: lib/RT/CurrentUser.pm:111
+#. ($self->Id)
+msgid "Couldn't load %1 from the users database.\\n"
+msgstr "無法從使用者資料庫載入 %1。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load KeywordSelects."
+msgstr "無法載入 KeywordSelects。"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load RT config file '%1' %2"
+msgstr "無法載入 RT 設定檔 '%1' %2"
+
+#: NOT FOUND IN SOURCE
+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)
+#. ($ObjectGroup)
+#. ($id)
+msgid "Couldn't load group %1"
+msgstr "無法載入手續 %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 "無法載入鏈結。"
+
+#: html/Admin/Elements/EditCustomFields:146 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
+#. ($Queue)
+#. ($id)
+msgid "Couldn't load queue %1"
+msgstr "無法載入表單 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load scrip"
+msgstr "無法載入手續"
+
+#: NOT FOUND IN SOURCE
+msgid "Couldn't load template"
+msgstr "無法載入範本"
+
+#: html/Admin/Users/Prefs.html:78
+#. ($id)
+msgid "Couldn't load that user (%1)"
+msgstr "無法載入該名使用者(%1)"
+
+#: html/SelfService/Display.html:108
+#. ($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
+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
+msgid "Create"
+msgstr "新增"
+
+#: html/Edit/Groups/MemberGroups/Add.html:17
+msgid "Create Subgroup:"
+msgstr "新增子群組:"
+
+#: etc/initialdata.zh:145 etc/initialdata:127
+msgid "Create Tickets"
+msgstr "新增申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Create User:"
+msgstr "新增成員:"
+
+#: html/Admin/Elements/EditCustomField:74
+msgid "Create a CustomField"
+msgstr "新增自訂欄位"
+
+#: html/Admin/Queues/CustomField.html:47
+#. ($QueueObj->Name())
+msgid "Create a CustomField for queue %1"
+msgstr "為 %1 表單新增自訂欄位"
+
+#: html/Admin/Global/CustomField.html:47
+msgid "Create a CustomField which applies to all queues"
+msgstr "為 %1 表單新增自訂欄位"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new Custom Field"
+msgstr "新增自訂欄位"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global Scrip"
+msgstr "新增全域手續"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new global scrip"
+msgstr "新增全域手續"
+
+#: html/Admin/Groups/Modify.html:66 html/Admin/Groups/Modify.html:92
+msgid "Create a new group"
+msgstr "新增群組"
+
+#: html/User/Groups/Modify.html:66 html/User/Groups/Modify.html:91
+msgid "Create a new personal group"
+msgstr "新增代理人群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new queue"
+msgstr "新增表單"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new scrip"
+msgstr "新增手續"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new template"
+msgstr "新增範本"
+
+#: html/Ticket/Create.html:24 html/Ticket/Create.html:27 html/Ticket/Create.html:35
+msgid "Create a new ticket"
+msgstr "新增申請單"
+
+#: html/Admin/Users/Modify.html:213 html/Admin/Users/Modify.html:240
+msgid "Create a new user"
+msgstr "新增使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a new workflow"
+msgstr "新增流程"
+
+#: html/Admin/Queues/Modify.html:103
+msgid "Create a queue"
+msgstr "新增表單"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a queue called"
+msgstr "新增表單名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Create a request"
+msgstr "提出申請"
+
+#: html/Admin/Queues/Scrip.html:58
+#. ($QueueObj->Name)
+msgid "Create a scrip for queue %1"
+msgstr "為 %1 表單新增手續"
+
+#: html/Admin/Global/Template.html:68 html/Admin/Queues/Template.html:64
+msgid "Create a template"
+msgstr "新增範本"
+
+#: html/SelfService/Create.html:24
+msgid "Create a ticket"
+msgstr "提出申請單"
+
+#: html/Admin/Elements/ModifyWorkflow:206 html/Admin/Global/Workflow.html:69 html/Admin/Queues/Workflow.html:64
+msgid "Create a workflow"
+msgstr "新增流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1 / %2 / %3 "
+msgstr "新增失敗:%1 / %2 / %3"
+
+#: NOT FOUND IN SOURCE
+msgid "Create failed: %1/%2/%3"
+msgstr "新增失敗:%1/%2/%3"
+
+#: NOT FOUND IN SOURCE
+msgid "Create new item"
+msgstr "建立新項目"
+
+#: etc/initialdata.zh:147 etc/initialdata:129
+msgid "Create new tickets based on this scrip's template"
+msgstr "依據此項手續內的模版,新增申請單"
+
+#: html/SelfService/Create.html:77
+msgid "Create ticket"
+msgstr "新增申請單"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "Create tickets in this queue"
+msgstr "在此表單中新增申請單"
+
+#: lib/RT/Queue_Overlay.pm:71
+msgid "Create, delete and modify custom fields"
+msgstr "新增、刪除及更改自訂欄位"
+
+#: lib/RT/Queue_Overlay.pm:67
+msgid "Create, delete and modify queues"
+msgstr "新增、刪除及更改表單"
+
+#: NOT FOUND IN SOURCE
+msgid "Create, delete and modify the members of any user's personal groups"
+msgstr "新增、刪除及更改任何使用者的代理人群組"
+
+#: lib/RT/System.pm:58
+msgid "Create, delete and modify the members of personal groups"
+msgstr "新增、刪除及更改代理人群組"
+
+#: lib/RT/System.pm:59
+msgid "Create, delete and modify users"
+msgstr "新增、刪除及更改使用者"
+
+#: lib/RT/Queue_Overlay.pm:83
+msgid "CreateTicket"
+msgstr "新增申請單"
+
+#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:26 lib/RT/Ticket_Overlay.pm:1185
+msgid "Created"
+msgstr "新增日"
+
+#: html/Admin/Elements/EditCustomField:87
+#. ($CustomFieldObj->Name())
+msgid "Created CustomField %1"
+msgstr "自訂欄位 %1 新增成功"
+
+#: NOT FOUND IN SOURCE
+msgid "Created template %1"
+msgstr "範本 %1 新增成功"
+
+#: html/Admin/Elements/ModifyWorkflow:221
+#. (loc( $WorkflowObj->Name() ))
+msgid "Created workflow %1"
+msgstr "流程 %1 新增成功"
+
+#: NOT FOUND IN SOURCE
+msgid "Currency"
+msgstr "幣別"
+
+#: NOT FOUND IN SOURCE
+msgid "Current Approval Info"
+msgstr "截至目前簽核資訊"
+
+#: NOT FOUND IN SOURCE
+msgid "Current Custom Fields"
+msgstr "現有自訂欄位"
+
+#: html/Edit/Groups/MemberGroups/Add.html:14
+msgid "Current Groups:"
+msgstr "現有群組列表:"
+
+#: html/Ticket/Elements/EditLinks:27
+msgid "Current Relationships"
+msgstr "現有關係"
+
+#: html/Edit/Rights/index.html:19
+msgid "Current Rights:"
+msgstr "現有權限:"
+
+#: html/Admin/Elements/EditScrips:29
+msgid "Current Scrips"
+msgstr "現有手續"
+
+#: html/Work/Tickets/Create.html:50 html/Work/Tickets/Elements/ShowBasics:47
+msgid "Current Status"
+msgstr "目前狀態"
+
+#: NOT FOUND IN SOURCE
+msgid "Current Templates"
+msgstr "現有範本"
+
+#: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41
+msgid "Current members"
+msgstr "現有成員"
+
+#: html/Admin/Elements/SelectRights:28
+msgid "Current rights"
+msgstr "現有權限"
+
+#: html/Search/Listing.html:70 html/Work/Search/index.html:42
+msgid "Current search criteria"
+msgstr "現有查詢條件"
+
+#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44
+msgid "Current watchers"
+msgstr "現有視察員"
+
+#: html/Admin/Global/CustomField.html:54
+#. ($CustomField)
+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
+msgid "Custom Fields"
+msgstr "自訂欄位"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom Fields which apply to all queues"
+msgstr "適用於所有表單的自訂欄位"
+
+#: html/Admin/Elements/EditScrip:72 html/Edit/Global/Scrip/Top:69
+msgid "Custom action cleanup code"
+msgstr "動作後執行程式"
+
+#: html/Admin/Elements/EditScrip:64 html/Edit/Global/Scrip/Top:62
+msgid "Custom action preparation code"
+msgstr "動作前執行程式"
+
+#: html/Admin/Elements/EditScrip:48 html/Edit/Global/Scrip/Top:35 html/Edit/Global/Scrip/Top:61
+msgid "Custom condition"
+msgstr "自訂條件"
+
+#: lib/RT/Tickets_Overlay.pm:1618
+#. ($CF->Name , $args{OPERATOR} , $args{VALUE})
+msgid "Custom field %1 %2 %3"
+msgstr "自訂欄位 %1 %2 %3"
+
+#: lib/RT/Tickets_Overlay.pm:1613
+#. ($CF->Name)
+msgid "Custom field %1 has a value."
+msgstr "自訂欄位 %1 已有值"
+
+#: lib/RT/Tickets_Overlay.pm:1610
+#. ($CF->Name)
+msgid "Custom field %1 has no value."
+msgstr "自訂欄位 %1 沒有值"
+
+#: lib/RT/Ticket_Overlay.pm:3454
+#. ($args{'Field'})
+msgid "Custom field %1 not found"
+msgstr "找不到自訂欄位 %1"
+
+#: html/Admin/Elements/EditCustomFields:196
+msgid "Custom field deleted"
+msgstr "自訂欄位已刪除"
+
+#: lib/RT/Ticket_Overlay.pm:3604
+msgid "Custom field not found"
+msgstr "找不到自訂欄位"
+
+#: lib/RT/CustomField_Overlay.pm:349
+#. ($args{'Content'}, $self->Name)
+msgid "Custom field value %1 could not be found for custom field %2"
+msgstr "無法從自訂欄位 %2 中找到 %1 這個欄位值"
+
+#: NOT FOUND IN SOURCE
+msgid "Custom field value changed from %1 to %2"
+msgstr "自訂欄位值從 %1 改為 %2"
+
+#: lib/RT/CustomField_Overlay.pm:249
+msgid "Custom field value could not be deleted"
+msgstr "無法刪除自訂欄位值"
+
+#: lib/RT/CustomField_Overlay.pm:355
+msgid "Custom field value could not be found"
+msgstr "找不到自訂欄位值"
+
+#: lib/RT/CustomField_Overlay.pm:247 lib/RT/CustomField_Overlay.pm:357
+msgid "Custom field value deleted"
+msgstr "自訂欄位值刪除成功"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:145 html/Edit/Global/Workflow/Owner.html:90 lib/RT/Transaction_Overlay.pm:548
+msgid "CustomField"
+msgstr "自訂欄位"
+
+#: NOT FOUND IN SOURCE
+msgid "Data error"
+msgstr "資料錯誤"
+
+#: 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
+msgid "Dates"
+msgstr "日期"
+
+#: NOT FOUND IN SOURCE
+msgid "Dec"
+msgstr "十二月"
+
+#: lib/RT/Date.pm:422
+msgid "Dec."
+msgstr "12"
+
+#: NOT FOUND IN SOURCE
+msgid "December"
+msgstr "十二月"
+
+#: NOT FOUND IN SOURCE
+msgid "Default Autoresponse Template"
+msgstr "預設自動回應範本"
+
+#: etc/initialdata.zh:225 etc/initialdata:207
+msgid "Default Autoresponse template"
+msgstr "預設自動回應範本"
+
+#: etc/initialdata.zh:304 etc/initialdata:281
+msgid "Default admin comment template"
+msgstr "預設管理員評論範本"
+
+#: etc/initialdata.zh:262 etc/initialdata:260
+msgid "Default admin correspondence template"
+msgstr "預設管理員回覆範本"
+
+#: etc/initialdata.zh:283 etc/initialdata:272
+msgid "Default correspondence template"
+msgstr "預設回覆範本"
+
+#: etc/initialdata.zh:240 etc/initialdata:238
+msgid "Default transaction template"
+msgstr "預設更動範本"
+
+#: lib/RT/Transaction_Overlay.pm:643
+#. ($type, $self->Field, $self->OldValue, $self->NewValue)
+msgid "Default: %1/%2 changed from %3 to %4"
+msgstr "預設:%1/%2 已自 %3 改為 %4"
+
+#: html/User/Delegation.html:24 html/User/Delegation.html:27
+msgid "Delegate rights"
+msgstr "代表團權限"
+
+#: lib/RT/System.pm:62
+msgid "Delegate specific rights which have been granted to you."
+msgstr "將擁有的權限委託他人代理"
+
+#: lib/RT/System.pm:62
+msgid "DelegateRights"
+msgstr "設定代理人"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegated Approval"
+msgstr "代理簽核"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegated Queue"
+msgstr "代理表單名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegated Queue:"
+msgstr "代理表單:"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Delegates"
+msgstr "代理人"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Enabled Status"
+msgstr "代理啟動狀態"
+
+#: html/Work/Delegates/Info:18 html/Work/Overview/Info:18
+msgid "Delegates Info"
+msgstr "代理人資訊"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Period"
+msgstr "代理期間"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Permission Setting"
+msgstr "代理權限設定"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Permission:"
+msgstr "代理權限:"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegates Setting"
+msgstr "代理人設定"
+
+#: html/Work/Delegates/Info:46 html/Work/Delegates/List:11 html/Work/Overview/Info:39
+msgid "Delegates Status"
+msgstr "代理狀態"
+
+#: html/User/Elements/Tabs:37
+msgid "Delegation"
+msgstr "代理人權限"
+
+#: NOT FOUND IN SOURCE
+msgid "Delegation Groups"
+msgstr "代理人群組"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Delete"
+msgstr "刪除"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "Delete tickets"
+msgstr "刪除申請單"
+
+#: lib/RT/Queue_Overlay.pm:88
+msgid "DeleteTicket"
+msgstr "刪除申請單"
+
+#: lib/RT/Transaction_Overlay.pm:187
+msgid "Deleting this object could break referential integrity"
+msgstr "刪除此物件可能破壞參考完整性"
+
+#: lib/RT/Queue_Overlay.pm:293
+msgid "Deleting this object would break referential integrity"
+msgstr "刪除此物件可能破壞參考完整性"
+
+#: lib/RT/User_Overlay.pm:499
+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:44 html/Work/Approvals/Elements/Approve:32
+msgid "Deny"
+msgstr "駁回"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Department Name"
+msgstr "部門名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Department's"
+msgstr "部門之"
+
+#: NOT FOUND IN SOURCE
+msgid "Departure Details"
+msgstr "差旅明細"
+
+#: NOT FOUND IN SOURCE
+msgid "Departure From"
+msgstr "差旅起始日"
+
+#: NOT FOUND IN SOURCE
+msgid "Departure Request"
+msgstr "請假單"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Depended on by"
+msgstr "可接續處理的申請單"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Depends on"
+msgstr "需先處理"
+
+#: NOT FOUND IN SOURCE
+msgid "DependsOn"
+msgstr "需先處理"
+
+#: html/Elements/SelectSortOrder:34
+msgid "Descending"
+msgstr "遞減"
+
+#: html/SelfService/Create.html:72 html/Ticket/Create.html:118
+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
+msgid "Description"
+msgstr "描述"
+
+#: NOT FOUND IN SOURCE
+msgid "Description of Responsibility"
+msgstr "經辦業務說明"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Details"
+msgstr "細節"
+
+#: NOT FOUND IN SOURCE
+msgid "Direct"
+msgstr "直接"
+
+#: html/Edit/Users/Info:31
+msgid "Disability"
+msgstr "殘障身分"
+
+#: html/Edit/Users/Info:29
+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
+msgid "Disabled"
+msgstr "停用"
+
+#: html/Ticket/Elements/Tabs:84
+msgid "Display"
+msgstr "顯示內容"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "Display Access Control List"
+msgstr "顯示權限控制清單"
+
+#: lib/RT/Queue_Overlay.pm:74
+msgid "Display Scrip templates for this queue"
+msgstr "顯示此表單的範本"
+
+#: lib/RT/Queue_Overlay.pm:77
+msgid "Display Scrips for this queue"
+msgstr "顯示此表單的手續"
+
+#: html/Ticket/Elements/ShowHistory:34
+msgid "Display mode"
+msgstr "顯示模式"
+
+#: NOT FOUND IN SOURCE
+msgid "Display ticket #%1"
+msgstr "顯示第%1號申請單"
+
+#: lib/RT/System.pm:53
+msgid "Do anything and everything"
+msgstr "允許一切操作"
+
+#: html/Elements/Refresh:29
+msgid "Don't refresh this page."
+msgstr "不更新此頁面。"
+
+#: html/Search/Elements/PickRestriction:113 html/Work/Search/PickRestriction:95
+msgid "Don't show search results"
+msgstr "不顯示查詢結果"
+
+#: html/Edit/Elements/Page:19 html/Edit/Elements/Page:21
+msgid "Down"
+msgstr "下一頁"
+
+#: html/Ticket/Elements/ShowTransaction:92
+msgid "Download"
+msgstr "下載"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Due"
+msgstr "到期日"
+
+#: NOT FOUND IN SOURCE
+msgid "Due Date"
+msgstr "截止日"
+
+#: NOT FOUND IN SOURCE
+msgid "Due date '%1' could not be parsed"
+msgstr "無法解讀日期 '%1'"
+
+#: bin/rt-commit-handler:753
+#. ($1, $msg)
+msgid "ERROR: Couldn't load ticket '%1': %2.\\n"
+msgstr "無法載入申請單 '%1':%2.\\n"
+
+#: html/Work/Tickets/Update.html:46
+msgid "Edit"
+msgstr "編輯"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:132
+msgid "Edit Conditions"
+msgstr "編輯前置條件"
+
+#: html/Admin/Queues/CustomFields.html:44
+#. ($Queue->Name)
+msgid "Edit Custom Fields for %1"
+msgstr "編輯 %1 的自訂欄位"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit Custom Fields for queue %1"
+msgstr "編輯表單 %1 的自訂欄位"
+
+#: html/Search/Bulk.html:143 html/Ticket/ModifyLinks.html:35 html/Work/Search/Bulk.html:93
+msgid "Edit Relationships"
+msgstr "編輯申請單關係"
+
+#: html/Edit/Groups/MemberGroups/Add.html:3 html/Edit/Groups/MemberGroups/index.html:22
+msgid "Edit Subgroups"
+msgstr "新增/維護子群組"
+
+#: html/Admin/Queues/Templates.html:41
+#. ($QueueObj->Name)
+msgid "Edit Templates for queue %1"
+msgstr "編輯表單 %1 的範本"
+
+#: html/Admin/Queues/Workflows.html:42
+#. ($QueueObj->Name)
+msgid "Edit Workflows for queue %1"
+msgstr "編輯表單 %1 的流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit keywords"
+msgstr "編輯關鍵字"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit scrips"
+msgstr "編輯手續"
+
+#: html/Admin/Global/index.html:45
+msgid "Edit system templates"
+msgstr "編輯全域範本"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit system workflows"
+msgstr "編輯全域流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit templates for %1"
+msgstr "編輯 %1 的範本"
+
+#: NOT FOUND IN SOURCE
+msgid "Edit workflows for %1"
+msgstr "編輯 %1 的流程"
+
+#: html/Admin/Elements/ModifyQueue:24 html/Admin/Queues/Modify.html:118
+#. ($QueueObj->Name)
+#. ($QueueObj->Id)
+msgid "Editing Configuration for queue %1"
+msgstr "編輯表單 %1 的設定"
+
+#: html/Admin/Elements/ModifyUser:24
+#. ($UserObj->Name)
+msgid "Editing Configuration for user %1"
+msgstr "編輯使用者 %1 的設定"
+
+#: html/Admin/Elements/EditCustomField:90
+#. ($CustomFieldObj->Name())
+msgid "Editing CustomField %1"
+msgstr "編輯自訂欄位 %1"
+
+#: html/Admin/Groups/Members.html:31
+#. ($Group->Name)
+msgid "Editing membership for group %1"
+msgstr "編輯群組 %1 的成員資訊"
+
+#: html/User/Groups/Members.html:128
+#. ($Group->Name)
+msgid "Editing membership for personal group %1"
+msgstr "編輯代理人群組 %1 的成員資訊"
+
+#: NOT FOUND IN SOURCE
+msgid "Editing template %1"
+msgstr "編輯範本 %1"
+
+#: html/Admin/Elements/ModifyWorkflow:238
+#. (loc( $WorkflowObj->Name() ))
+msgid "Editing workflow %1"
+msgstr "編輯流程 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Education"
+msgstr "最高學歷"
+
+#: NOT FOUND IN SOURCE
+msgid "EffectiveId"
+msgstr "有效編號"
+
+#: lib/RT/Ticket_Overlay.pm:2635 lib/RT/Ticket_Overlay.pm:2703
+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
+msgid "Email"
+msgstr "電子郵件信箱"
+
+#: lib/RT/User_Overlay.pm:247
+msgid "Email address in use"
+msgstr "此電子郵件信箱已被使用"
+
+#: html/Admin/Elements/ModifyUser:41
+msgid "EmailAddress"
+msgstr "電子郵件信箱位址"
+
+#: html/Admin/Elements/ModifyUser:53
+msgid "EmailEncoding"
+msgstr "電子郵件文字編碼方式"
+
+#: NOT FOUND IN SOURCE
+msgid "Embark Date"
+msgstr "外籍員工入境日"
+
+#: NOT FOUND IN SOURCE
+msgid "Embarked Date"
+msgstr "抵達日期"
+
+#: NOT FOUND IN SOURCE
+msgid "Embarked Location"
+msgstr "抵達地點"
+
+#: NOT FOUND IN SOURCE
+msgid "Enable Delegates"
+msgstr "代理啟動"
+
+#: html/Admin/Elements/EditCustomField:50
+msgid "Enabled (Unchecking this box disables this custom field)"
+msgstr "啟用(取消勾選將停用此自訂欄位)"
+
+#: html/Admin/Groups/Modify.html:52 html/User/Groups/Modify.html:52
+msgid "Enabled (Unchecking this box disables this group)"
+msgstr "啟用(取消勾選將停用此群組)"
+
+#: html/Admin/Queues/Modify.html:83
+msgid "Enabled (Unchecking this box disables this queue)"
+msgstr "啟用(取消勾選將停用此表單)"
+
+#: html/Admin/Elements/EditCustomFields:98
+msgid "Enabled Custom Fields"
+msgstr "已啟用的自訂欄位"
+
+#: html/Edit/Queues/Basic/Top:75 html/Edit/Queues/List:15
+msgid "Enabled Date"
+msgstr "啟用日期"
+
+#: NOT FOUND IN SOURCE
+msgid "Enabled Date:"
+msgstr "啟動日期:"
+
+#: html/Admin/Queues/index.html:55
+msgid "Enabled Queues"
+msgstr "已啟用的表單"
+
+#: html/Edit/Queues/Basic/Top:66 html/Edit/Queues/List:11
+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
+#. (loc_fuzzy($msg))
+msgid "Enabled status %1"
+msgstr "啟用狀態 %1"
+
+#: html/Edit/Users/Info:34
+msgid "End of Trial"
+msgstr "試用期滿日"
+
+#: NOT FOUND IN SOURCE
+msgid "English Name"
+msgstr "英文姓名"
+
+#: lib/RT/CustomField_Overlay.pm:427
+msgid "Enter multiple values"
+msgstr "鍵入多重項目"
+
+#: html/Edit/Users/Search.html:15
+msgid "Enter one or more conditions below to search for users"
+msgstr "輸入下列單一或複式條件,查詢用戶資料"
+
+#: lib/RT/CustomField_Overlay.pm:424
+msgid "Enter one value"
+msgstr "鍵入單一項目"
+
+#: html/Search/Bulk.html:144 html/Ticket/Elements/EditLinks:111 html/Work/Search/Bulk.html:95
+msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces."
+msgstr "輸入申請單可鏈結到的申請單編號或網址。以空白隔開。"
+
+#: lib/RT/CustomField_Vendor.pm:20
+msgid "EntryBoolean"
+msgstr "是非填表"
+
+#: lib/RT/CustomField_Vendor.pm:17
+msgid "EntryDate"
+msgstr "日期填表"
+
+#: NOT FOUND IN SOURCE
+msgid "EntryExternal"
+msgstr "系統填表"
+
+#: lib/RT/CustomField_Vendor.pm:16
+msgid "EntryFreeform"
+msgstr "輸入填表"
+
+#: NOT FOUND IN SOURCE
+msgid "EntryMultiple"
+msgstr "多選填表"
+
+#: lib/RT/CustomField_Vendor.pm:19
+msgid "EntryNumber"
+msgstr "數值填表"
+
+#: lib/RT/CustomField_Vendor.pm:15
+msgid "EntrySelect"
+msgstr "單選填表"
+
+#: lib/RT/CustomField_Vendor.pm:18
+msgid "EntryTime"
+msgstr "時間填表"
+
+#: html/Elements/Login:39 html/SelfService/Error.html:24 html/SelfService/Error.html:25
+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 "表單->新增視察員的參數有誤"
+
+#: lib/RT/Queue_Overlay.pm:713
+msgid "Error in parameters to Queue->DelWatcher"
+msgstr "表單->刪除視察員的參數有誤"
+
+#: lib/RT/Ticket_Overlay.pm:1374
+msgid "Error in parameters to Ticket->AddWatcher"
+msgstr "申請單->新增視察員的參數有誤"
+
+#: lib/RT/Ticket_Overlay.pm:1531
+msgid "Error in parameters to Ticket->DelWatcher"
+msgstr "申請單->刪除視察員的參數有誤"
+
+#: etc/initialdata.zh:38 etc/initialdata:20
+msgid "Everyone"
+msgstr "所有人"
+
+#: bin/rt-crontool:193
+msgid "Example:"
+msgstr "範例:"
+
+#: html/Edit/Elements/104Buttons:77
+msgid "Export"
+msgstr "匯出"
+
+#: html/Admin/Elements/ModifyUser:63
+msgid "ExternalAuthId"
+msgstr "外部認證帳號"
+
+#: html/Admin/Elements/ModifyUser:57
+msgid "ExternalContactInfoId"
+msgstr "外部聯絡方式帳號"
+
+#: html/Edit/Global/Basic/Top:64
+msgid "ExternalDatabaseDSN"
+msgstr "外部資料庫連結字串"
+
+#: html/Edit/Global/Basic/Top:68
+msgid "ExternalDatabasePass"
+msgstr "外部資料庫密碼"
+
+#: html/Edit/Global/Basic/Top:66
+msgid "ExternalDatabaseUser"
+msgstr "外部資料庫用戶"
+
+#: html/Edit/Global/Basic/Top:62
+msgid "ExternalURL"
+msgstr "外部介面網址"
+
+#: html/Admin/Users/Modify.html:72
+msgid "Extra info"
+msgstr "備註"
+
+#: lib/RT/User_Overlay.pm:363
+msgid "Failed to find 'Privileged' users pseudogroup."
+msgstr "找不到「內部成員」虛擬群組的使用者。"
+
+#: lib/RT/User_Overlay.pm:370
+msgid "Failed to find 'Unprivileged' users pseudogroup"
+msgstr "找不到「非內部成員」虛擬群組的使用者。"
+
+#: bin/rt-crontool:137
+#. ($modname, $@)
+msgid "Failed to load module %1. (%2)"
+msgstr "無法載入模組 %1. (%2)"
+
+#: NOT FOUND IN SOURCE
+msgid "Feb"
+msgstr "二月"
+
+#: lib/RT/Date.pm:412
+msgid "Feb."
+msgstr "02"
+
+#: NOT FOUND IN SOURCE
+msgid "February"
+msgstr "二月"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Field Description"
+msgstr "欄位描述"
+
+#: html/Edit/Global/CustomField/List:6 html/Edit/Global/CustomField/Top:15
+msgid "Field Name"
+msgstr "欄位名稱"
+
+#: html/Edit/Elements/PickUsers:52 html/Edit/Users/Add.html:47
+msgid "Filter"
+msgstr "篩選"
+
+#: html/Edit/Elements/PickUsers:6 html/Edit/Users/Add.html:7 html/Work/Tickets/Cc:4
+msgid "Filter people"
+msgstr "對象篩選"
+
+#: html/Edit/Elements/PickUsers:68 html/Edit/Users/Add.html:63 html/Work/Tickets/Cc:42
+msgid "Filtered list:"
+msgstr "篩選列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Fin"
+msgstr "最終"
+
+#: html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:58 lib/RT/Tickets_Overlay.pm:1091
+msgid "Final Priority"
+msgstr "最低順位"
+
+#: lib/RT/Ticket_Overlay.pm:1180
+msgid "FinalPriority"
+msgstr "最低順位"
+
+#: NOT FOUND IN SOURCE
+msgid "Financial Department:"
+msgstr "財務部:"
+
+#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33
+msgid "Find group whose"
+msgstr "尋找群組的"
+
+#: NOT FOUND IN SOURCE
+msgid "Find new/open tickets"
+msgstr "尋找/開啟申請單"
+
+#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29
+msgid "Find people whose"
+msgstr "尋找人員的"
+
+#: html/Search/Listing.html:107 html/Work/Search/index.html:88
+msgid "Find tickets"
+msgstr "尋找申請單"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:118
+msgid "Finish Approval"
+msgstr "簽核完畢"
+
+#: html/Ticket/Elements/Tabs:57
+msgid "First"
+msgstr "第一項"
+
+#: html/Search/Listing.html:40 html/Work/Search/index.html:17
+msgid "First page"
+msgstr "第一頁"
+
+#: html/Edit/Global/Workflow/Owner.html:30
+msgid "First-"
+msgstr "一"
+
+#: NOT FOUND IN SOURCE
+msgid "First-level Admins"
+msgstr "一階主管"
+
+#: html/Edit/Users/Info:39
+msgid "First-level Users"
+msgstr "一階主管員工"
+
+#: NOT FOUND IN SOURCE
+msgid "Fixed shift"
+msgstr "固定班"
+
+#: docs/design_docs/string-extraction-guide.txt:33
+msgid "Foo Bar Baz"
+msgstr "甲 乙 丙"
+
+#: docs/design_docs/string-extraction-guide.txt:24
+msgid "Foo!"
+msgstr "甲!"
+
+#: html/Search/Bulk.html:86 html/Work/Search/Bulk.html:55
+msgid "Force change"
+msgstr "強制更新"
+
+#: html/Work/Elements/104Header:89
+msgid "Form Processing"
+msgstr "電子表單作業區"
+
+#: html/Search/Listing.html:105 html/Work/Search/index.html:86
+#. ($ticketcount)
+msgid "Found %quant(%1,ticket)"
+msgstr "找到 %1 張申請單"
+
+#: lib/RT/Interface/Web.pm:904 x:907
+msgid "Found Object"
+msgstr "已找到物件"
+
+#: html/Edit/Global/Workflow/Owner.html:33
+msgid "Fourth-"
+msgstr "四"
+
+#: html/Admin/Elements/ModifyUser:43
+msgid "FreeformContactInfo"
+msgstr "聯絡方式"
+
+#: lib/RT/CustomField_Vendor.pm:11
+msgid "FreeformDate"
+msgstr "日期輸入"
+
+#: NOT FOUND IN SOURCE
+msgid "FreeformExternal"
+msgstr "系統欄位"
+
+#: lib/RT/CustomField_Overlay.pm:37
+msgid "FreeformMultiple"
+msgstr "多重輸入"
+
+#: lib/RT/CustomField_Vendor.pm:13
+msgid "FreeformNumber"
+msgstr "數值輸入"
+
+#: lib/RT/CustomField_Vendor.pm:14
+msgid "FreeformPassword"
+msgstr "密碼輸入"
+
+#: lib/RT/CustomField_Overlay.pm:36
+msgid "FreeformSingle"
+msgstr "單一輸入"
+
+#: lib/RT/CustomField_Vendor.pm:12
+msgid "FreeformTime"
+msgstr "時間輸入"
+
+#: NOT FOUND IN SOURCE
+msgid "Fri"
+msgstr "星期五"
+
+#: lib/RT/Date.pm:392
+msgid "Fri."
+msgstr "星期五"
+
+#: html/Ticket/Elements/ShowHistory:40 html/Ticket/Elements/ShowHistory:50
+msgid "Full headers"
+msgstr "完整標頭檔"
+
+#: NOT FOUND IN SOURCE
+msgid "Gecos"
+msgstr "登入帳號"
+
+#: html/Edit/Users/Info:26
+msgid "Gender"
+msgstr "性別"
+
+#: NOT FOUND IN SOURCE
+msgid "Getting the current user from a pgp sig\\n"
+msgstr "取得目前使用者的 pgp 簽章\\n"
+
+#: lib/RT/Transaction_Overlay.pm:593
+#. ($New->Name)
+msgid "Given to %1"
+msgstr "交予 %1"
+
+#: html/Admin/Elements/Tabs:40 html/Admin/index.html:37
+msgid "Global"
+msgstr "全域設定"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Keyword Selections"
+msgstr "全域關鍵字選取"
+
+#: html/Edit/Users/System:24
+msgid "Global Rights:"
+msgstr "擁有全域權限列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Global Scrips"
+msgstr "全域手續"
+
+#: html/Edit/Elements/Tab:40
+msgid "Global Setup"
+msgstr "全域設定"
+
+#: html/Admin/Elements/SelectTemplate:37 html/Edit/Elements/SelectTemplate:11
+#. (loc($Template->Name))
+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
+msgid "Go!"
+msgstr "執行"
+
+#: NOT FOUND IN SOURCE
+msgid "Good pgp sig from %1\\n"
+msgstr "%1 的 pgp 簽章是正確的\\n"
+
+#: html/Search/Listing.html:49
+msgid "Goto page"
+msgstr "到頁面"
+
+#: html/Elements/GotoTicket:24 html/SelfService/Elements/GotoTicket:24 html/Work/Elements/104Header:49
+msgid "Goto ticket"
+msgstr "跳到申請單"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:224
+msgid "Grand"
+msgstr "上"
+
+#: html/Ticket/Elements/AddWatchers:45 html/User/Elements/DelegateRights:77
+msgid "Group"
+msgstr "群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Group %1 %2: %3"
+msgstr "群組 %1 %2:%3"
+
+#: html/Edit/Global/GroupRight/List:5 html/Edit/Global/GroupRight/Top:20 html/Edit/Groups/List:7
+msgid "Group Description"
+msgstr "群組描述"
+
+#: NOT FOUND IN SOURCE
+msgid "Group Management"
+msgstr "群組管理"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Group Name"
+msgstr "群組名稱"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Group Rights"
+msgstr "群組權限"
+
+#: NOT FOUND IN SOURCE
+msgid "Group Rights:"
+msgstr "擁有群組權限列表:"
+
+#: html/Edit/Elements/Tab:36
+msgid "Group Setup"
+msgstr "群組設定"
+
+#: html/Edit/Global/GroupRight/List:8 html/Edit/Global/GroupRight/Top:14 html/Edit/Groups/List:10 html/Edit/Groups/Top:15
+msgid "Group Status"
+msgstr "群組狀態"
+
+#: lib/RT/Group_Overlay.pm:964
+msgid "Group already has member"
+msgstr "群組內已有此成員"
+
+#: NOT FOUND IN SOURCE
+msgid "Group could not be created."
+msgstr "無法新增群組"
+
+#: html/Admin/Groups/Modify.html:76
+#. ($create_msg)
+msgid "Group could not be created: %1"
+msgstr "無法新增群組:%1"
+
+#: lib/RT/Group_Overlay.pm:496
+msgid "Group created"
+msgstr "群組新增完畢"
+
+#: lib/RT/Group_Overlay.pm:1132
+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
+msgid "Group not found"
+msgstr "找不到群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not found.\\n"
+msgstr "找不到群組。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group not specified.\\n"
+msgstr "未指定群組。\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "Group with Queue Rights"
+msgstr "擁有表單權限群組"
+
+#: html/Edit/Global/Workflow/Owner.html:70
+msgid "Group's"
+msgstr "群組之"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Groups"
+msgstr "群組"
+
+#: lib/RT/Group_Overlay.pm:970
+msgid "Groups can't be members of their members"
+msgstr "不能將群組設為群組內成員"
+
+#: NOT FOUND IN SOURCE
+msgid "Groups with Global Rights"
+msgstr "擁有全域權限群組"
+
+#: html/Edit/Global/GroupRight/List:6 html/Edit/Global/GroupRight/Top:22 html/Edit/Groups/List:8
+msgid "HRMSDefined"
+msgstr "組織架構"
+
+#: NOT FOUND IN SOURCE
+msgid "Health Insurance"
+msgstr "健保補助身份"
+
+#: lib/RT/Interface/CLI.pm:72 lib/RT/Interface/CLI.pm:72
+msgid "Hello!"
+msgstr "嗨!"
+
+#: docs/design_docs/string-extraction-guide.txt:40
+#. ($name)
+msgid "Hello, %1"
+msgstr "嗨,%1"
+
+#: html/Edit/Elements/104Top:28
+msgid "Help"
+msgstr "輔助說明"
+
+#: NOT FOUND IN SOURCE
+msgid "Help Desks"
+msgstr "各項業務窗口"
+
+#: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:87 html/Work/Tickets/Elements/ShowHistory:8
+msgid "History"
+msgstr "紀錄"
+
+#: html/Admin/Elements/ModifyUser:67
+msgid "HomePhone"
+msgstr "住處電話"
+
+#: html/Edit/Elements/104Top:15 html/Edit/Elements/104Top:24 html/Edit/Elements/EDOMHeader:9 html/Elements/Tabs:43
+msgid "Homepage"
+msgstr "主頁"
+
+#: NOT FOUND IN SOURCE
+msgid "Hotel Expense"
+msgstr "住宿費"
+
+#: lib/RT/Base.pm:73
+#. (6)
+msgid "I have %quant(%1,concrete mixer)."
+msgstr "我有 %quant(%1,份固體攪拌器)。"
+
+#: NOT FOUND IN SOURCE
+msgid "ID Number"
+msgstr "身分證號"
+
+#: NOT FOUND IN SOURCE
+msgid "ID Type"
+msgstr "身分類別"
+
+#: html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1018
+msgid "Id"
+msgstr "編號"
+
+#: html/Admin/Users/Modify.html:43 html/User/Prefs.html:38 html/Work/Preferences/Info:14
+msgid "Identity"
+msgstr "身份"
+
+#: etc/initialdata.zh:439 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 "若簽核單遭到駁回,則連帶駁回原申請單,並刪除其他相關的待簽核事項"
+
+#: 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 "如果此工具程式為 setgid,惡意的本地端用戶即能由此取得 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 "若您已更新以上資料,請記得按一下"
+
+#: lib/RT/Interface/Web.pm:896 x:899
+msgid "Illegal value for %1"
+msgstr "%1 的值錯誤"
+
+#: lib/RT/Interface/Web.pm:899 x:902
+msgid "Immutable field"
+msgstr "此欄位值不可更動"
+
+#: html/Edit/Elements/104Buttons:76 html/Edit/Global/Workflow/Import.html:2
+msgid "Import"
+msgstr "匯入"
+
+#: html/Admin/Elements/EditCustomFields:73
+msgid "Include disabled custom fields in listing."
+msgstr "列出停用的自訂欄位"
+
+#: html/Admin/Queues/index.html:42 html/Edit/Queues/index.html:38
+msgid "Include disabled queues in listing."
+msgstr "列出停用的表單"
+
+#: html/Admin/Users/index.html:46 html/Edit/Users/Search.html:62
+msgid "Include disabled users in search."
+msgstr "列出停用的使用者"
+
+#: html/Edit/Users/Info:36
+msgid "Indirect Employee"
+msgstr "直接/間接員工"
+
+#: lib/RT/Tickets_Overlay.pm:1067
+msgid "Initial Priority"
+msgstr "初始優先權"
+
+#: lib/RT/Ticket_Overlay.pm:1179 lib/RT/Ticket_Overlay.pm:1181
+msgid "InitialPriority"
+msgstr "初始優先權"
+
+#: lib/RT/ScripAction_Overlay.pm:104
+msgid "Input error"
+msgstr "輸入錯誤"
+
+#: NOT FOUND IN SOURCE
+msgid "Interest noted"
+msgstr "登記成功"
+
+#: lib/RT/Ticket_Overlay.pm:3829
+msgid "Internal Error"
+msgstr "內部錯誤"
+
+#: lib/RT/Record.pm:142
+#. ($id->{error_message})
+msgid "Internal Error: %1"
+msgstr "內部錯誤:%1"
+
+#: lib/RT/Group_Overlay.pm:643
+msgid "Invalid Group Type"
+msgstr "錯誤的群組類別"
+
+#: lib/RT/Principal_Overlay.pm:127
+msgid "Invalid Right"
+msgstr "錯誤的權限"
+
+#: NOT FOUND IN SOURCE
+msgid "Invalid Type"
+msgstr "錯誤的類型"
+
+#: lib/RT/Interface/Web.pm:901 x:904
+msgid "Invalid data"
+msgstr "錯誤的資料"
+
+#: lib/RT/Ticket_Overlay.pm:439
+msgid "Invalid owner. Defaulting to 'nobody'."
+msgstr "錯誤的承辦人。改為預設承辦人「nobody」。"
+
+#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:250
+msgid "Invalid queue"
+msgstr "錯誤的表單"
+
+#: 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 "錯誤的權限"
+
+#: lib/RT/Record.pm:117
+#. ($key)
+msgid "Invalid value for %1"
+msgstr "%1 的值錯誤"
+
+#: lib/RT/Ticket_Overlay.pm:3461
+msgid "Invalid value for custom field"
+msgstr "錯誤的自訂欄位值"
+
+#: lib/RT/Ticket_Overlay.pm:346
+msgid "Invalid value for status"
+msgstr "錯誤的狀態值"
+
+#: NOT FOUND IN SOURCE
+msgid "IssueStatement"
+msgstr "送出陳述"
+
+#: bin/rt-crontool:190
+msgid "It is incredibly important that nonprivileged users not be allowed to run this tool."
+msgstr "請絕對不要讓未具權限的使用者執行此工具程式。"
+
+#: 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 "建議您新增一個隸屬於正確群組的低權限系統使用者,並以該身份執行此工具程式。"
+
+#: bin/rt-crontool:162
+msgid "It takes several arguments:"
+msgstr "它接受下列參數:"
+
+#: NOT FOUND IN SOURCE
+msgid "Item Name"
+msgstr "品名"
+
+#: NOT FOUND IN SOURCE
+msgid "Items"
+msgstr "筆"
+
+#: NOT FOUND IN SOURCE
+msgid "Items pending my approval"
+msgstr "待簽核項目"
+
+#: NOT FOUND IN SOURCE
+msgid "Jan"
+msgstr "一月"
+
+#: lib/RT/Date.pm:411
+msgid "Jan."
+msgstr "01"
+
+#: NOT FOUND IN SOURCE
+msgid "January"
+msgstr "一月"
+
+#: NOT FOUND IN SOURCE
+msgid "Job"
+msgstr "職稱"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "Join or leave this group"
+msgstr "加入或離開此群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Jul"
+msgstr "七月"
+
+#: lib/RT/Date.pm:417
+msgid "Jul."
+msgstr "01"
+
+#: NOT FOUND IN SOURCE
+msgid "July"
+msgstr "七月"
+
+#: html/Ticket/Elements/Tabs:98
+msgid "Jumbo"
+msgstr "全部資訊"
+
+#: NOT FOUND IN SOURCE
+msgid "Jun"
+msgstr "六月"
+
+#: lib/RT/Date.pm:416
+msgid "Jun."
+msgstr "06."
+
+#: NOT FOUND IN SOURCE
+msgid "June"
+msgstr "六月"
+
+#: NOT FOUND IN SOURCE
+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 "鏈結標籤"
+
+#: html/Admin/Elements/ModifyUser:51
+msgid "Lang"
+msgstr "使用語言"
+
+#: html/Ticket/Elements/Tabs:72
+msgid "Last"
+msgstr "上次更新"
+
+#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:38
+msgid "Last Contact"
+msgstr "上次聯絡"
+
+#: html/Elements/SelectDateType:28
+msgid "Last Contacted"
+msgstr "上次聯絡日期"
+
+#: html/Search/Elements/TicketHeader:40 html/Work/Search/TicketHeader:19
+msgid "Last Notified"
+msgstr "上次通知"
+
+#: html/Elements/SelectDateType:29
+msgid "Last Updated"
+msgstr "上次更新"
+
+#: NOT FOUND IN SOURCE
+msgid "LastUpdated"
+msgstr "上次更新"
+
+#: NOT FOUND IN SOURCE
+msgid "Left"
+msgstr "剩餘時間"
+
+#: html/Admin/Users/Modify.html:82
+msgid "Let this user access RT"
+msgstr "允許這名使用者登入"
+
+#: html/Admin/Users/Modify.html:86
+msgid "Let this user be granted rights"
+msgstr "內部成員(具有個人權限)"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting owner to %1 %2"
+msgstr "限制承辦人為 %1 到%2"
+
+#: NOT FOUND IN SOURCE
+msgid "Limiting queue to %1 %2"
+msgstr "限制表單為 %1 到 %2"
+
+#: html/Work/Queues/Select.html:4
+msgid "Link a Queue"
+msgstr "申請表單連結"
+
+#: lib/RT/Ticket_Overlay.pm:2717
+msgid "Link already exists"
+msgstr "此鏈結已存在"
+
+#: lib/RT/Ticket_Overlay.pm:2729
+msgid "Link could not be created"
+msgstr "無法新增鏈結"
+
+#: lib/RT/Ticket_Overlay.pm:2737 lib/RT/Ticket_Overlay.pm:2747
+#. ($TransString)
+msgid "Link created (%1)"
+msgstr "鏈結(%1)新增完畢"
+
+#: lib/RT/Ticket_Overlay.pm:2658
+#. ($TransString)
+msgid "Link deleted (%1)"
+msgstr "鏈結(%1)刪除完畢"
+
+#: lib/RT/Ticket_Overlay.pm:2664
+msgid "Link not found"
+msgstr "找不到鏈結"
+
+#: html/Ticket/ModifyLinks.html:24 html/Ticket/ModifyLinks.html:28
+#. ($Ticket->Id)
+msgid "Link ticket #%1"
+msgstr "鏈結申請單 #%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Link ticket %1"
+msgstr "鏈結申請單 %1"
+
+#: html/Ticket/Elements/Tabs:96
+msgid "Links"
+msgstr "鏈結"
+
+#: html/Edit/Users/Search.html:11
+msgid "List All Users"
+msgstr "列出所有用戶資料"
+
+#: html/Admin/Users/Modify.html:113 html/User/Prefs.html:84 html/Work/Preferences/Info:73
+msgid "Location"
+msgstr "位置"
+
+#: lib/RT.pm:162
+#. ($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
+msgid "LogToFile"
+msgstr "紀錄等級"
+
+#: html/Edit/Global/Basic/Top:54
+msgid "LogToFileNamed"
+msgstr "紀錄檔名"
+
+#: html/Elements/Header:57
+#. ("<b>".$session{'CurrentUser'}->Name."</b>")
+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
+msgid "Login"
+msgstr "登入"
+
+#: html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:17 html/Edit/Elements/104Top:32 html/Elements/Header:54
+msgid "Logout"
+msgstr "登出"
+
+#: NOT FOUND IN SOURCE
+msgid "Long-term contractor"
+msgstr "長期契約員工"
+
+#: html/Search/Bulk.html:85 html/Work/Search/Bulk.html:54
+msgid "Make Owner"
+msgstr "新增承辦人"
+
+#: html/Search/Bulk.html:109 html/Work/Search/Bulk.html:63
+msgid "Make Status"
+msgstr "新增現況"
+
+#: html/Search/Bulk.html:117 html/Work/Search/Bulk.html:75
+msgid "Make date Due"
+msgstr "新增到期日"
+
+#: html/Search/Bulk.html:119 html/Work/Search/Bulk.html:78
+msgid "Make date Resolved"
+msgstr "新增解決日期"
+
+#: html/Search/Bulk.html:113 html/Work/Search/Bulk.html:69
+msgid "Make date Started"
+msgstr "新增實際起始日期"
+
+#: html/Search/Bulk.html:111 html/Work/Search/Bulk.html:66
+msgid "Make date Starts"
+msgstr "新增應起始日期"
+
+#: html/Search/Bulk.html:115 html/Work/Search/Bulk.html:72
+msgid "Make date Told"
+msgstr "新增報告日期"
+
+#: html/Search/Bulk.html:105 html/Work/Search/Bulk.html:57
+msgid "Make priority"
+msgstr "新增優先順位"
+
+#: html/Search/Bulk.html:107 html/Work/Search/Bulk.html:60
+msgid "Make queue"
+msgstr "新增表單"
+
+#: html/Search/Bulk.html:103 html/Work/Search/Bulk.html:59
+msgid "Make subject"
+msgstr "新增主題"
+
+#: NOT FOUND IN SOURCE
+msgid "Male"
+msgstr "男"
+
+#: html/Admin/index.html:32
+msgid "Manage groups and group membership"
+msgstr "管理群組及所屬成員"
+
+#: html/Admin/index.html:38
+msgid "Manage properties and configuration which apply to all queues"
+msgstr "管理適用於所有表單的屬性與設定"
+
+#: html/Admin/index.html:35
+msgid "Manage queues and queue-specific properties"
+msgstr "管理各表單及相關屬性"
+
+#: html/Admin/index.html:29
+msgid "Manage users and passwords"
+msgstr "管理使用者與密碼"
+
+#: NOT FOUND IN SOURCE
+msgid "Manager"
+msgstr "經理"
+
+#: NOT FOUND IN SOURCE
+msgid "Mar"
+msgstr "三月"
+
+#: lib/RT/Date.pm:413
+msgid "Mar."
+msgstr "03"
+
+#: NOT FOUND IN SOURCE
+msgid "March"
+msgstr "三月"
+
+#: NOT FOUND IN SOURCE
+msgid "Marketing Department"
+msgstr "行銷部"
+
+#: NOT FOUND IN SOURCE
+msgid "May"
+msgstr "五月"
+
+#: lib/RT/Date.pm:415
+msgid "May."
+msgstr "05"
+
+#: lib/RT/Group_Overlay.pm:981
+msgid "Member added"
+msgstr "新增成員完畢"
+
+#: lib/RT/Group_Overlay.pm:1139
+msgid "Member deleted"
+msgstr "成員已刪除"
+
+#: lib/RT/Group_Overlay.pm:1143
+msgid "Member not deleted"
+msgstr "成員未被刪除"
+
+#: html/Elements/SelectLinkType:25
+msgid "Member of"
+msgstr "隸屬於"
+
+#: html/Work/Preferences/index.html:20
+msgid "Member since"
+msgstr "註冊日期"
+
+#: NOT FOUND IN SOURCE
+msgid "MemberOf"
+msgstr "隸屬於"
+
+#: html/Admin/Elements/GroupTabs:41 html/Admin/Elements/ModifyTemplateAsWorkflow:232 html/User/Elements/GroupTabs:41
+msgid "Members"
+msgstr "成員"
+
+#: lib/RT/Ticket_Overlay.pm:2904
+msgid "Merge Successful"
+msgstr "整合完畢"
+
+#: lib/RT/Ticket_Overlay.pm:2824
+msgid "Merge failed. Couldn't set EffectiveId"
+msgstr "整合失敗。無法設定 EffectiveId"
+
+#: html/Ticket/Elements/BulkLinks:26 html/Ticket/Elements/EditLinks:114 html/Work/Search/BulkLinks:2
+msgid "Merge into"
+msgstr "整合進"
+
+#: html/Search/Bulk.html:137 html/Ticket/Update.html:100
+msgid "Message"
+msgstr "訊息"
+
+#: NOT FOUND IN SOURCE
+msgid "Misc. Expense"
+msgstr "雜費"
+
+#: lib/RT/Interface/Web.pm:903 x:906
+msgid "Missing a primary key?: %1"
+msgstr "缺少主鍵值?(%1)"
+
+#: html/Admin/Users/Modify.html:168 html/User/Prefs.html:53 html/Work/Preferences/Info:36
+msgid "Mobile"
+msgstr "行動電話"
+
+#: html/Admin/Elements/ModifyUser:71
+msgid "MobilePhone"
+msgstr "行動電話"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "Modify Access Control List"
+msgstr "更改權限控制清單"
+
+#: html/Admin/Global/CustomFields.html:43 html/Admin/Global/index.html:50
+msgid "Modify Custom Fields which apply to all queues"
+msgstr "更改適用於所有表單的自訂欄位"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "Modify Scrip templates for this queue"
+msgstr "更改此表單的範本"
+
+#: lib/RT/Queue_Overlay.pm:75
+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 "更改範本 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify Workflow"
+msgstr "更改流程"
+
+#: html/Admin/Queues/CustomField.html:44
+#. ($QueueObj->Name())
+msgid "Modify a CustomField for queue %1"
+msgstr "更改 %1 表單內的自訂欄位"
+
+#: html/Admin/Global/CustomField.html:52
+msgid "Modify a CustomField which applies to all queues"
+msgstr "更改適用於所有表單的自訂欄位"
+
+#: html/Admin/Queues/Scrip.html:53
+#. ($QueueObj->Name)
+msgid "Modify a scrip for queue %1"
+msgstr "更改 %1 表單內的手續"
+
+#: html/Admin/Global/Scrip.html:47
+msgid "Modify a scrip which applies to all queues"
+msgstr "更改適用於所有表單的手續"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify dates for # %1"
+msgstr "更改 # %1 的日期"
+
+#: html/Ticket/ModifyDates.html:24 html/Ticket/ModifyDates.html:28
+#. ($TicketObj->Id)
+msgid "Modify dates for #%1"
+msgstr "更改 #%1 的日期"
+
+#: html/Ticket/ModifyDates.html:34
+#. ($TicketObj->Id)
+msgid "Modify dates for ticket # %1"
+msgstr "更改申請單 # %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 "更改全域設定的群組權限"
+
+#: html/Admin/Global/GroupRights.html:32
+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:24 html/Admin/Global/UserRights.html:27 html/Admin/Global/index.html:59
+msgid "Modify global user rights"
+msgstr "更改全域設定的使用者權限"
+
+#: html/Admin/Global/UserRights.html:32
+msgid "Modify global user rights."
+msgstr "更改全域設定的使用者權限。"
+
+#: lib/RT/Group_Overlay.pm:145
+msgid "Modify group metadata or delete group"
+msgstr "更改群組資料及刪除群組"
+
+#: html/Admin/Groups/GroupRights.html:24 html/Admin/Groups/GroupRights.html:28 html/Admin/Groups/GroupRights.html:34
+#. ($GroupObj->Name)
+msgid "Modify group rights for group %1"
+msgstr "更改 %1 的群組權限"
+
+#: html/Admin/Queues/GroupRights.html:24 html/Admin/Queues/GroupRights.html:28
+#. ($QueueObj->Name)
+msgid "Modify group rights for queue %1"
+msgstr "更改表單 %1 的群組權限"
+
+#: lib/RT/Group_Overlay.pm:147
+msgid "Modify membership roster for this group"
+msgstr "更改此群組的成員名單"
+
+#: lib/RT/System.pm:60
+msgid "Modify one's own RT account"
+msgstr "更改個人的帳號資訊"
+
+#: html/Admin/Queues/People.html:24 html/Admin/Queues/People.html:28
+#. ($QueueObj->Name)
+msgid "Modify people related to queue %1"
+msgstr "更改鏈結到表單 %1 的人員"
+
+#: html/Ticket/ModifyPeople.html:24 html/Ticket/ModifyPeople.html:28 html/Ticket/ModifyPeople.html:34
+#. ($Ticket->id)
+#. ($Ticket->Id)
+msgid "Modify people related to ticket #%1"
+msgstr "更改申請單 #%1 鏈結到的人員"
+
+#: html/Admin/Queues/Scrips.html:45
+#. ($QueueObj->Name)
+msgid "Modify scrips for queue %1"
+msgstr "更改表單 %1 的手續"
+
+#: html/Admin/Global/Scrips.html:43 html/Admin/Global/index.html:41
+msgid "Modify scrips which apply to all queues"
+msgstr "更改適用於所有表單的手續"
+
+#: html/Admin/Global/Template.html:24 html/Admin/Global/Template.html:29 html/Admin/Global/Template.html:80 html/Admin/Queues/Template.html:77
+#. (loc($TemplateObj->Name()))
+#. ($TemplateObj->id)
+msgid "Modify template %1"
+msgstr "更改範本 %1"
+
+#: html/Admin/Global/Templates.html:43
+msgid "Modify templates which apply to all queues"
+msgstr "更改適用於所有表單的範本"
+
+#: html/Admin/Groups/Modify.html:86 html/User/Groups/Modify.html:85
+#. ($Group->Name)
+msgid "Modify the group %1"
+msgstr "更改群組 %1"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "Modify the queue watchers"
+msgstr "更改表單視察員"
+
+#: html/Admin/Users/Modify.html:235
+#. ($UserObj->Name)
+msgid "Modify the user %1"
+msgstr "更改使用者 %1"
+
+#: html/Ticket/ModifyAll.html:36
+#. ($Ticket->Id)
+msgid "Modify ticket # %1"
+msgstr "更改申請單 # %1"
+
+#: html/Ticket/Modify.html:24 html/Ticket/Modify.html:27 html/Ticket/Modify.html:33
+#. ($TicketObj->Id)
+msgid "Modify ticket #%1"
+msgstr "更改申請單 # %1"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "Modify tickets"
+msgstr "更改申請單"
+
+#: html/Admin/Groups/UserRights.html:24 html/Admin/Groups/UserRights.html:28 html/Admin/Groups/UserRights.html:34
+#. ($GroupObj->Name)
+msgid "Modify user rights for group %1"
+msgstr "更改群組 %1 的使用者權限"
+
+#: html/Admin/Queues/UserRights.html:24 html/Admin/Queues/UserRights.html:28
+#. ($QueueObj->Name)
+msgid "Modify user rights for queue %1"
+msgstr "更改表單 %1 的使用者權限"
+
+#: NOT FOUND IN SOURCE
+msgid "Modify watchers for queue '%1'"
+msgstr "更改 '%1' 的視察員"
+
+#: html/Admin/Global/Workflow.html:25 html/Admin/Global/Workflow.html:30 html/Admin/Global/Workflow.html:81 html/Admin/Queues/Workflow.html:77
+#. (loc($WorkflowObj->Name()))
+#. ($WorkflowObj->id)
+msgid "Modify workflow %1"
+msgstr "更改流程 %1"
+
+#: html/Admin/Global/Workflows.html:44
+msgid "Modify workflows which apply to all queues"
+msgstr "更改適用於所有表單的流程"
+
+#: lib/RT/Queue_Overlay.pm:69
+msgid "ModifyACL"
+msgstr "更改權限清單"
+
+#: lib/RT/Group_Overlay.pm:148
+msgid "ModifyOwnMembership"
+msgstr "更改自己是否屬於某群組"
+
+#: lib/RT/Queue_Overlay.pm:70
+msgid "ModifyQueueWatchers"
+msgstr "更改表單視察員"
+
+#: lib/RT/Queue_Overlay.pm:75
+msgid "ModifyScrips"
+msgstr "更改手續"
+
+#: lib/RT/System.pm:60
+msgid "ModifySelf"
+msgstr "更改個人帳號"
+
+#: lib/RT/Queue_Overlay.pm:72
+msgid "ModifyTemplate"
+msgstr "更改範本"
+
+#: lib/RT/Queue_Overlay.pm:87
+msgid "ModifyTicket"
+msgstr "更改申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Mon"
+msgstr "星期一"
+
+#: lib/RT/Date.pm:388
+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"
+msgstr "關於 %1 的進一步資訊"
+
+#: NOT FOUND IN SOURCE
+msgid "Morning Shift"
+msgstr "早班"
+
+#: html/Edit/Elements/ListButtons:16
+msgid "Move All"
+msgstr "全移"
+
+#: html/Admin/Elements/EditCustomFields:60
+msgid "Move down"
+msgstr "下移"
+
+#: html/Admin/Elements/EditCustomFields:52
+msgid "Move up"
+msgstr "上移"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:26
+msgid "Multiple"
+msgstr "多重"
+
+#: lib/RT/User_Overlay.pm:238
+msgid "Must specify 'Name' attribute"
+msgstr "必須指定 'Name' 的屬性"
+
+#: html/SelfService/Elements/MyRequests:48
+#. ($friendly_status)
+msgid "My %1 tickets"
+msgstr "我的 %1 申請單"
+
+#: html/Work/Elements/Tab:37
+msgid "My Approvals"
+msgstr "表單簽核"
+
+#: html/Work/Elements/Tab:35
+msgid "My Requests"
+msgstr "表單申請追蹤"
+
+#: html/Work/Elements/Tab:39
+msgid "My Tickets"
+msgstr "表單處理"
+
+#: html/Approvals/index.html:24 html/Approvals/index.html:25
+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
+msgid "Name"
+msgstr "名稱"
+
+#: lib/RT/User_Overlay.pm:245
+msgid "Name in use"
+msgstr "帳號已有人使用"
+
+#: html/Edit/Users/Info:27
+msgid "Nationality"
+msgstr "國籍"
+
+#: NOT FOUND IN SOURCE
+msgid "Need approval from system administrator"
+msgstr "需先由系統管理員進行批准"
+
+#: html/Ticket/Elements/ShowDates:51
+msgid "Never"
+msgstr "從未更動"
+
+#: html/Elements/Quicksearch:29 html/Work/Elements/Quicksearch:15 html/Work/Tickets/Create.html:54
+msgid "New"
+msgstr "新建立"
+
+#: html/Admin/Elements/ModifyUser:31 html/Admin/Users/Modify.html:92 html/User/Prefs.html:64 html/Work/Preferences/Info:47
+msgid "New Password"
+msgstr "新的密碼"
+
+#: etc/initialdata.zh:341 etc/initialdata:317 etc/upgrade/2.1.71:16 html/Edit/Elements/CreateApprovalsQueue:21
+msgid "New Pending Approval"
+msgstr "新的待簽核事項"
+
+#: html/Ticket/Elements/EditLinks:110
+msgid "New Relationships"
+msgstr "新增關係"
+
+#: html/Work/Elements/Tab:33
+msgid "New Request"
+msgstr "表單申請"
+
+#: html/Ticket/Elements/Tabs:35
+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
+msgid "New custom field"
+msgstr "新增自訂欄位"
+
+#: html/Admin/Elements/GroupTabs:53 html/User/Elements/GroupTabs:51
+msgid "New group"
+msgstr "新增群組"
+
+#: html/SelfService/Prefs.html:31
+msgid "New password"
+msgstr "新的密碼"
+
+#: lib/RT/User_Overlay.pm:764
+msgid "New password notification sent"
+msgstr "送出新密碼通知"
+
+#: html/Admin/Elements/QueueTabs:69
+msgid "New queue"
+msgstr "新增表單"
+
+#: NOT FOUND IN SOURCE
+msgid "New request"
+msgstr "提出申請單"
+
+#: html/Admin/Elements/SelectRights:41
+msgid "New rights"
+msgstr "新增權限"
+
+#: html/Admin/Global/Scrip.html:39 html/Admin/Global/Scrips.html:38 html/Admin/Queues/Scrip.html:42 html/Admin/Queues/Scrips.html:54
+msgid "New scrip"
+msgstr "新增手續"
+
+#: html/Work/Search/index.html:62
+msgid "New search"
+msgstr "重新查詢"
+
+#: 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 "新增範本"
+
+#: html/SelfService/Elements/Tabs:47
+msgid "New ticket"
+msgstr "提出申請單"
+
+#: lib/RT/Ticket_Overlay.pm:2791
+msgid "New ticket doesn't exist"
+msgstr "沒有新申請單"
+
+#: html/Admin/Elements/UserTabs:51
+msgid "New user"
+msgstr "新增使用者"
+
+#: html/Admin/Elements/CreateUserCalled:25
+msgid "New user called"
+msgstr "新使用者名字"
+
+#: html/Admin/Queues/People.html:54 html/Ticket/Elements/EditPeople:28
+msgid "New watchers"
+msgstr "新視察員"
+
+#: html/Admin/Users/Prefs.html:41
+msgid "New window setting"
+msgstr "更新視窗設定"
+
+#: html/Admin/Global/Workflow.html:60 html/Admin/Global/Workflows.html:39 html/Admin/Queues/Workflow.html:57 html/Admin/Queues/Workflows.html:50
+msgid "New workflow"
+msgstr "新增流程"
+
+#: html/Ticket/Elements/Tabs:68
+msgid "Next"
+msgstr "下一項"
+
+#: html/Search/Listing.html:47 html/Work/Search/index.html:24
+msgid "Next page"
+msgstr "下一頁"
+
+#: html/Admin/Elements/ModifyUser:49
+msgid "NickName"
+msgstr "暱稱"
+
+#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:45 html/Work/Preferences/Info:26
+msgid "Nickname"
+msgstr "暱稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Night Shift"
+msgstr "小夜班"
+
+#: html/Edit/Global/Basic/Top:27
+msgid "No"
+msgstr "否"
+
+#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:104
+msgid "No CustomField"
+msgstr "無自訂欄位"
+
+#: html/Admin/Groups/GroupRights.html:83 html/Admin/Groups/UserRights.html:70
+msgid "No Group defined"
+msgstr "尚未定義群組"
+
+#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:67
+msgid "No Queue defined"
+msgstr "沒有定義好的表單"
+
+#: bin/rt-crontool:55
+msgid "No RT user found. Please consult your RT administrator.\\n"
+msgstr "找不到 RT 使用者。請向 RT 管理員查詢。\\n"
+
+#: html/Admin/Global/Template.html:78 html/Admin/Queues/Template.html:75
+msgid "No Template"
+msgstr "沒有範本"
+
+#: bin/rt-commit-handler:763
+msgid "No Ticket specified. Aborting ticket "
+msgstr "未指定申請單。退出申請單 "
+
+#: NOT FOUND IN SOURCE
+msgid "No Ticket specified. Aborting ticket modifications\\n\\n"
+msgstr "未指定申請單。退出申請單更改\\n\\n"
+
+#: html/Admin/Elements/ModifyWorkflow:237 html/Admin/Global/Workflow.html:79 html/Admin/Queues/Workflow.html:75
+msgid "No Workflow"
+msgstr "沒有流程"
+
+#: html/Approvals/Elements/Approve:45 html/Work/Approvals/Elements/Approve:35
+msgid "No action"
+msgstr "暫不處理"
+
+#: lib/RT/Interface/Web.pm:898 x:901
+msgid "No column specified"
+msgstr "未指定欄位"
+
+#: NOT FOUND IN SOURCE
+msgid "No command found\\n"
+msgstr "找不到命令"
+
+#: html/Elements/ViewUser:35 html/Ticket/Elements/ShowRequestor:44
+msgid "No comment entered about this user"
+msgstr "沒有對這名使用者的評論"
+
+#: lib/RT/Ticket_Overlay.pm:2202 lib/RT/Ticket_Overlay.pm:2270
+msgid "No correspondence attached"
+msgstr "沒有附上申請單回覆"
+
+#: lib/RT/Action/Generic.pm:149 lib/RT/Condition/Generic.pm:175 lib/RT/Search/ActiveTicketsInQueue.pm:55 lib/RT/Search/Generic.pm:112
+#. (ref $self)
+msgid "No description for %1"
+msgstr "沒有對 %1 的描述"
+
+#: lib/RT/Users_Overlay.pm:150
+msgid "No group specified"
+msgstr "未指定群組"
+
+#: lib/RT/User_Overlay.pm:982
+msgid "No password set"
+msgstr "沒有設定密碼"
+
+#: lib/RT/Queue_Overlay.pm:260
+msgid "No permission to create queues"
+msgstr "沒有新增表單的權限"
+
+#: lib/RT/Ticket_Overlay.pm:342
+#. ($QueueObj->Name)
+msgid "No permission to create tickets in the queue '%1'"
+msgstr "沒有在表單 '%1' 新增申請單的權限"
+
+#: lib/RT/User_Overlay.pm:211
+msgid "No permission to create users"
+msgstr "沒有新增使用者的權限"
+
+#: html/SelfService/Display.html:117
+msgid "No permission to display that ticket"
+msgstr "沒有顯示該申請單的權限"
+
+#: html/SelfService/Update.html:51
+msgid "No permission to view update ticket"
+msgstr "沒有檢視申請單更新的權限"
+
+#: lib/RT/Queue_Overlay.pm:675 lib/RT/Ticket_Overlay.pm:1487
+msgid "No principal specified"
+msgstr "未指定單位"
+
+#: html/Admin/Queues/People.html:153 html/Admin/Queues/People.html:163
+msgid "No principals selected."
+msgstr "未指定單位。"
+
+#: NOT FOUND IN SOURCE
+msgid "No protocol specified in %1"
+msgstr "%1 內未指定協定"
+
+#: html/Admin/Queues/index.html:34
+msgid "No queues matching search criteria found."
+msgstr "找不到符合查詢條件的表單。"
+
+#: html/Admin/Elements/SelectRights:80
+msgid "No rights found"
+msgstr "找不到權限"
+
+#: html/Admin/Elements/SelectRights:32
+msgid "No rights granted."
+msgstr "沒有選定權限"
+
+#: html/Search/Bulk.html:160 html/Work/Search/Bulk.html:117
+msgid "No search to operate on."
+msgstr "沒有要進行的查詢"
+
+#: NOT FOUND IN SOURCE
+msgid "No ticket id specified"
+msgstr "未指定申請單編號"
+
+#: lib/RT/Transaction_Overlay.pm:478 lib/RT/Transaction_Overlay.pm:516
+msgid "No transaction type specified"
+msgstr "未指定更動報告類別"
+
+#: NOT FOUND IN SOURCE
+msgid "No user or email address specified"
+msgstr "未指定使用者或電子郵件地址"
+
+#: html/Admin/Users/index.html:35
+msgid "No users matching search criteria found."
+msgstr "找不到符合查詢條件的使用者。"
+
+#: bin/rt-commit-handler:643
+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
+msgid "No value sent to _Set!\\n"
+msgstr "_Set 沒有收到任何值!\\n"
+
+#: html/Search/Elements/TicketRow:36 html/Work/Search/TicketRow:9
+msgid "Nobody"
+msgstr "沒有人"
+
+#: lib/RT/Interface/Web.pm:900 x:903
+msgid "Nonexistant field?"
+msgstr "欄位不存在?"
+
+#: NOT FOUND IN SOURCE
+msgid "Normal Users"
+msgstr "一般用戶群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Not configured to fetch the content from a %1 in %2"
+msgstr "未設定成從 %2 內擷取 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Not logged in"
+msgstr "尚未登入"
+
+#: html/Elements/Header:59
+msgid "Not logged in."
+msgstr "尚未登入"
+
+#: lib/RT/Date.pm:369
+msgid "Not set"
+msgstr "尚未設定"
+
+#: html/NoAuth/Reminder.html:26
+msgid "Not yet implemented."
+msgstr "尚未完工。"
+
+#: NOT FOUND IN SOURCE
+msgid "Not yet implemented...."
+msgstr "尚未完工..."
+
+#: html/Approvals/Elements/Approve:48 html/Work/Tickets/Create.html:143
+msgid "Notes"
+msgstr "備註"
+
+#: NOT FOUND IN SOURCE
+msgid "Notes:"
+msgstr "備註:"
+
+#: lib/RT/User_Overlay.pm:767
+msgid "Notification could not be sent"
+msgstr "無法送出通知"
+
+#: etc/initialdata.zh:111 etc/initialdata:93
+msgid "Notify AdminCcs"
+msgstr "通知管理員副本收件人"
+
+#: etc/initialdata.zh:107 etc/initialdata:89
+msgid "Notify AdminCcs as Comment"
+msgstr "以評論方式通知管理員副本收件人"
+
+#: etc/initialdata.zh:138 etc/initialdata:120
+msgid "Notify Other Recipients"
+msgstr "通知其他收件人"
+
+#: etc/initialdata.zh:134 etc/initialdata:116
+msgid "Notify Other Recipients as Comment"
+msgstr "以評論方式通知其他收件人"
+
+#: etc/initialdata.zh:103 etc/initialdata:85
+msgid "Notify Owner"
+msgstr "通知承辦人"
+
+#: etc/initialdata.zh:99 etc/initialdata:81
+msgid "Notify Owner as Comment"
+msgstr "以評論方式通知承辦人"
+
+#: etc/initialdata.zh:385 etc/initialdata:361
+msgid "Notify Owner of their rejected ticket"
+msgstr "通知承辦人申請單已駁回"
+
+#: etc/initialdata.zh:374 etc/initialdata:350
+msgid "Notify Owner of their ticket has been approved by all approvers"
+msgstr "通知承辦人申請單已完成全部簽核"
+
+#: etc/initialdata.zh:359 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
+msgid "Notify Owners and AdminCcs of new items pending their approval"
+msgstr "整理待簽核事項,通知承辦人及管理員副本收件人"
+
+#: etc/initialdata.zh:95 etc/initialdata:77
+msgid "Notify Requestors"
+msgstr "通知申請人"
+
+#: etc/initialdata.zh:121 etc/initialdata:103
+msgid "Notify Requestors and Ccs"
+msgstr "通知申請人及副本收件人"
+
+#: etc/initialdata.zh:116 etc/initialdata:98
+msgid "Notify Requestors and Ccs as Comment"
+msgstr "以評論方式通知申請人及副本收件人"
+
+#: etc/initialdata.zh:130 etc/initialdata:112
+msgid "Notify Requestors, Ccs and AdminCcs"
+msgstr "通知申請人、副本及管理員副本收件人"
+
+#: etc/initialdata.zh:126 etc/initialdata:108
+msgid "Notify Requestors, Ccs and AdminCcs as Comment"
+msgstr "以評論方式通知申請人、副本及管理員副本收件人"
+
+#: html/Work/Tickets/Cc:55
+msgid "Notify people:"
+msgstr "通知對象"
+
+#: NOT FOUND IN SOURCE
+msgid "Nov"
+msgstr "十一月"
+
+#: lib/RT/Date.pm:421
+msgid "Nov."
+msgstr "11"
+
+#: NOT FOUND IN SOURCE
+msgid "November"
+msgstr "十一月"
+
+#: html/Edit/Global/Basic/Top:74
+msgid "OIN104"
+msgstr "配合 104eHRMS 介面"
+
+#: html/Edit/Global/Workflow/Export.html:30 html/Work/Copyright.html:23
+msgid "OK"
+msgstr "確定"
+
+#: lib/RT/Record.pm:156
+msgid "Object could not be created"
+msgstr "無法新增物件"
+
+#: lib/RT/Record.pm:175
+msgid "Object created"
+msgstr "物件新增完畢"
+
+#: html/Edit/Users/Info:35
+msgid "Occupation Status"
+msgstr "在職狀態"
+
+#: NOT FOUND IN SOURCE
+msgid "Oct"
+msgstr "十月"
+
+#: lib/RT/Date.pm:420
+msgid "Oct."
+msgstr "10"
+
+#: NOT FOUND IN SOURCE
+msgid "October"
+msgstr "十月"
+
+#: html/Edit/Users/Info:32
+msgid "Office Phone"
+msgstr "辦公室電話"
+
+#: html/Elements/SelectDateRelation:34
+msgid "On"
+msgstr "等於"
+
+#: etc/initialdata.zh:173 etc/initialdata:155
+msgid "On Comment"
+msgstr "評論時"
+
+#: etc/initialdata.zh:166 etc/initialdata:148
+msgid "On Correspond"
+msgstr "回覆申請單時"
+
+#: etc/initialdata.zh:155 etc/initialdata:137
+msgid "On Create"
+msgstr "新增申請單時"
+
+#: etc/initialdata.zh:187 etc/initialdata:169
+msgid "On Owner Change"
+msgstr "承辦人改變時"
+
+#: etc/initialdata.zh:195 etc/initialdata:177
+msgid "On Queue Change"
+msgstr "表單改變時"
+
+#: etc/initialdata.zh:201 etc/initialdata:183
+msgid "On Resolve"
+msgstr "解決申請單時"
+
+#: etc/initialdata.zh:179 etc/initialdata:161
+msgid "On Status Change"
+msgstr "現況改變時"
+
+#: etc/initialdata.zh:160 etc/initialdata:142
+msgid "On Transaction"
+msgstr "發生更動時"
+
+#: html/Approvals/Elements/PendingMyApproval:49
+#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>")
+msgid "Only show approvals for requests created after %1"
+msgstr "僅顯示 %1 之後新增的申請單"
+
+#: html/Approvals/Elements/PendingMyApproval:47
+#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>")
+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
+msgid "Open"
+msgstr "開啟"
+
+#: html/Ticket/Elements/Tabs:135
+msgid "Open it"
+msgstr "開啟"
+
+#: html/SelfService/Elements/Tabs:41
+msgid "Open tickets"
+msgstr "開啟的申請單"
+
+#: html/Admin/Users/Prefs.html:40
+msgid "Open tickets (from listing) in a new window"
+msgstr "在新視窗開啟(列表的)申請單"
+
+#: html/Admin/Users/Prefs.html:39
+msgid "Open tickets (from listing) in another window"
+msgstr "在另一個視窗開啟(列表的)申請單"
+
+#: etc/initialdata.zh:150 etc/initialdata:132
+msgid "Open tickets on correspondence"
+msgstr "收到回覆時即開啟申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Opened Tickets"
+msgstr "已申請運行中表單"
+
+#: NOT FOUND IN SOURCE
+msgid "Opinion"
+msgstr "意見"
+
+#: html/Edit/Global/CustomField/Info:35
+msgid "Option Description"
+msgstr "選項描述"
+
+#: html/Edit/Global/CustomField/Info:29
+msgid "Option Name"
+msgstr "選項名稱"
+
+#: html/Search/Elements/PickRestriction:100 html/Work/Search/PickRestriction:81
+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
+msgid "Organization"
+msgstr "組織名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Organization:"
+msgstr "組織:"
+
+#: html/Approvals/Elements/Approve:32
+#. ($approving->Id, $approving->Subject)
+msgid "Originating ticket: #%1"
+msgstr "原申請單:#%1"
+
+#: html/Edit/Elements/PickUsers:109 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
+msgid "Over time, priority moves toward"
+msgstr "優先順位隨時間增加調整為"
+
+#: NOT FOUND IN SOURCE
+msgid "Override current custom fields with fields from %1"
+msgstr "以 %1 表單的自訂欄位取代現有欄位"
+
+#: html/Admin/Elements/CheckOverrideGlobalACL:25
+msgid "Override global rights"
+msgstr "取代全域權限"
+
+#: html/Admin/Elements/CheckOverrideGlobalACL:34
+#. (loc_fuzzy($msg))
+msgid "OverrideGlobalACL status %1"
+msgstr "取代全域權限 %1"
+
+#: html/Work/Elements/Tab:31
+msgid "Overview"
+msgstr "總覽"
+
+#: lib/RT/Queue_Overlay.pm:86
+msgid "Own tickets"
+msgstr "承辦申請單"
+
+#: lib/RT/Queue_Overlay.pm:86
+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
+msgid "Owner"
+msgstr "承辦人"
+
+#: NOT FOUND IN SOURCE
+msgid "Owner changed from %1 to %2"
+msgstr "承辦人已從 %1 改為 %2"
+
+#: lib/RT/Transaction_Overlay.pm:582
+#. ($Old->Name , $New->Name)
+msgid "Owner forcibly changed from %1 to %2"
+msgstr "強制將承辦人從 %1 改為 %2"
+
+#: html/Search/Elements/PickRestriction:30 html/Work/Search/PickRestriction:10
+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
+msgid "Owner's Phone"
+msgstr "承辦人電話"
+
+#: html/Edit/Elements/Page:39
+msgid "Page"
+msgstr " "
+
+#: html/Admin/Users/Modify.html:173 html/User/Prefs.html:55 html/Work/Preferences/Info:38
+msgid "Pager"
+msgstr "呼叫器"
+
+#: html/Admin/Elements/ModifyUser:73
+msgid "PagerPhone"
+msgstr "呼叫器號碼"
+
+#: html/Edit/Global/Workflow/Action:81 html/Edit/Global/Workflow/Condition:66
+msgid "Parameter"
+msgstr "呼叫參數"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:225
+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
+msgid "Parents"
+msgstr "母申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Park Space"
+msgstr "停車位申請"
+
+#: html/Elements/Login:52 html/User/Prefs.html:60 html/Work/Preferences/Info:44
+msgid "Password"
+msgstr "密碼"
+
+#: html/NoAuth/Reminder.html:24
+msgid "Password Reminder"
+msgstr "密碼提示"
+
+#: lib/RT/User_Overlay.pm:228 lib/RT/User_Overlay.pm:985
+msgid "Password too short"
+msgstr "密碼太短"
+
+#: html/Admin/Users/Modify.html:290 html/User/Prefs.html:171 html/Work/Preferences/Info:167
+#. (loc_fuzzy($msg))
+msgid "Password: %1"
+msgstr "密碼:%1"
+
+#: html/Admin/Users/Modify.html:292
+msgid "Passwords do not match."
+msgstr "密碼確認失敗。"
+
+#: html/User/Prefs.html:173 html/Work/Preferences/Info:169
+msgid "Passwords do not match. Your password has not been changed"
+msgstr "密碼確認失敗。您的密碼並未改變。"
+
+#: NOT FOUND IN SOURCE
+msgid "Pelase select a queue"
+msgstr "請選擇表單名稱"
+
+#: NOT FOUND IN SOURCE
+msgid "Pending Approval"
+msgstr "等待簽核"
+
+#: html/Ticket/Elements/ShowSummary:44 html/Ticket/Elements/Tabs:95 html/Ticket/ModifyAll.html:50
+msgid "People"
+msgstr "人員"
+
+#: NOT FOUND IN SOURCE
+msgid "People with Queue Rights"
+msgstr "擁有表單權限人員"
+
+#: etc/initialdata.zh: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: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
+msgid "Permission Denied"
+msgstr "權限不足"
+
+#: html/Edit/Rights/index.html:3
+msgid "Permission Settings"
+msgstr "權限設定"
+
+#: NOT FOUND IN SOURCE
+msgid "Permitted Queues:"
+msgstr "擁有權限表單列表:"
+
+#: NOT FOUND IN SOURCE
+msgid "Personal"
+msgstr "代理人群組"
+
+#: html/User/Elements/Tabs:34
+msgid "Personal Groups"
+msgstr "代理人群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Personal Todo"
+msgstr "私人待辦事項"
+
+#: html/User/Groups/index.html:29 html/User/Groups/index.html:39
+msgid "Personal groups"
+msgstr "代理人群組"
+
+#: html/User/Elements/DelegateRights:36
+msgid "Personal groups:"
+msgstr "代理人群組:"
+
+#: html/Work/Preferences/Info:24
+msgid "PersonalHomepage"
+msgstr "個人首頁"
+
+#: NOT FOUND IN SOURCE
+msgid "Phone"
+msgstr "電話"
+
+#: html/Work/Delegates/Info:90 html/Work/Overview/Info:72
+msgid "Phone number"
+msgstr "電話號碼"
+
+#: html/Admin/Users/Modify.html:155 html/User/Prefs.html:48 html/Work/Preferences/Info:30
+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
+msgid "Pick"
+msgstr "挑選"
+
+#: NOT FOUND IN SOURCE
+msgid "Place of Departure"
+msgstr "出發地點"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Please Select"
+msgstr "請選擇"
+
+#: html/Edit/Elements/104Buttons:30
+msgid "Please check items to be deleted first."
+msgstr "請先選中要刪除的對象"
+
+#: NOT FOUND IN SOURCE
+msgid "Please select a group"
+msgstr "請選擇群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Please select a queue's workflow"
+msgstr "請選擇表單流程"
+
+#: NOT FOUND IN SOURCE
+msgid "Please select role"
+msgstr "請選擇角色"
+
+#: NOT FOUND IN SOURCE
+msgid "Policy"
+msgstr "經營規章"
+
+#: NOT FOUND IN SOURCE
+msgid "Position"
+msgstr "職務"
+
+#: html/Edit/Users/Info:42
+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
+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
+msgid "Position Number"
+msgstr "職務代碼"
+
+#: html/Edit/Users/Info:43
+msgid "Position Rank"
+msgstr "職級"
+
+#: NOT FOUND IN SOURCE
+msgid "Pref"
+msgstr "偏好"
+
+#: 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 "偏好"
+
+#: NOT FOUND IN SOURCE
+msgid "Prefs"
+msgstr "個人資訊"
+
+#: lib/RT/Action/Generic.pm:159
+msgid "Prepare Stubbed"
+msgstr "預備動作完畢"
+
+#: html/Ticket/Elements/Tabs:60
+msgid "Prev"
+msgstr "上一項"
+
+#: html/Search/Listing.html:43 html/Work/Search/index.html:20
+msgid "Previous page"
+msgstr "前一頁"
+
+#: NOT FOUND IN SOURCE
+msgid "Pri"
+msgstr "優先順位"
+
+#: lib/RT/ACE_Overlay.pm:132 lib/RT/ACE_Overlay.pm:207 lib/RT/ACE_Overlay.pm:551
+#. ($args{'PrincipalId'})
+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
+msgid "Priority"
+msgstr "優先順位"
+
+#: html/Admin/Elements/ModifyQueue:50 html/Admin/Queues/Modify.html:64
+msgid "Priority starts at"
+msgstr "優先順位起始值"
+
+#: etc/initialdata.zh:43 etc/initialdata:25
+msgid "Privileged"
+msgstr "內部成員"
+
+#: html/Admin/Users/Modify.html:270 html/User/Prefs.html:162 html/Work/Preferences/Info:158
+#. (loc_fuzzy($msg))
+msgid "Privileged status: %1"
+msgstr "內部成員狀態:%1"
+
+#: html/Admin/Users/index.html:61
+msgid "Privileged users"
+msgstr "內部成員"
+
+#: html/Work/Elements/SelectSearch:16
+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
+msgid "Pseudogroup for internal use"
+msgstr "內部用的虛擬群組"
+
+#: html/Work/Preferences/Info:68
+msgid "Public Info"
+msgstr "公開資訊"
+
+#: html/Work/Elements/104Header:88
+msgid "Public Service"
+msgstr "公共事務區"
+
+#: 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
+msgid "Queue"
+msgstr "表單"
+
+#: html/Admin/Queues/CustomField.html:41 html/Admin/Queues/Scrip.html:49 html/Admin/Queues/Scrips.html:47 html/Admin/Queues/Templates.html:43 html/Admin/Queues/Workflows.html:44
+#. ($Queue)
+#. ($id)
+msgid "Queue %1 not found"
+msgstr "找不到表單 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue '%1' not found\\n"
+msgstr "找不到表單 '%1'\\n"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Queue Owner"
+msgstr "業務承辦人"
+
+#: html/Edit/Queues/Basic/Top:35
+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
+msgid "Queue Rights"
+msgstr "表單權限"
+
+#: NOT FOUND IN SOURCE
+msgid "Queue Scrips"
+msgstr "表單手續"
+
+#: html/Edit/Elements/Tab:38
+msgid "Queue Setup"
+msgstr "表單設定"
+
+#: lib/RT/Queue_Overlay.pm:264
+msgid "Queue already exists"
+msgstr "表單已存在"
+
+#: lib/RT/Queue_Overlay.pm:273 lib/RT/Queue_Overlay.pm:279
+msgid "Queue could not be created"
+msgstr "無法新增表單"
+
+#: html/Edit/Queues/autohandler:8 html/Ticket/Create.html:204 html/Work/Tickets/Create.html:185
+msgid "Queue could not be loaded."
+msgstr "無法載入表單"
+
+#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:283
+msgid "Queue created"
+msgstr "表單新增完畢"
+
+#: html/Admin/Elements/ModifyWorkflow:32
+msgid "Queue is not specified."
+msgstr "未指定表單。"
+
+#: html/SelfService/Display.html:70 lib/RT/CustomField_Overlay.pm:97
+msgid "Queue not found"
+msgstr "找不到表單"
+
+#: html/Admin/Elements/Tabs:37 html/Admin/index.html:34
+msgid "Queues"
+msgstr "表單"
+
+#: html/Work/Elements/Quicksearch:10
+msgid "Quick Search"
+msgstr "表單現況"
+
+#: html/Elements/Quicksearch:24
+msgid "Quick search"
+msgstr "表單一覽"
+
+#: html/Elements/Login:44
+#. ($RT::VERSION)
+msgid "RT %1"
+msgstr "RT %1"
+
+#: docs/design_docs/string-extraction-guide.txt:70
+#. ($RT::VERSION, $RT::rtname)
+msgid "RT %1 for %2"
+msgstr "%2:RT %1 版"
+
+#: html/Elements/Footer:32
+#. ($RT::VERSION)
+msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>."
+msgstr "RT %1 版,<a href=\"http://bestpractical.com\">Best Practical Solutions 公司</a>出品。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1。版權所有 1996-%1 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "RT %1. Copyright 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+msgstr "RT %1。版權所有 1996-2002 Jesse Vincent <jesse\\@bestpractical.com>\\n"
+
+#: html/Admin/index.html:24 html/Admin/index.html:25
+msgid "RT Administration"
+msgstr "RT 管理頁面"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Authentication error."
+msgstr "RT 認證錯誤。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Bounce: %1"
+msgstr "RT 退信:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Configuration error"
+msgstr "RT 設定錯誤"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Critical error. Message not recorded!"
+msgstr "RT 致命錯誤。訊息未被紀錄。"
+
+#: html/Elements/Error:41 html/SelfService/Error.html:40
+msgid "RT Error"
+msgstr "RT 錯誤"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Received mail (%1) from itself."
+msgstr "RT 收到從自己寄出的郵件 (%1)。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Recieved mail (%1) from itself."
+msgstr "RT 收到從自己寄出的郵件 (%1)。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT Self Service / Closed Tickets"
+msgstr "RT 自助服務/已解決的申請單"
+
+#: html/index.html:24 html/index.html:27
+msgid "RT at a glance"
+msgstr "RT 一覽"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't authenticate you"
+msgstr "RT 無法認證你"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find requestor via its external database lookup"
+msgstr "RT 無法從外部資料庫查詢找到申請人資訊"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't find the queue: %1"
+msgstr "RT 找不到表單:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "RT couldn't validate this PGP signature. \\n"
+msgstr "RT 無法確認這個 PGP 簽章。\\n"
+
+#: html/Edit/Elements/104Header:7 html/Edit/Elements/104Top:20 html/Elements/PageLayout:85 html/Work/Elements/104Header:7
+#. ($RT::rtname)
+msgid "RT for %1"
+msgstr "%1 專用流程系統"
+
+#: NOT FOUND IN SOURCE
+msgid "RT for %1: %2"
+msgstr "%1 專用 RT 系統:%2"
+
+#: NOT FOUND IN SOURCE
+msgid "RT has proccessed your commands"
+msgstr "RT 已執行您的命令"
+
+#: html/Elements/Login:94
+#. ('2003')
+msgid "RT is &copy; Copyright 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>"
+msgstr "RT 版權所有 1996-%1 Jesse Vincent &lt;jesse@bestpractical.com&gt;。<br>本軟體依 <a href=\"http://www.gnu.org/copyleft/gpl.html\">GNU 通用公共授權第二版</a> 散佈。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT thinks this message may be a bounce"
+msgstr "RT 認為這可能是退信"
+
+#: NOT FOUND IN SOURCE
+msgid "RT will process this message as if it were unsigned.\\n"
+msgstr "RT 以未簽章方式處理這封郵件。\\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 的電子郵件命令模式須要 PGP 認證。您可能沒有簽章,或是您的簽章無法辨識。"
+
+#: NOT FOUND IN SOURCE
+msgid "RT::Queue-Role"
+msgstr "表單運行角色"
+
+#: NOT FOUND IN SOURCE
+msgid "RT::System-Role"
+msgstr "系統運行角色"
+
+#: NOT FOUND IN SOURCE
+msgid "RT::Ticket-Role"
+msgstr "申請單運行角色"
+
+#: html/Work/Tickets/Elements/ShowTransaction:11
+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
+msgid "Real Name"
+msgstr "真實姓名"
+
+#: html/Admin/Elements/ModifyUser:47
+msgid "RealName"
+msgstr "真實姓名"
+
+#: html/Work/Approvals/Display.html:27 html/Work/Tickets/Update.html:85
+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
+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
+msgid "Refers to"
+msgstr "參考"
+
+#: NOT FOUND IN SOURCE
+msgid "RefersTo"
+msgstr "參考"
+
+#: NOT FOUND IN SOURCE
+msgid "Refine"
+msgstr "在結果範圍內查詢"
+
+#: html/Search/Elements/PickRestriction:26 html/Work/Search/PickRestriction:7
+msgid "Refine search"
+msgstr "調整查詢條件"
+
+#: html/Work/Overview/index.html:12
+msgid "Refresh"
+msgstr "更新"
+
+#: html/Elements/Refresh:35
+#. ($value/60)
+msgid "Refresh this page every %1 minutes."
+msgstr "每 %1 分鐘更新頁面"
+
+#: html/Ticket/Create.html:173 html/Ticket/Elements/ShowSummary:61 html/Ticket/ModifyAll.html:56
+msgid "Relationships"
+msgstr "關係"
+
+#: html/Edit/Elements/ListButtons:13
+msgid "Remove"
+msgstr "移除"
+
+#: html/Search/Bulk.html:97 html/Work/Search/Bulk.html:77
+msgid "Remove AdminCc"
+msgstr "移除管理員副本"
+
+#: html/Search/Bulk.html:93 html/Work/Search/Bulk.html:71
+msgid "Remove Cc"
+msgstr "移除副本"
+
+#: html/Search/Bulk.html:89 html/Work/Search/Bulk.html:65
+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
+msgid "Reply"
+msgstr "回覆"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "Reply to tickets"
+msgstr "對申請單進行回覆"
+
+#: lib/RT/Queue_Overlay.pm:84
+msgid "ReplyToTicket"
+msgstr "回覆申請單"
+
+#: html/Edit/Users/Info:45
+msgid "Report to Duty"
+msgstr "上下班刷卡"
+
+#: html/Edit/Users/Info:33
+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
+msgid "Requestor"
+msgstr "申請人"
+
+#: html/Edit/Global/Workflow/Owner.html:44
+msgid "Requestor Group's"
+msgstr "申請人所屬群組之"
+
+#: html/Search/Elements/PickRestriction:37 html/Work/Search/PickRestriction:17
+msgid "Requestor email address"
+msgstr "申請人電子郵件信箱位址"
+
+#: html/Edit/Global/Workflow/Owner.html:28
+msgid "Requestor's"
+msgstr "申請人所屬之第上"
+
+#: html/Work/Elements/List:23
+msgid "Requestor's Phone"
+msgstr "申請人電話"
+
+#: NOT FOUND IN SOURCE
+msgid "Requestor(s)"
+msgstr "申請人"
+
+#: NOT FOUND IN SOURCE
+msgid "RequestorAddresses"
+msgstr "申請人地址"
+
+#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30
+msgid "Requestors"
+msgstr "申請人"
+
+#: html/Admin/Elements/ModifyQueue:60 html/Admin/Queues/Modify.html:74
+msgid "Requests should be due in"
+msgstr "申請單處理期限"
+
+#: html/Elements/Submit:61
+msgid "Reset"
+msgstr "重設"
+
+#: html/Admin/Users/Modify.html:158 html/User/Prefs.html:49 html/Work/Preferences/Info:32
+msgid "Residence"
+msgstr "住處"
+
+#: NOT FOUND IN SOURCE
+msgid "Resolution"
+msgstr "解決狀態"
+
+#: html/Ticket/Elements/Tabs:131 html/Work/Tickets/Display.html:34
+msgid "Resolve"
+msgstr "解決"
+
+#: html/Ticket/Update.html:136 html/Work/Tickets/Update.html:120
+#. ($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
+msgid "Resolved"
+msgstr "已解決"
+
+#: html/Search/Bulk.html:132 html/Ticket/ModifyAll.html:72 html/Ticket/Update.html:71 html/Work/Search/Bulk.html:84 html/Work/Tickets/Update.html:38
+msgid "Response to requestors"
+msgstr "回覆申請人"
+
+#: html/Edit/Users/Info:44
+msgid "Responsibility Type"
+msgstr "責任區分"
+
+#: html/Elements/ListActions:25
+msgid "Results"
+msgstr "結果"
+
+#: html/Search/Elements/PickRestriction:104 html/Work/Search/PickRestriction:84
+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
+msgid "Retype Password"
+msgstr "再次輸入密碼"
+
+#: NOT FOUND IN SOURCE
+msgid "Right %1 not found for %2  %3 in scope %4 (%5)\\n"
+msgstr "在 %4 (%5) 的範圍內找不到 %2 %3 的 %1 權限\\n"
+
+#: lib/RT/ACE_Overlay.pm:612
+msgid "Right Delegated"
+msgstr "權限代理完畢"
+
+#: lib/RT/ACE_Overlay.pm:302
+msgid "Right Granted"
+msgstr "權限設定完畢"
+
+#: lib/RT/ACE_Overlay.pm:160
+msgid "Right Loaded"
+msgstr "權限載入完畢"
+
+#: lib/RT/ACE_Overlay.pm:677 lib/RT/ACE_Overlay.pm:692
+msgid "Right could not be revoked"
+msgstr "無法撤消權限"
+
+#: html/User/Delegation.html:63
+msgid "Right not found"
+msgstr "找不到權限"
+
+#: lib/RT/ACE_Overlay.pm:542 lib/RT/ACE_Overlay.pm:637
+msgid "Right not loaded."
+msgstr "權限並未載入。"
+
+#: lib/RT/ACE_Overlay.pm:688
+msgid "Right revoked"
+msgstr "權限撤消完畢"
+
+#: html/Admin/Elements/UserTabs:40
+msgid "Rights"
+msgstr "權限及代理人"
+
+#: lib/RT/Interface/Web.pm:794 x:797
+#. ($object_type)
+msgid "Rights could not be granted for %1"
+msgstr "無法將權限賦予 %1"
+
+#: lib/RT/Interface/Web.pm:827 x:830
+#. ($object_type)
+msgid "Rights could not be revoked for %1"
+msgstr "無法撤消 %1 的權限"
+
+#: html/Edit/Groups/Member:55 html/Edit/Groups/Members/List:10
+msgid "Role Members"
+msgstr "角色成員"
+
+#: html/Edit/Groups/Member:37 html/Edit/Groups/Members/Add.html:13 html/Edit/Groups/Members/List:7 html/Edit/Groups/Roles/List:4 html/Edit/Groups/Roles/Top:7
+msgid "Role Name"
+msgstr "角色名稱"
+
+#: html/Admin/Global/GroupRights.html:50 html/Admin/Queues/GroupRights.html:52 html/Edit/Global/Workflow/Owner.html:55 html/Edit/Global/Workflow/Owner.html:81 html/Edit/Groups/Member:24
+msgid "Roles"
+msgstr "角色"
+
+#: NOT FOUND IN SOURCE
+msgid "RootApproval"
+msgstr "交由系統管理員簽核"
+
+#: html/Edit/Global/Workflow/Action:27
+msgid "Run Approval"
+msgstr "簽核執行"
+
+#: html/Edit/Global/Basic/Top:72
+msgid "SMTPDebug"
+msgstr "SMTP 偵錯紀錄"
+
+#: html/Edit/Global/Basic/Top:58
+msgid "SMTPFrom"
+msgstr "SMTP 寄件位址"
+
+#: html/Edit/Global/Basic/Top:56
+msgid "SMTPServer"
+msgstr "SMTP 伺服器"
+
+#: NOT FOUND IN SOURCE
+msgid "Sat"
+msgstr "星期六"
+
+#: lib/RT/Date.pm:393
+msgid "Sat."
+msgstr "星期六"
+
+#: html/Edit/Elements/104Buttons:72 html/Work/Preferences/index.html:35
+msgid "Save"
+msgstr "儲存"
+
+#: 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 "儲存更改"
+
+#: NOT FOUND IN SOURCE
+msgid "Save changes"
+msgstr "儲存更改"
+
+#: html/Admin/Global/Scrip.html:48 html/Admin/Queues/Scrip.html:54
+#. ($QueueObj->id)
+#. ($ARGS{'id'})
+msgid "Scrip #%1"
+msgstr "手續 #%1"
+
+#: html/Edit/Global/Scrip/List:9 html/Edit/Global/Scrip/Top:41
+msgid "Scrip Action"
+msgstr "訊息通知動作"
+
+#: html/Edit/Global/Scrip/List:8 html/Edit/Global/Scrip/Top:15
+msgid "Scrip Condition"
+msgstr "訊息通知條件"
+
+#: lib/RT/Scrip_Overlay.pm:175
+msgid "Scrip Created"
+msgstr "手續新增完畢"
+
+#: html/Edit/Global/Scrip/List:7 html/Edit/Global/Scrip/Top:9
+msgid "Scrip Name"
+msgstr "訊息名稱"
+
+#: html/Admin/Elements/EditScrips:83
+msgid "Scrip deleted"
+msgstr "手續刪除完畢"
+
+#: html/Admin/Elements/QueueTabs:45 html/Admin/Elements/SystemTabs:32 html/Admin/Global/index.html:40
+msgid "Scrips"
+msgstr "手續"
+
+#: html/Edit/Global/autohandler:9 html/Edit/Queues/autohandler:20
+msgid "Scrips "
+msgstr "訊息通知"
+
+#: NOT FOUND IN SOURCE
+msgid "Scrips for %1\\n"
+msgstr "%1 的手續\\n"
+
+#: html/Admin/Queues/Scrips.html:33
+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
+msgid "Search"
+msgstr "查詢"
+
+#: NOT FOUND IN SOURCE
+msgid "Search Criteria"
+msgstr "查詢條件"
+
+#: html/Approvals/Elements/PendingMyApproval:38
+msgid "Search for approvals"
+msgstr "簽核單查詢"
+
+#: html/Edit/Global/Workflow/Owner.html:31
+msgid "Second-"
+msgstr "二"
+
+#: html/Edit/Users/Info:40
+msgid "Second-level Users"
+msgstr "二階主管員工"
+
+#: bin/rt-crontool:187
+msgid "Security:"
+msgstr "安全性:"
+
+#: lib/RT/Queue_Overlay.pm:66
+msgid "SeeQueue"
+msgstr "查閱表單"
+
+#: html/Edit/Elements/ListButtons:10
+msgid "Select All"
+msgstr "全選"
+
+#: html/Admin/Groups/index.html:39
+msgid "Select a group"
+msgstr "選擇群組"
+
+#: NOT FOUND IN SOURCE
+msgid "Select a queue"
+msgstr "選擇表單"
+
+#: html/Work/Queues/Select.html:8
+msgid "Select a queue to link to"
+msgstr "請選擇欲連結表單"
+
+#: html/Admin/Users/index.html:24 html/Admin/Users/index.html:27
+msgid "Select a user"
+msgstr "選擇使用者"
+
+#: html/Admin/Global/CustomField.html:37 html/Admin/Global/CustomFields.html:35
+msgid "Select custom field"
+msgstr "選擇自訂欄位"
+
+#: html/Admin/Elements/GroupTabs:51 html/User/Elements/GroupTabs:49
+msgid "Select group"
+msgstr "選擇群組"
+
+#: lib/RT/CustomField_Overlay.pm:421
+msgid "Select multiple values"
+msgstr "選擇多重項目"
+
+#: lib/RT/CustomField_Overlay.pm:418
+msgid "Select one value"
+msgstr "選擇單一項目"
+
+#: html/Admin/Elements/QueueTabs:66
+msgid "Select queue"
+msgstr "選擇表單"
+
+#: html/Admin/Global/Scrip.html:36 html/Admin/Global/Scrips.html:35 html/Admin/Queues/Scrip.html:39 html/Admin/Queues/Scrips.html:51
+msgid "Select scrip"
+msgstr "選擇手續"
+
+#: 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 "選擇範本"
+
+#: html/Admin/Elements/UserTabs:48
+msgid "Select user"
+msgstr "選擇使用者"
+
+#: html/Admin/Global/Workflow.html:57 html/Admin/Global/Workflows.html:36 html/Admin/Queues/Workflow.html:54 html/Admin/Queues/Workflows.html:47
+msgid "Select workflow"
+msgstr "選擇流程"
+
+#: NOT FOUND IN SOURCE
+msgid "SelectExternal"
+msgstr "系統選項"
+
+#: lib/RT/CustomField_Overlay.pm:35
+msgid "SelectMultiple"
+msgstr "多重選項"
+
+#: lib/RT/CustomField_Overlay.pm:34
+msgid "SelectSingle"
+msgstr "單一選項"
+
+#: html/Edit/Elements/PickUsers:85 html/Edit/Users/Add.html:78
+msgid "Selected users:"
+msgstr "新增對象:"
+
+#: NOT FOUND IN SOURCE
+msgid "Self Service"
+msgstr "自助服務"
+
+#: etc/initialdata.zh:131 etc/initialdata:113
+msgid "Send mail to all watchers"
+msgstr "寄信給所有視察員"
+
+#: etc/initialdata.zh:127 etc/initialdata:109
+msgid "Send mail to all watchers as a \"comment\""
+msgstr "以評論方式寄信給所有視察員"
+
+#: etc/initialdata.zh:122 etc/initialdata:104
+msgid "Send mail to requestors and Ccs"
+msgstr "寄信給申請人及副本收件人"
+
+#: etc/initialdata.zh:117 etc/initialdata:99
+msgid "Send mail to requestors and Ccs as a comment"
+msgstr "以評論方式寄信給申請人及副本收件人"
+
+#: etc/initialdata.zh:96 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
+msgid "Sends mail to explicitly listed Ccs and Bccs"
+msgstr "寄信給特定的副本及密件副本收件人"
+
+#: etc/initialdata.zh:112 etc/initialdata:94
+msgid "Sends mail to the administrative Ccs"
+msgstr "寄信給管理員副本收件人"
+
+#: etc/initialdata.zh:108 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
+msgid "Sends mail to the owner"
+msgstr "寄信給申請人"
+
+#: NOT FOUND IN SOURCE
+msgid "Sep"
+msgstr "九月"
+
+#: lib/RT/Date.pm:419
+msgid "Sep."
+msgstr "09"
+
+#: NOT FOUND IN SOURCE
+msgid "September"
+msgstr "九月"
+
+#: html/Edit/Users/Info:38
+msgid "Shift Type"
+msgstr "班別屬性"
+
+#: NOT FOUND IN SOURCE
+msgid "Show Results"
+msgstr "顯示結果"
+
+#: html/Approvals/Elements/PendingMyApproval:43
+msgid "Show approved requests"
+msgstr "顯示已批准的簽核單"
+
+#: html/Ticket/Create.html:143 html/Ticket/Create.html:33
+msgid "Show basics"
+msgstr "顯示基本資訊"
+
+#: html/Approvals/Elements/PendingMyApproval:44
+msgid "Show denied requests"
+msgstr "顯示已駁回的簽核單"
+
+#: html/Ticket/Create.html:143 html/Ticket/Create.html:33
+msgid "Show details"
+msgstr "顯示細節"
+
+#: html/Approvals/Elements/PendingMyApproval:42
+msgid "Show pending requests"
+msgstr "顯示待處理的簽核單"
+
+#: html/Approvals/Elements/PendingMyApproval:45
+msgid "Show requests awaiting other approvals"
+msgstr "顯示尚待他人批准的簽核單"
+
+#: lib/RT/Queue_Overlay.pm:80
+msgid "Show ticket private commentary"
+msgstr "顯示申請單內的私人評論"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "Show ticket summaries"
+msgstr "顯示申請單摘要"
+
+#: lib/RT/Queue_Overlay.pm:68
+msgid "ShowACL"
+msgstr "顯示權限清單"
+
+#: lib/RT/Queue_Overlay.pm:77
+msgid "ShowScrips"
+msgstr "顯示手續"
+
+#: lib/RT/Queue_Overlay.pm:74
+msgid "ShowTemplate"
+msgstr "顯示範本"
+
+#: lib/RT/Queue_Overlay.pm:78
+msgid "ShowTicket"
+msgstr "顯示申請單"
+
+#: lib/RT/Queue_Overlay.pm:80
+msgid "ShowTicketComments"
+msgstr "顯示申請單的評論"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Sign up as a ticket Requestor or ticket or queue Cc"
+msgstr "登記成為申請人或副本收件人"
+
+#: lib/RT/Queue_Overlay.pm:82
+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
+msgid "Signature"
+msgstr "簽名檔"
+
+#: NOT FOUND IN SOURCE
+msgid "Signed in as %1"
+msgstr "使用者:%1"
+
+#: html/Admin/Elements/SelectSingleOrMultiple:25
+msgid "Single"
+msgstr "單一"
+
+#: html/Edit/Elements/104Top:21 html/Elements/Header:50
+msgid "Skip Menu"
+msgstr "略過選單"
+
+#: html/Admin/Elements/AddCustomFieldValue:27
+msgid "Sort"
+msgstr "順序"
+
+#: NOT FOUND IN SOURCE
+msgid "Sort key"
+msgstr "排序方式"
+
+#: html/Search/Elements/PickRestriction:108 html/Work/Search/PickRestriction:89
+msgid "Sort results by"
+msgstr "結果排序方式"
+
+#: NOT FOUND IN SOURCE
+msgid "SortOrder"
+msgstr "排序順序"
+
+#: html/Work/Elements/List:8 html/Work/Elements/MyApprovals:11
+msgid "Stage"
+msgstr "關卡"
+
+#: html/Edit/Global/Workflow/Top:8
+msgid "Stage Action"
+msgstr "關卡運行動作"
+
+#: html/Edit/Global/Workflow/Top:5
+msgid "Stage Condition"
+msgstr "關卡運行條件"
+
+#: html/Work/Elements/Quicksearch:17
+msgid "Stalled"
+msgstr "延宕"
+
+#: NOT FOUND IN SOURCE
+msgid "Start page"
+msgstr "首頁"
+
+#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:34
+msgid "Started"
+msgstr "實際起始日"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "Starts"
+msgstr "應起始日"
+
+#: NOT FOUND IN SOURCE
+msgid "Starts By"
+msgstr "應起始日"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Status"
+msgstr "現況"
+
+#: etc/initialdata.zh:317 etc/initialdata:294
+msgid "Status Change"
+msgstr "現況改變時"
+
+#: lib/RT/Transaction_Overlay.pm:528
+#. ($self->loc($self->OldValue), $self->loc($self->NewValue))
+msgid "Status changed from %1 to %2"
+msgstr "現況從 %1 改為 %2"
+
+#: NOT FOUND IN SOURCE
+msgid "StatusChange"
+msgstr "現況改變時"
+
+#: html/Ticket/Elements/Tabs:146
+msgid "Steal"
+msgstr "強制更換承辦人"
+
+#: lib/RT/Queue_Overlay.pm:91
+msgid "Steal tickets"
+msgstr "強制承辦申請單"
+
+#: lib/RT/Queue_Overlay.pm:91
+msgid "StealTicket"
+msgstr "強制承辦申請單"
+
+#: lib/RT/Transaction_Overlay.pm:587
+#. ($Old->Name)
+msgid "Stolen from %1 "
+msgstr "被 %1 強制更換 "
+
+#: html/Edit/Groups/Member:69
+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
+msgid "Subject"
+msgstr "主題"
+
+#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/Transaction_Overlay.pm:609
+#. ($self->Data)
+msgid "Subject changed to %1"
+msgstr "標題已改為 %1"
+
+#: html/Elements/Submit:58 html/Work/Search/Bulk.html:103
+msgid "Submit"
+msgstr "送出"
+
+#: NOT FOUND IN SOURCE
+msgid "Submit Workflow"
+msgstr "送出流程"
+
+#: lib/RT/Group_Overlay.pm:748
+msgid "Succeeded"
+msgstr "設定成功"
+
+#: NOT FOUND IN SOURCE
+msgid "Sun"
+msgstr "星期日"
+
+#: lib/RT/Date.pm:394
+msgid "Sun."
+msgstr "星期日"
+
+#: html/Edit/Users/System:17 lib/RT/System.pm:53
+msgid "SuperUser"
+msgstr "系統管理員"
+
+#: html/User/Elements/DelegateRights:76
+msgid "System"
+msgstr "系統"
+
+#: html/Edit/Global/Scrip/Top:18 html/Edit/Global/Scrip/Top:44
+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
+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 "系統錯誤。設定權限失敗。"
+
+#: html/Edit/Users/index.html:122
+msgid "System Rights"
+msgstr "系統權限"
+
+#: lib/RT/ACE_Overlay.pm:615
+msgid "System error. Right not delegated."
+msgstr "系統錯誤。權限代理失敗。"
+
+#: 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 "系統錯誤。設定權限失敗。"
+
+#: NOT FOUND IN SOURCE
+msgid "System error. Unable to grant rights."
+msgstr "系統錯誤。無法設定權限。"
+
+#: html/Admin/Global/GroupRights.html:34 html/Admin/Groups/GroupRights.html:36 html/Admin/Queues/GroupRights.html:35
+msgid "System groups"
+msgstr "系統群組"
+
+#: NOT FOUND IN SOURCE
+msgid "SystemInternal"
+msgstr "系統內部用"
+
+#: etc/initialdata.zh:59 etc/initialdata.zh:65 etc/initialdata.zh:71 etc/initialdata:41 etc/initialdata:47 etc/initialdata:53
+msgid "SystemRolegroup for internal use"
+msgstr "內部使用的系統角色群組"
+
+#: lib/RT/CurrentUser.pm:319
+msgid "TEST_STRING"
+msgstr "TEST_STRING"
+
+#: NOT FOUND IN SOURCE
+msgid "TabbedUI"
+msgstr "頁籤介面"
+
+#: html/Ticket/Elements/Tabs:142
+msgid "Take"
+msgstr "受理"
+
+#: lib/RT/Queue_Overlay.pm:89
+msgid "Take tickets"
+msgstr "自行承辦申請單"
+
+#: lib/RT/Queue_Overlay.pm:89
+msgid "TakeTicket"
+msgstr "自行承辦申請單"
+
+#: lib/RT/Transaction_Overlay.pm:573
+msgid "Taken"
+msgstr "已受理"
+
+#: html/Admin/Elements/EditScrip:80
+msgid "Template"
+msgstr "範本"
+
+#: html/Admin/Global/Template.html:90 html/Admin/Queues/Template.html:89
+#. ($TemplateObj->Id())
+msgid "Template #%1"
+msgstr "範本 #%1"
+
+#: html/Edit/Global/Template/List:9 html/Edit/Global/Template/Top:17
+msgid "Template Content"
+msgstr "通知範本內容"
+
+#: html/Edit/Global/Template/List:8 html/Edit/Global/Template/Top:13
+msgid "Template Description"
+msgstr "通知範本描述"
+
+#: html/Edit/Global/Template/List:7 html/Edit/Global/Template/Top:9
+msgid "Template Name"
+msgstr "通知範本名稱"
+
+#: html/Admin/Elements/EditTemplates:88
+msgid "Template deleted"
+msgstr "範本已刪除"
+
+#: lib/RT/Scrip_Overlay.pm:152
+msgid "Template not found"
+msgstr "找不到範本"
+
+#: NOT FOUND IN SOURCE
+msgid "Template not found\\n"
+msgstr "找不到範本\\n"
+
+#: lib/RT/Template_Overlay.pm:352
+msgid "Template parsed"
+msgstr "範本剖析完畢"
+
+#: html/Admin/Elements/QueueTabs:48 html/Admin/Elements/SystemTabs:35 html/Admin/Global/index.html:44
+msgid "Templates"
+msgstr "範本"
+
+#: html/Edit/Global/autohandler:8 html/Edit/Queues/autohandler:19
+msgid "Templates "
+msgstr "通知範本"
+
+#: NOT FOUND IN SOURCE
+msgid "Templates for %1\\n"
+msgstr "找不到 %1 的範本\\n"
+
+#: lib/RT/Interface/Web.pm:894 x:897
+msgid "That is already the current value"
+msgstr "已經是目前欄位的值"
+
+#: lib/RT/CustomField_Overlay.pm:242
+msgid "That is not a value for this custom field"
+msgstr "這不是該自訂欄位的值"
+
+#: lib/RT/Ticket_Overlay.pm:1899
+msgid "That is the same value"
+msgstr "同樣的值"
+
+#: lib/RT/ACE_Overlay.pm:287 lib/RT/ACE_Overlay.pm:596
+msgid "That principal already has that right"
+msgstr "這項單位已經擁有該權限"
+
+#: lib/RT/Queue_Overlay.pm:633
+#. ($args{'Type'})
+msgid "That principal is already a %1 for this queue"
+msgstr "這項單位已經是這個表單的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1433
+#. ($self->loc($args{'Type'}))
+msgid "That principal is already a %1 for this ticket"
+msgstr "這項單位已經是這份申請單的 %1"
+
+#: lib/RT/Queue_Overlay.pm:732
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this queue"
+msgstr "這項單位不是這個表單的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1550
+#. ($args{'Type'})
+msgid "That principal is not a %1 for this ticket"
+msgstr "這項單位不是這份申請單的 %1"
+
+#: lib/RT/Ticket_Overlay.pm:1895
+msgid "That queue does not exist"
+msgstr "此表單不存在"
+
+#: lib/RT/Ticket_Overlay.pm:3237
+msgid "That ticket has unresolved dependencies"
+msgstr "這份申請單有尚未解決的附屬申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "That user already has that right"
+msgstr "使用者已具有該項權限"
+
+#: lib/RT/Ticket_Overlay.pm:3047
+msgid "That user already owns that ticket"
+msgstr "該使用者已經承辦這份申請單"
+
+#: lib/RT/Ticket_Overlay.pm:3019
+msgid "That user does not exist"
+msgstr "使用者不存在"
+
+#: lib/RT/User_Overlay.pm:376
+msgid "That user is already privileged"
+msgstr "這名使用者已經是內部成員"
+
+#: lib/RT/User_Overlay.pm:397
+msgid "That user is already unprivileged"
+msgstr "這名使用者屬於非內部成員群組"
+
+#: lib/RT/User_Overlay.pm:389
+msgid "That user is now privileged"
+msgstr "使用者加入內部成員群組完畢"
+
+#: lib/RT/User_Overlay.pm:410
+msgid "That user is now unprivileged"
+msgstr "這名使用者已加入非內部成員群組"
+
+#: NOT FOUND IN SOURCE
+msgid "That user is now unprivilegedileged"
+msgstr "這名使用者已加入非內部成員群組"
+
+#: lib/RT/Ticket_Overlay.pm:3040
+msgid "That user may not own tickets in that queue"
+msgstr "使用者可能沒有承辦表單裡的申請單"
+
+#: lib/RT/Link_Overlay.pm:205
+msgid "That's not a numerical id"
+msgstr "這不是一個數字編號"
+
+#: html/SelfService/Display.html:31 html/Ticket/Create.html:149 html/Ticket/Elements/ShowSummary:27
+msgid "The Basics"
+msgstr "基本資訊"
+
+#: lib/RT/ACE_Overlay.pm:87
+msgid "The CC of a ticket"
+msgstr "申請單的副本收件人"
+
+#: lib/RT/ACE_Overlay.pm:88
+msgid "The administrative CC of a ticket"
+msgstr "申請單的管理員副本收件人"
+
+#: lib/RT/Ticket_Overlay.pm:2226
+msgid "The comment has been recorded"
+msgstr "評論已被紀錄"
+
+#: 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 "下列命令會找到 'general' 表單內所有運作中的申請單,並將其中 4 小時內未處理的申請單優先程度設為 99:"
+
+#: bin/rt-commit-handler:755 bin/rt-commit-handler:765
+msgid "The following commands were not proccessed:\\n\\n"
+msgstr "以下命令未被執行:\\n\\n"
+
+#: lib/RT/Interface/Web.pm:897 x:900
+msgid "The new value has been set."
+msgstr "新的欄位值設定完成。"
+
+#: lib/RT/ACE_Overlay.pm:85
+msgid "The owner of a ticket"
+msgstr "申請單的承辦人"
+
+#: lib/RT/ACE_Overlay.pm:86
+msgid "The requestor of a ticket"
+msgstr "申請單的申請人"
+
+#: html/Admin/Elements/EditUserComments:25
+msgid "These comments aren't generally visible to the user"
+msgstr "該使用者不會看見這些評論"
+
+#: html/Edit/Global/Workflow/Owner.html:32
+msgid "Third-"
+msgstr "三"
+
+#: NOT FOUND IN SOURCE
+msgid "This ticket %1 %2 (%3)\\n"
+msgstr "申請單 %1 %2 (%3)\\n"
+
+#: bin/rt-crontool:188
+msgid "This tool allows the user to run arbitrary perl modules from within RT."
+msgstr "此工具程式會讓使用者經由 RT 執行任意命令。"
+
+#: lib/RT/Transaction_Overlay.pm:251
+msgid "This transaction appears to have no content"
+msgstr "此項更動報告沒有內容"
+
+#: html/Ticket/Elements/ShowRequestor:46
+#. ($rows)
+msgid "This user's %1 highest priority tickets"
+msgstr "使用者送出的前 %1 份優先處理申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "This user's 25 highest priority tickets"
+msgstr "使用者送出的前 25 份優先處理申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Thu"
+msgstr "星期四"
+
+#: lib/RT/Date.pm:391
+msgid "Thu."
+msgstr "星期四"
+
+#: html/Admin/Elements/ModifyTemplateAsWorkflow:163
+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 "更新申請單 # %1 的全部資訊:%2"
+
+#: html/Ticket/ModifyAll.html:24 html/Ticket/ModifyAll.html:28
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket #%1 Jumbo update: %2"
+msgstr "更新申請單 #%1 的全部資訊:%2"
+
+#: html/Approvals/Elements/ShowDependency:45
+#. ($link->BaseObj->Id, $link->BaseObj->Subject)
+msgid "Ticket #%1: %2"
+msgstr "申請單 #%1: %2"
+
+#: lib/RT/Ticket_Overlay.pm:605 lib/RT/Ticket_Overlay.pm:626
+#. ($self->Id, $QueueObj->Name)
+msgid "Ticket %1 created in queue '%2'"
+msgstr "申請單 #%1 成功新增於 '%2' 表單"
+
+#: bin/rt-commit-handler:759
+#. ($Ticket->Id)
+msgid "Ticket %1 loaded\\n"
+msgstr "載入申請單 %1\\n"
+
+#: html/Search/Bulk.html:212 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
+msgid "Ticket Due"
+msgstr "表單處理期限"
+
+#: html/Ticket/History.html:24 html/Ticket/History.html:27
+#. ($Ticket->Id, $Ticket->Subject)
+msgid "Ticket History # %1 %2"
+msgstr "申請單處理紀錄 # %1 %2"
+
+#: html/Work/Elements/List:6
+msgid "Ticket ID"
+msgstr "單號"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Id"
+msgstr "申請單編號"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket Processing Due"
+msgstr "表單運行期限"
+
+#: etc/initialdata.zh: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:44 html/Work/Tickets/Elements/ShowBasics:34
+msgid "Ticket Type"
+msgstr "表單種類"
+
+#: html/Search/Elements/PickRestriction:62 html/Work/Search/PickRestriction:43
+msgid "Ticket attachment"
+msgstr "申請單附件"
+
+#: lib/RT/Tickets_Overlay.pm:1166
+msgid "Ticket content"
+msgstr "申請單內容"
+
+#: lib/RT/Tickets_Overlay.pm:1212
+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
+msgid "Ticket could not be created due to an internal error"
+msgstr "內部錯誤,無法新增申請單"
+
+#: lib/RT/Transaction_Overlay.pm:520
+msgid "Ticket created"
+msgstr "申請單新增完畢"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket creation failed"
+msgstr "申請單新增失敗"
+
+#: lib/RT/Transaction_Overlay.pm:525
+msgid "Ticket deleted"
+msgstr "申請單刪除完畢"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket id not found"
+msgstr "找不到申請單編號"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket killed"
+msgstr "申請單刪除完畢"
+
+#: NOT FOUND IN SOURCE
+msgid "Ticket not found"
+msgstr "找不到申請單"
+
+#: etc/initialdata.zh:318 etc/initialdata:295
+msgid "Ticket status changed"
+msgstr "申請單現況已改變"
+
+#: html/Ticket/Update.html:38
+msgid "Ticket watchers"
+msgstr "申請單視察員"
+
+#: html/Elements/Tabs:46
+msgid "Tickets"
+msgstr "申請單"
+
+#: lib/RT/Tickets_Overlay.pm:1383
+#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'}))
+msgid "Tickets %1 %2"
+msgstr "申請單 %1 %2"
+
+#: lib/RT/Tickets_Overlay.pm:1348
+#. ($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"
+msgstr "%1 的申請單"
+
+#: html/Approvals/Elements/ShowDependency:26
+msgid "Tickets which depend on this approval:"
+msgstr "批准之後,可接續處理:"
+
+#: html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47
+msgid "Time Left"
+msgstr "剩餘時間"
+
+#: html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:42
+msgid "Time Worked"
+msgstr "處理時間"
+
+#: lib/RT/Tickets_Overlay.pm:1139
+msgid "Time left"
+msgstr "剩餘時間"
+
+#: html/Elements/Footer:36
+msgid "Time to display"
+msgstr "顯示時間"
+
+#: lib/RT/Tickets_Overlay.pm:1115
+msgid "Time worked"
+msgstr "已處理時間"
+
+#: NOT FOUND IN SOURCE
+msgid "TimeLeft"
+msgstr "剩餘時間"
+
+#: lib/RT/Ticket_Overlay.pm:1183
+msgid "TimeWorked"
+msgstr "已處理時間"
+
+#: bin/rt-commit-handler:401
+msgid "To generate a diff of this commit:"
+msgstr "產生這次更動的差異檔:"
+
+#: bin/rt-commit-handler:390
+msgid "To generate a diff of this commit:\\n"
+msgstr "產生這次更動的差異檔:\\n"
+
+#: lib/RT/Ticket_Overlay.pm:1186
+msgid "Told"
+msgstr "告知日期"
+
+#: html/Edit/Elements/Page:46
+msgid "Total"
+msgstr "頁"
+
+#: etc/initialdata.zh:239 etc/initialdata:237
+msgid "Transaction"
+msgstr "更動"
+
+#: lib/RT/Transaction_Overlay.pm:640
+#. ($self->Data)
+msgid "Transaction %1 purged"
+msgstr "清除更動報告 %1"
+
+#: lib/RT/Transaction_Overlay.pm:177
+msgid "Transaction Created"
+msgstr "更動報告已新增"
+
+#: lib/RT/Transaction_Overlay.pm:88
+msgid "Transaction->Create couldn't, as you didn't specify a ticket id"
+msgstr "未指定申請單編號,無法新增更動"
+
+#: lib/RT/Transaction_Overlay.pm:699
+msgid "Transactions are immutable"
+msgstr "不可更改更動報告"
+
+#: NOT FOUND IN SOURCE
+msgid "Trying to delete a right: %1"
+msgstr "試圖刪除某項權限:%1"
+
+#: NOT FOUND IN SOURCE
+msgid "Tue"
+msgstr "星期二"
+
+#: lib/RT/Date.pm:389
+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
+msgid "Type"
+msgstr "類別"
+
+#: lib/RT/ScripCondition_Overlay.pm:103
+msgid "Unimplemented"
+msgstr "尚無實作"
+
+#: html/Admin/Users/Modify.html:67
+msgid "Unix login"
+msgstr "外部系統登入帳號"
+
+#: html/Admin/Elements/ModifyUser:61
+msgid "UnixUsername"
+msgstr "外部系統登入帳號"
+
+#: lib/RT/Attachment_Overlay.pm:266 lib/RT/Attachment_Overlay.pm:298
+#. ($self->ContentEncoding)
+msgid "Unknown ContentEncoding %1"
+msgstr "不可解的內容文字編碼方式 %1"
+
+#: html/Elements/SelectResultsPerPage:36
+msgid "Unlimited"
+msgstr "全數顯示"
+
+#: etc/initialdata.zh:50 etc/initialdata:32
+msgid "Unprivileged"
+msgstr "非內部成員"
+
+#: lib/RT/Transaction_Overlay.pm:569
+msgid "Untaken"
+msgstr "未被受理"
+
+#: html/Edit/Elements/Page:13 html/Edit/Elements/Page:15
+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
+msgid "Update"
+msgstr "處理"
+
+#: html/Admin/Users/Prefs.html:61
+msgid "Update ID"
+msgstr "更新編號"
+
+#: html/Search/Bulk.html:129 html/Ticket/ModifyAll.html:65 html/Ticket/Update.html:65 html/Work/Search/Bulk.html:81 html/Work/Tickets/Update.html:32
+msgid "Update Type"
+msgstr "更新類別"
+
+#: html/Search/Listing.html:60 html/Work/Search/index.html:32
+msgid "Update all these tickets at once"
+msgstr "整批更新申請單"
+
+#: html/Admin/Users/Prefs.html:48
+msgid "Update email"
+msgstr "更新電子郵件信箱"
+
+#: html/Admin/Users/Prefs.html:54
+msgid "Update name"
+msgstr "更新帳號"
+
+#: lib/RT/Interface/Web.pm:409 x:412
+msgid "Update not recorded."
+msgstr "更新未被記錄"
+
+#: html/Search/Bulk.html:80 html/Work/Search/Bulk.html:52
+msgid "Update selected tickets"
+msgstr "更新選擇的申請單"
+
+#: html/Admin/Users/Prefs.html:35
+msgid "Update signature"
+msgstr "更新簽章"
+
+#: html/Ticket/ModifyAll.html:62
+msgid "Update ticket"
+msgstr "更新申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "Update ticket # %1"
+msgstr "更新申請單 # %1"
+
+#: html/SelfService/Update.html:24 html/SelfService/Update.html:46
+#. ($Ticket->id)
+msgid "Update ticket #%1"
+msgstr "更新申請單 #%1"
+
+#: html/Ticket/Update.html:138 html/Work/Tickets/Update.html:122
+#. ($Ticket->id, $Ticket->Subject)
+msgid "Update ticket #%1 (%2)"
+msgstr "更新申請單 #%1 (%2)"
+
+#: lib/RT/Interface/Web.pm:407 x:410
+msgid "Update type was neither correspondence nor comment."
+msgstr "更新的內容並非申請單回覆也不是評論"
+
+#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:50 lib/RT/Ticket_Overlay.pm:1187
+msgid "Updated"
+msgstr "前次更新"
+
+#: html/Work/Preferences/index.html:15
+msgid "User"
+msgstr "使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 %2: %3\\n"
+msgstr "使用者 %1 %2:%3\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User %1 Password: %2\\n"
+msgstr "使用者 %1 密碼:%2\\n"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found"
+msgstr "找不到使用者 '%1'"
+
+#: NOT FOUND IN SOURCE
+msgid "User '%1' not found\\n"
+msgstr "找不到使用者 '%1'\\n"
+
+#: etc/initialdata.zh:142 etc/initialdata.zh: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
+msgid "User ID"
+msgstr "使用者 ID"
+
+#: 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
+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
+msgid "User Rights"
+msgstr "使用者權限"
+
+#: html/Edit/Elements/Tab:34
+msgid "User Setup"
+msgstr "使用者設定"
+
+#: html/Edit/Users/Info:37
+msgid "User Shift"
+msgstr "員工班別"
+
+#: html/Admin/Users/Modify.html:225
+#. ($msg)
+msgid "User could not be created: %1"
+msgstr "無法新增使用者:%1"
+
+#: lib/RT/User_Overlay.pm:321
+msgid "User created"
+msgstr "使用者新增完畢"
+
+#: 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
+msgid "User loaded"
+msgstr "已載入使用者"
+
+#: NOT FOUND IN SOURCE
+msgid "User notified"
+msgstr "已通知使用者"
+
+#: html/Admin/Users/Prefs.html:24 html/Admin/Users/Prefs.html:28
+msgid "User view"
+msgstr "使用者私人資料"
+
+#: NOT FOUND IN SOURCE
+msgid "UserDefined"
+msgstr "使用者自定"
+
+#: html/Admin/Users/Modify.html:47 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:34
+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
+msgid "Users"
+msgstr "使用者"
+
+#: html/Admin/Users/index.html:64
+msgid "Users matching search criteria"
+msgstr "符合查詢條件的使用者"
+
+#: html/Search/Elements/PickRestriction:50 html/Work/Search/PickRestriction:31
+msgid "ValueOfQueue"
+msgstr "選擇表單"
+
+#: html/Admin/Elements/EditCustomField:56
+msgid "Values"
+msgstr "欄位值"
+
+#: lib/RT/Queue_Overlay.pm:81
+msgid "Watch"
+msgstr "視察"
+
+#: lib/RT/Queue_Overlay.pm:82
+msgid "WatchAsAdminCc"
+msgstr "以管理員副本收件人身份視察"
+
+#: NOT FOUND IN SOURCE
+msgid "Watcher loaded"
+msgstr "成功載入視察員資訊"
+
+#: html/Admin/Elements/QueueTabs:41
+msgid "Watchers"
+msgstr "視察員"
+
+#: html/Admin/Elements/ModifyUser:55
+msgid "WebEncoding"
+msgstr "網頁文字編碼方式"
+
+#: NOT FOUND IN SOURCE
+msgid "Wed"
+msgstr "星期三"
+
+#: lib/RT/Date.pm:390
+msgid "Wed."
+msgstr "星期三"
+
+#: etc/initialdata.zh:533 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
+msgid "When a ticket has been approved by any approver, add correspondence to the original ticket"
+msgstr "當申請單通過某項簽核後,將此訊息回覆到原申請單"
+
+#: etc/initialdata.zh:156 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
+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
+msgid "When anything happens"
+msgstr "當任何事情發生時"
+
+#: etc/initialdata.zh:202 etc/initialdata:184
+msgid "Whenever a ticket is resolved"
+msgstr "當申請單解決時"
+
+#: etc/initialdata.zh:188 etc/initialdata:170
+msgid "Whenever a ticket's owner changes"
+msgstr "當申請單更換承辦人時"
+
+#: etc/initialdata.zh:196 etc/initialdata:178
+msgid "Whenever a ticket's queue changes"
+msgstr "當申請單更換表單時"
+
+#: etc/initialdata.zh:180 etc/initialdata:162
+msgid "Whenever a ticket's status changes"
+msgstr "當申請單更新現況時"
+
+#: etc/initialdata.zh:210 etc/initialdata:192
+msgid "Whenever a user-defined condition occurs"
+msgstr "當使用者自訂的情況發生時"
+
+#: etc/initialdata.zh:174 etc/initialdata:156
+msgid "Whenever comments come in"
+msgstr "當評論送達時"
+
+#: etc/initialdata.zh: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:34
+msgid "Work"
+msgstr "公司"
+
+#: html/Admin/Elements/ModifyUser:69
+msgid "WorkPhone"
+msgstr "公司電話"
+
+#: html/Ticket/Elements/ShowBasics:34 html/Ticket/Update.html:64
+msgid "Worked"
+msgstr "處理時間"
+
+#: html/Admin/Global/Workflow.html:91 html/Admin/Queues/Workflow.html:89
+#. ($WorkflowObj->Id())
+msgid "Workflow #%1"
+msgstr "流程 #%1"
+
+#: html/Edit/Global/Workflow/List:15
+msgid "Workflow Begin"
+msgstr "流程開始"
+
+#: html/Edit/Global/Workflow/List:20
+msgid "Workflow End"
+msgstr "流程結束"
+
+#: html/Admin/Elements/EditWorkflows:90
+msgid "Workflow deleted"
+msgstr "流程已刪除"
+
+#: html/Edit/Global/autohandler:10 html/Edit/Queues/autohandler:21
+msgid "Workflows"
+msgstr "流程"
+
+#: html/Edit/Global/Basic/Top:25
+msgid "Yes"
+msgstr "是"
+
+#: lib/RT/Ticket_Overlay.pm:3150
+msgid "You already own this ticket"
+msgstr "您已是這份申請單的承辦人"
+
+#: html/autohandler:122
+msgid "You are not an authorized user"
+msgstr "您不是被授權的使用者"
+
+#: lib/RT/Ticket_Overlay.pm:3032
+msgid "You can only reassign tickets that you own or that are unowned"
+msgstr "祇能重新指派您所承辦或是沒有承辦人的申請單"
+
+#: NOT FOUND IN SOURCE
+msgid "You don't have permission to view that ticket.\\n"
+msgstr "您沒有看那份申請單的權限。\\n"
+
+#: docs/design_docs/string-extraction-guide.txt:47
+#. ($num, $queue)
+msgid "You found %1 tickets in queue %2"
+msgstr "您會在表單 %2 找到 %1 的申請單"
+
+#: html/NoAuth/Logout.html:30
+msgid "You have been logged out of RT."
+msgstr "您已登出 RT。"
+
+#: html/SelfService/Display.html:77
+msgid "You have no permission to create tickets in that queue."
+msgstr "您沒有在該表單新增申請單的權限。"
+
+#: lib/RT/Ticket_Overlay.pm:1908
+msgid "You may not create requests in that queue."
+msgstr "您不能在該表單中提出申請。"
+
+#: html/Edit/Global/Basic/Top:38
+msgid "You need to restart the Request Tracker service for saved changes to take effect."
+msgstr "您必須重新啟動 Request Tracker 服務,儲存的更動纔會生效。"
+
+#: html/NoAuth/Logout.html:34
+msgid "You're welcome to login again"
+msgstr "歡迎下次再來"
+
+#: NOT FOUND IN SOURCE
+msgid "Your %1 requests"
+msgstr "您提出的 %1 申請單"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "Your request has been approved."
+msgstr "您的申請單已完成簽核程序。"
+
+#: NOT FOUND IN SOURCE
+msgid "Your request was rejected"
+msgstr "您的申請單已被駁回"
+
+#: etc/initialdata.zh:455
+msgid "Your request was rejected by %1."
+msgstr "您的申請單已被 %1 駁回。"
+
+#: etc/initialdata:427 etc/upgrade/2.1.71:101 html/Edit/Elements/CreateApprovalsQueue:73
+msgid "Your request was rejected."
+msgstr "您的申請單已被駁回。"
+
+#: html/autohandler:144
+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
+msgid "Zip"
+msgstr "郵遞區號"
+
+#: NOT FOUND IN SOURCE
+msgid "[no subject]"
+msgstr "[沒有標題]"
+
+#: NOT FOUND IN SOURCE
+msgid "ago"
+msgstr "過期"
+
+#: NOT FOUND IN SOURCE
+msgid "alert"
+msgstr "急訊"
+
+#: html/User/Elements/DelegateRights:58
+#. ($right->PrincipalObj->Object->SelfDescription)
+msgid "as granted to %1"
+msgstr "權限同 %1"
+
+#: html/SelfService/Closed.html:27
+msgid "closed"
+msgstr "已解決"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:33
+msgid "contains"
+msgstr "包含"
+
+#: html/Elements/SelectAttachmentField:25
+msgid "content"
+msgstr "內容"
+
+#: html/Elements/SelectAttachmentField:26
+msgid "content-type"
+msgstr "類型"
+
+#: lib/RT/Ticket_Overlay.pm:2295
+msgid "correspondence (probably) not sent"
+msgstr "申請單回覆(可能)未送出"
+
+#: lib/RT/Ticket_Overlay.pm:2305
+msgid "correspondence sent"
+msgstr "申請單回覆已送出"
+
+#: NOT FOUND IN SOURCE
+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
+msgid "days"
+msgstr "天"
+
+#: NOT FOUND IN SOURCE
+msgid "dead"
+msgstr "拒絕處理"
+
+#: NOT FOUND IN SOURCE
+msgid "debug"
+msgstr "偵錯"
+
+#: html/Search/Listing.html:74
+msgid "delete"
+msgstr "刪除"
+
+#: lib/RT/Queue_Overlay.pm:62
+msgid "deleted"
+msgstr "已刪除"
+
+#: html/Search/Elements/PickRestriction:67 html/Work/Search/PickRestriction:47
+msgid "does not match"
+msgstr "不符合"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:34
+msgid "doesn't contain"
+msgstr "不包含"
+
+#: NOT FOUND IN SOURCE
+msgid "emergency"
+msgstr "危難"
+
+#: html/Elements/SelectEqualityOperator:37
+msgid "equal to"
+msgstr "等於"
+
+#: NOT FOUND IN SOURCE
+msgid "error"
+msgstr "錯誤"
+
+#: NOT FOUND IN SOURCE
+msgid "false"
+msgstr "假"
+
+#: html/Elements/SelectAttachmentField:27
+msgid "filename"
+msgstr "檔名"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37
+msgid "greater than"
+msgstr "大於"
+
+#: lib/RT/Group_Overlay.pm:193
+#. ($self->Name)
+msgid "group '%1'"
+msgstr "群組 '%1'"
+
+#: lib/RT/Date.pm:315
+msgid "hours"
+msgstr "小時"
+
+#: NOT FOUND IN SOURCE
+msgid "id"
+msgstr "編號"
+
+#: NOT FOUND IN SOURCE
+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
+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
+msgid "isn't"
+msgstr "不是"
+
+#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37
+msgid "less than"
+msgstr "小於"
+
+#: html/Edit/Global/Workflow/Owner.html:35
+msgid "level Admins"
+msgstr "層主管"
+
+#: html/Search/Elements/PickRestriction:66 html/Work/Search/PickRestriction:46
+msgid "matches"
+msgstr "符合"
+
+#: lib/RT/Date.pm:311
+msgid "min"
+msgstr "分"
+
+#: html/Ticket/Update.html:64
+msgid "minutes"
+msgstr "分鐘"
+
+#: bin/rt-commit-handler:764
+msgid "modifications\\n\\n"
+msgstr "更改\\n\\n"
+
+#: lib/RT/Date.pm:327
+msgid "months"
+msgstr "月"
+
+#: lib/RT/Queue_Overlay.pm:57
+msgid "new"
+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
+msgid "none"
+msgstr "無"
+
+#: html/Elements/SelectEqualityOperator:37
+msgid "not equal to"
+msgstr "不等於"
+
+#: NOT FOUND IN SOURCE
+msgid "notice"
+msgstr "提示"
+
+#: NOT FOUND IN SOURCE
+msgid "notlike"
+msgstr "不符合"
+
+#: html/Edit/Elements/PickUsers:17 html/Edit/Users/Add.html:18 html/Edit/Users/Search.html:28 html/Work/Tickets/Cc:15
+msgid "number"
+msgstr "號"
+
+#: html/SelfService/Elements/MyRequests:60 lib/RT/Queue_Overlay.pm:58
+msgid "open"
+msgstr "開啟"
+
+#: NOT FOUND IN SOURCE
+msgid "opened"
+msgstr "已開啟"
+
+#: lib/RT/Group_Overlay.pm:198
+#. ($self->Name, $user->Name)
+msgid "personal group '%1' for user '%2'"
+msgstr "使用者「%2」的「%1」代理人群組"
+
+#: lib/RT/Group_Overlay.pm:206
+#. ($queue->Name, $self->Type)
+msgid "queue %1 %2"
+msgstr "表單 %1 %2"
+
+#: lib/RT/Queue_Overlay.pm:61
+msgid "rejected"
+msgstr "已駁回"
+
+#: html/Work/Elements/SelectSearch:21 lib/RT/Queue_Overlay.pm:60
+msgid "resolved"
+msgstr "已處理"
+
+#: html/Edit/Global/Basic/Top:48
+msgid "rtname"
+msgstr "伺服器名稱"
+
+#: lib/RT/Date.pm:307
+msgid "sec"
+msgstr "秒"
+
+#: lib/RT/Queue_Overlay.pm:59
+msgid "stalled"
+msgstr "延宕"
+
+#: lib/RT/Group_Overlay.pm:201
+#. ($self->Type)
+msgid "system %1"
+msgstr "系統 %1"
+
+#: lib/RT/Group_Overlay.pm:212
+#. ($self->Type)
+msgid "system group '%1'"
+msgstr "系統群組 '%1'"
+
+#: html/Elements/Error:42 html/SelfService/Error.html:41
+msgid "the calling component did not specify why"
+msgstr "呼叫元件未指明原因"
+
+#: lib/RT/Group_Overlay.pm:209
+#. ($self->Instance, $self->Type)
+msgid "ticket #%1 %2"
+msgstr "申請單 #%1 %2"
+
+#: html/Work/Elements/SelectSearch:27
+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
+msgid "to"
+msgstr "到"
+
+#: NOT FOUND IN SOURCE
+msgid "true"
+msgstr "真"
+
+#: lib/RT/Group_Overlay.pm:215
+#. ($self->Id)
+msgid "undescribed group %1"
+msgstr "沒有描述的群組 %1"
+
+#: html/Work/Elements/SelectSearch:19
+msgid "unresolved"
+msgstr "未處理"
+
+#: lib/RT/Group_Overlay.pm:190
+#. ($user->Object->Name)
+msgid "user %1"
+msgstr "使用者 %1"
+
+#: NOT FOUND IN SOURCE
+msgid "warning"
+msgstr "警告"
+
+#: lib/RT/Date.pm:323
+msgid "weeks"
+msgstr "週"
+
+#: NOT FOUND IN SOURCE
+msgid "with template %1"
+msgstr "範本:%1"
+
+#: lib/RT/Date.pm:331
+msgid "years"
+msgstr "年"
+
+#: lib/RT/Date.pm:331
+msgid "approving"
+msgstr "待簽核"
+
diff --git a/rt/lib/RT/Interface/Email/Auth/MailFrom.pm b/rt/lib/RT/Interface/Email/Auth/MailFrom.pm
new file mode 100644 (file)
index 0000000..eb778ff
--- /dev/null
@@ -0,0 +1,131 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Interface::Email::Auth::MailFrom;
+use RT::Interface::Email qw(ParseSenderAddressFromHead CreateUser);
+
+# This is what the ordinary, non-enhanced gateway does at the moment.
+
+sub GetCurrentUser {
+    my %args = ( Message     => undef,
+                 CurrentUser => undef,
+                 AuthLevel   => undef,
+                 Ticket      => undef,
+                 Queue       => undef,
+                 Action      => undef,
+                 @_ );
+
+    # We don't need to do any external lookups
+    my ( $Address, $Name ) = ParseSenderAddressFromHead( $args{'Message'}->head );
+    my $CurrentUser = RT::CurrentUser->new();
+    $CurrentUser->LoadByEmail($Address);
+
+    unless ( $CurrentUser->Id ) {
+        $CurrentUser->LoadByName($Address);
+    }
+
+    if ( $CurrentUser->Id ) {
+        return ( $CurrentUser, 1 );
+    }
+    
+
+
+    # If the user can't be loaded, we may need to create one. Figure out the acl situation.
+    my $unpriv = RT::Group->new($RT::SystemUser);
+    $unpriv->LoadSystemInternalGroup('Unprivileged');
+    unless ( $unpriv->Id ) {
+        $RT::Logger->crit( "Auth::MailFrom couldn't find the 'Unprivileged' internal group" );
+        return ( $args{'CurrentUser'}, -1 );
+    }
+
+    my $everyone = RT::Group->new($RT::SystemUser);
+    $everyone->LoadSystemInternalGroup('Everyone');
+    unless ( $everyone->Id ) {
+        $RT::Logger->crit( "Auth::MailFrom couldn't find the 'Everyone' internal group");
+        return ( $args{'CurrentUser'}, -1 );
+    }
+
+    # but before we do that, we need to make sure that the created user would have the right
+    # to do what we're doing.
+    if ( $args{'Ticket'} && $args{'Ticket'}->Id ) {
+        # We have a ticket. that means we're commenting or corresponding
+        if ( $args{'Action'} =~ /^comment$/i ) {
+
+            # check to see whether "Everybody" or "Unprivileged users" can comment on tickets
+            unless ( $everyone->PrincipalObj->HasRight(
+                                                      Object => $args{'Queue'},
+                                                      Right => 'CommentOnTicket'
+                     )
+                     || $unpriv->PrincipalObj->HasRight(
+                                                      Object => $args{'Queue'},
+                                                      Right => 'CommentOnTicket'
+                     )
+              ) {
+                return ( $args{'CurrentUser'}, 0 );
+            }
+        }
+        elsif ( $args{'Action'} =~ /^correspond$/i ) {
+
+            # check to see whether "Everybody" or "Unprivileged users" can correspond on tickets
+            unless ( $everyone->PrincipalObj->HasRight(Object => $args{'Queue'},
+                                                       Right  => 'ReplyToTicket'
+                     )
+                     || $unpriv->PrincipalObj->HasRight(
+                                                       Object => $args{'Queue'},
+                                                       Right  => 'ReplyToTicket'
+                     )
+              ) {
+                return ( $args{'CurrentUser'}, 0 );
+            }
+
+        }
+        else {
+            return ( $args{'CurrentUser'}, 0 );
+        }
+    }
+
+    # We're creating a ticket
+    elsif ( $args{'Queue'} && $args{'Queue'}->Id ) {
+
+        # check to see whether "Everybody" or "Unprivileged users" can create tickets in this queue
+        unless ( $everyone->PrincipalObj->HasRight( Object => $args{'Queue'},
+                                                    Right  => 'CreateTicket' )
+                 || $unpriv->PrincipalObj->HasRight( Object => $args{'Queue'},
+                                                     Right  => 'CreateTicket' )
+          ) {
+            return ( $args{'CurrentUser'}, 0 );
+        }
+
+    }
+
+    $CurrentUser = CreateUser( undef, $Address, $Name, $args{'Message'} );
+
+    return ( $CurrentUser, 1 );
+}
+
+eval "require RT::Interface::Email::Auth::MailFrom_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email/Auth/MailFrom_Vendor.pm});
+eval "require RT::Interface::Email::Auth::MailFrom_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email/Auth/MailFrom_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Interface/Email/Filter/SpamAssassin.pm b/rt/lib/RT/Interface/Email/Filter/SpamAssassin.pm
new file mode 100644 (file)
index 0000000..f00e2d8
--- /dev/null
@@ -0,0 +1,63 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::Interface::Email::Filter::SpamAssassin;
+
+use Mail::SpamAssassin;
+my $spamtest = Mail::SpamAssassin->new();
+
+sub GetCurrentUser {
+    my $item = shift;
+    my $status = $spamtest->check ($item);
+    return (undef, 0) unless $status->is_spam();
+    eval { $status->rewrite_mail() };
+    if ($status->get_hits > $status->get_required_hits()*1.5) { 
+        # Spammy indeed
+        return (undef, -1);
+    }
+    return (undef, 0);
+}
+
+=head1 NAME
+
+RT::Interface::Email::Filter::SpamAssassin - Spam filter for RT
+
+=head1 SYNOPSIS
+
+    @RT::MailPlugins = ("Filter::SpamAssassin", ...);
+
+=head1 DESCRIPTION
+
+This plugin checks to see if an incoming mail is spam (using
+C<spamassassin>) and if so, rewrites its headers. If the mail is very
+definitely spam - 1.5x more hits than required - then it is dropped on
+the floor; otherwise, it is passed on as normal.
+
+=cut
+
+eval "require RT::Interface::Email::Filter::SpamAssassin_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email/Filter/SpamAssassin_Vendor.pm});
+eval "require RT::Interface::Email::Filter::SpamAssassin_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email/Filter/SpamAssassin_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Link_Overlay.pm b/rt/lib/RT/Link_Overlay.pm
new file mode 100644 (file)
index 0000000..ac1bc37
--- /dev/null
@@ -0,0 +1,360 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Link - an RT Link object
+
+=head1 SYNOPSIS
+
+  use RT::Link;
+
+=head1 DESCRIPTION
+
+This module should never be called directly by client code. it's an internal module which
+should only be accessed through exported APIs in Ticket other similar objects.
+
+=head1 METHODS
+
+
+=begin testing
+
+
+use RT::Link;
+my $link = RT::Link->new($RT::SystemUser);
+
+
+ok (ref $link);
+ok (UNIVERSAL::isa($link, 'RT::Link'));
+ok (UNIVERSAL::isa($link, 'RT::Base'));
+ok (UNIVERSAL::isa($link, 'RT::Record'));
+ok (UNIVERSAL::isa($link, 'DBIx::SearchBuilder::Record'));
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+use Carp;
+use RT::URI;
+
+
+# {{{ sub Create 
+
+=head2 Create PARAMHASH
+
+Create a new link object. Takes 'Base', 'Target' and 'Type'.
+Returns undef on failure or a Link Id on success.
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = ( Base   => undef,
+                 Target => undef,
+                 Type   => undef,
+                 @_ );
+
+    my $base = RT::URI->new( $self->CurrentUser );
+    $base->FromURI( $args{'Base'} );
+
+    unless ( $base->Scheme ) {
+        $RT::Logger->warning( "$self couldn't resolve base:'"
+                              . $args{'Base'} . " - "
+                              . $base->Scheme
+                              . "' into a URI\n" );
+
+        #use Data::Dumper;
+        #$RT::Logger->warning(scalar Dumper $base);
+        return (undef);
+    }
+
+    my $target = RT::URI->new( $self->CurrentUser );
+    $target->FromURI( $args{'Target'} );
+
+    unless ( $target->Resolver ) {
+        $RT::Logger->warning( "$self couldn't resolve target:'"
+                              . $args{'Target'} . " - "
+                              . "' into a URI\n" );
+
+        #use Data::Dumper;
+        #$RT::Logger->warning(scalar Dumper $target);
+        return (undef);
+    }
+
+    my $base_id   = 0;
+    my $target_id = 0;
+
+
+
+
+    if ( $base->IsLocal ) {
+        unless (UNIVERSAL::can($base->Object, 'Id')) {
+            return (undef, $self->loc("[_1] appears to be a local object, but can't be found in the database", $args{'Base'}));
+        
+        }
+        $base_id = $base->Object->Id;
+    }
+    if ( $target->IsLocal ) {
+        unless (UNIVERSAL::can($target->Object, 'Id')) {
+            return (undef, $self->loc("[_1] appears to be a local object, but can't be found in the database", $args{'Target'}));
+        
+        }
+        $target_id = $target->Object->Id;
+    }
+
+    # {{{ We don't want references to ourself
+    if ( $base->URI eq $target->URI ) {
+        return ( 0, $self->loc("Can't link a ticket to itself") );
+    }
+
+    # }}}
+
+    my ( $id, $msg ) = $self->SUPER::Create( Base        => $base->URI,
+                                             Target      => $target->URI,
+                                             LocalBase   => $base_id,
+                                             LocalTarget => $target_id,
+                                             Type        => $args{'Type'} );
+    return ( $id, $msg );
+}
+
+# }}}
+ # {{{ sub LoadByParams
+
+=head2 LoadByParams
+
+  Load an RT::Link object from the database.  Takes three parameters
+  
+  Base => undef,
+  Target => undef,
+  Type =>undef
+  Base and Target are expected to be integers which refer to Tickets or URIs
+  Type is the link type
+
+=cut
+
+sub LoadByParams {
+    my $self = shift;
+    my %args = ( Base   => undef,
+                 Target => undef,
+                 Type   => undef,
+                 @_ );
+
+    my $base = RT::URI->new($self->CurrentUser);
+    $base->FromURI( $args{'Base'} );
+
+    my $target = RT::URI->new($self->CurrentUser);
+    $target->FromURI( $args{'Target'} );
+    
+    unless ($base->Resolver && $target->Resolver) {
+        return ( 0, $self->loc("Couldn't load link") );
+    }
+
+
+    my ( $id, $msg ) = $self->LoadByCols( Base   => $base->URI,
+                                          Type   => $args{'Type'},
+                                          Target => $target->URI );
+
+    unless ($id) {
+        return ( 0, $self->loc("Couldn't load link") );
+    }
+}
+
+# }}}
+# {{{ sub Load 
+
+=head2 Load
+
+  Load an RT::Link object from the database.  Takes one parameter, the id of an entry in the links table.
+
+
+=cut
+
+sub Load {
+    my $self       = shift;
+    my $identifier = shift;
+
+
+
+
+    if ( $identifier !~ /^\d+$/ ) {
+        return ( 0, $self->loc("That's not a numerical id") );
+    }
+    else {
+        my ( $id, $msg ) = $self->LoadById($identifier);
+        unless ( $self->Id ) {
+            return ( 0, $self->loc("Couldn't load link") );
+        }
+        return ( $id, $msg );
+    }
+}
+
+# }}}
+
+
+# {{{ TargetURI
+
+=head2 TargetURI
+
+returns an RT::URI object for the "Target" of this link.
+
+=cut
+
+sub TargetURI {
+    my $self = shift;
+    my $URI = RT::URI->new($self->CurrentUser);
+    $URI->FromURI($self->Target);
+    return ($URI);
+}
+
+# }}}
+# {{{ sub TargetObj 
+
+=head2 TargetObj
+
+=cut
+
+sub TargetObj {
+  my $self = shift;
+   return $self->TargetURI->Object;
+}
+# }}}
+
+# {{{ BaseURI
+
+=head2 BaseURI
+
+returns an RT::URI object for the "Base" of this link.
+
+=cut
+
+sub BaseURI {
+    my $self = shift;
+    my $URI = RT::URI->new($self->CurrentUser);
+    $URI->FromURI($self->Base);
+    return ($URI);
+}
+
+# }}}
+# {{{ sub BaseObj
+
+=head2 BaseObj
+
+=cut
+
+sub BaseObj {
+  my $self = shift;
+  return $self->BaseURI->Object;
+}
+# }}}
+
+
+
+# Static methods:
+
+# {{{ sub BaseIsLocal
+
+=head2 BaseIsLocal
+
+Returns true if the base of this link is a local ticket
+
+=cut
+
+sub BaseIsLocal {
+  my $self = shift;
+  $RT::Logger->crit("Link::BaseIsLocal is deprecated in favor of Link->BaseURI->IsLocal");
+  return $self->BaseURI->IsLocal;
+}
+
+# }}}
+
+# {{{ sub TargetIsLocal
+
+=head2 TargetIsLocal
+
+Returns true if the target of this link is a local ticket
+
+=cut
+
+sub TargetIsLocal {
+  my $self = shift;
+  $RT::Logger->crit("Link::BaseIsLocal is deprecated in favor of Link->BaseURI->IsLocal");
+  return $self->TargetURI->IsLocal;
+}
+
+# }}}
+
+
+# {{{ sub BaseAsHREF 
+
+=head2 BaseAsHREF
+
+Returns an HTTP url to access the base of this link
+
+=cut
+
+sub BaseAsHREF {
+  my $self = shift;
+  $RT::Logger->crit("Link::BaseAsHREF deprecated in favor of ->BaseURI->AsHREF");
+  return $self->BaseURI->HREF;
+}
+# }}}
+
+# {{{ sub TargetAsHREF 
+
+=head2 TargetAsHREF
+
+return an HTTP url to access the target of this link
+
+=cut
+
+sub TargetAsHREF {
+  my $self = shift;
+  $RT::Logger->crit("Link::TargetAsHREF deprecated in favor of ->TargetURI->AsHREF");
+  return $self->TargetURI->HREF;
+}
+# }}}
+
+# {{{ sub AsHREF - Converts Link URIs to HTTP URLs
+
+=head2 URI
+
+Takes a URI and returns an http: url to access that object.
+
+=cut
+
+
+sub AsHREF {
+    my $self=shift;
+   
+    $RT::Logger->crit("AsHREF is gone. look at URI::HREF to figure out what to do with \$URI");
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/Links_Overlay.pm b/rt/lib/RT/Links_Overlay.pm
new file mode 100644 (file)
index 0000000..d788a42
--- /dev/null
@@ -0,0 +1,125 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Links - A collection of Link objects
+
+=head1 SYNOPSIS
+
+  use RT::Links;
+  my $links = new RT::Links($CurrentUser);
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Links);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+use RT::URI;
+
+# {{{ sub Limit 
+sub Limit  {
+    my $self = shift;
+    my %args = ( ENTRYAGGREGATOR => 'AND',
+                OPERATOR => '=',
+                @_);
+    
+    #if someone's trying to search for tickets, try to resolve the uris for searching.
+    
+    if (  ( $args{'OPERATOR'} eq '=') and
+         ( $args{'FIELD'}  eq 'Base') or ($args{'FIELD'} eq 'Target')
+       ) {
+         my $dummy = RT::URI->new($self->CurrentUser);
+          $dummy->FromURI($args{'VALUE'});
+          # $uri = $dummy->URI;
+    }
+
+
+    # If we're limiting by target, order by base
+    # (Order by the thing that's changing)
+
+    if ( ($args{'FIELD'} eq 'Target') or 
+        ($args{'FIELD'} eq 'LocalTarget') ) {
+       $self->OrderBy (ALIAS => 'main',
+                       FIELD => 'Base',
+                       ORDER => 'ASC');
+    }
+    elsif ( ($args{'FIELD'} eq 'Base') or 
+           ($args{'FIELD'} eq 'LocalBase') ) {
+       $self->OrderBy (ALIAS => 'main',
+                       FIELD => 'Target',
+                       ORDER => 'ASC');
+    }
+    
+
+    $self->SUPER::Limit(%args);
+}
+# }}}
+
+# {{{ LimitRefersTo 
+
+=head2 LimitRefersTo URI
+
+find all things that refer to URI
+
+=cut
+
+sub LimitRefersTo {
+    my $self = shift;
+    my $URI = shift;
+
+    $self->Limit(FIELD => 'Type', VALUE => 'RefersTo');
+    $self->Limit(FIELD => 'Target', VALUE => $URI);
+}
+
+# }}}
+# {{{ LimitReferredToBy
+
+=head2 LimitReferredToBy URI
+
+find all things that URI refers to
+
+=cut
+
+sub LimitReferredToBy {
+    my $self = shift;
+    my $URI = shift;
+
+    $self->Limit(FIELD => 'Type', VALUE => 'RefersTo');
+    $self->Limit(FIELD => 'Base', VALUE => $URI);
+}
+
+# }}}
+1;
+
diff --git a/rt/lib/RT/Principal.pm b/rt/lib/RT/Principal.pm
new file mode 100644 (file)
index 0000000..cffee4c
--- /dev/null
@@ -0,0 +1,212 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+RT::Principal
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=cut
+
+package RT::Principal;
+use RT::Record; 
+
+
+use vars qw( @ISA );
+@ISA= qw( RT::Record );
+
+sub _Init {
+  my $self = shift; 
+
+  $self->Table('Principals');
+  $self->SUPER::_Init(@_);
+}
+
+
+
+
+
+=item Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  varchar(16) 'PrincipalType'.
+  int(11) 'ObjectId'.
+  smallint(6) 'Disabled'.
+
+=cut
+
+
+
+
+sub Create {
+    my $self = shift;
+    my %args = ( 
+                PrincipalType => '',
+                ObjectId => '',
+                Disabled => '0',
+
+                 @_);
+    $self->SUPER::Create(
+                         PrincipalType => $args{'PrincipalType'},
+                         ObjectId => $args{'ObjectId'},
+                         Disabled => $args{'Disabled'},
+);
+
+}
+
+
+
+=item id
+
+Returns the current value of id. 
+(In the database, id is stored as int(11).)
+
+
+=cut
+
+
+=item PrincipalType
+
+Returns the current value of PrincipalType. 
+(In the database, PrincipalType is stored as varchar(16).)
+
+
+
+=item SetPrincipalType VALUE
+
+
+Set PrincipalType to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, PrincipalType will be stored as a varchar(16).)
+
+
+=cut
+
+
+=item ObjectId
+
+Returns the current value of ObjectId. 
+(In the database, ObjectId is stored as int(11).)
+
+
+
+=item SetObjectId VALUE
+
+
+Set ObjectId to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, ObjectId will be stored as a int(11).)
+
+
+=cut
+
+
+=item Disabled
+
+Returns the current value of Disabled. 
+(In the database, Disabled is stored as smallint(6).)
+
+
+
+=item SetDisabled VALUE
+
+
+Set Disabled to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Disabled will be stored as a smallint(6).)
+
+
+=cut
+
+
+
+sub _ClassAccessible {
+    {
+     
+        id =>
+               {read => 1, type => 'int(11)', default => ''},
+        PrincipalType => 
+               {read => 1, write => 1, type => 'varchar(16)', default => ''},
+        ObjectId => 
+               {read => 1, write => 1, type => 'int(11)', default => ''},
+        Disabled => 
+               {read => 1, write => 1, type => 'smallint(6)', default => '0'},
+
+ }
+};
+
+
+        eval "require RT::Principal_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/Principal_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::Principal_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/Principal_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::Principal_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/Principal_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::Principal_Overlay, RT::Principal_Vendor, RT::Principal_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/Principal_Overlay.pm b/rt/lib/RT/Principal_Overlay.pm
new file mode 100644 (file)
index 0000000..d2782b7
--- /dev/null
@@ -0,0 +1,557 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+
+no warnings qw(redefine);
+use vars qw(%_ACL_KEY_CACHE);
+
+use RT::Group;
+use RT::User;
+
+# {{{ IsGroup
+
+=head2 IsGroup
+
+Returns true if this principal is a group. 
+Returns undef, otherwise
+
+=cut
+
+sub IsGroup {
+    my $self = shift;
+    if ($self->PrincipalType eq 'Group') {
+        return(1);
+    }
+    else {
+        return undef;
+    }
+}
+
+# }}}
+
+# {{{ IsUser
+
+=head2 IsUser 
+
+Returns true if this principal is a User. 
+Returns undef, otherwise
+
+=cut
+
+sub IsUser {
+    my $self = shift;
+    if ($self->PrincipalType eq 'User') {
+        return(1);
+    }
+    else {
+        return undef;
+    }
+}
+
+# }}}
+
+# {{{ Object
+
+=head2 Object
+
+Returns the user or group associated with this principal
+
+=cut
+
+sub Object {
+    my $self = shift;
+
+    unless ($self->{'object'}) {
+    if ($self->IsUser) {
+       $self->{'object'} = RT::User->new($self->CurrentUser);
+    }
+    elsif ($self->IsGroup) {
+        $self->{'object'}  = RT::Group->new($self->CurrentUser);
+    }
+    else { 
+        $RT::Logger->crit("Found a principal (".$self->Id.") that was neither a user nor a group");
+        return(undef);
+    }
+    $self->{'object'}->Load($self->ObjectId());
+    }
+    return ($self->{'object'});
+
+
+}
+# }}} 
+
+# {{{ ACL Related routines
+
+# {{{ GrantRight 
+
+=head2 GrantRight  { Right => RIGHTNAME, Object => undef }
+
+A helper function which calls RT::ACE->Create
+
+=cut
+
+sub GrantRight {
+    my $self = shift;
+    my %args = ( Right => undef,
+                Object => undef,
+                @_);
+
+
+    #if we haven't specified any sort of right, we're talking about a global right
+    if (!defined $args{'Object'} && !defined $args{'ObjectId'} && !defined $args{'ObjectType'}) {
+        $args{'Object'} = $RT::System;
+    }
+
+    unless ($args{'Right'}) {
+        return(0, $self->loc("Invalid Right"));
+    }
+
+
+    #ACL check handled in ACE.pm
+    my $ace = RT::ACE->new( $self->CurrentUser );
+
+
+    my $type = $self->_GetPrincipalTypeForACL();
+
+    # If it's a user, we really want to grant the right to their 
+    # user equivalence group
+        return ( $ace->Create(RightName => $args{'Right'},
+                          Object => $args{'Object'},
+                          PrincipalType =>  $type,
+                          PrincipalId => $self->Id
+                          ) );
+}
+# }}}
+
+# {{{ RevokeRight
+
+=head2 RevokeRight { Right => "RightName", Object => "object" }
+
+Delete a right that a user has 
+
+=cut
+
+sub RevokeRight {
+
+    my $self = shift;
+    my %args = (
+        Right      => undef,
+        Object => undef,
+        @_
+    );
+
+    #if we haven't specified any sort of right, we're talking about a global right
+    if (!defined $args{'Object'} && !defined $args{'ObjectId'} && !defined $args{'ObjectType'}) {
+        $args{'Object'} = $RT::System;
+    }
+    #ACL check handled in ACE.pm
+    my $type = $self->_GetPrincipalTypeForACL();
+
+    my $ace = RT::ACE->new( $self->CurrentUser );
+    $ace->LoadByValues(
+        RightName     => $args{'Right'},
+        Object    => $args{'Object'},
+        PrincipalType => $type,
+        PrincipalId   => $self->Id
+    );
+
+    unless ( $ace->Id ) {
+        return ( 0, $self->loc("ACE not found") );
+    }
+    return ( $ace->Delete );
+}
+
+# }}}
+
+
+
+# {{{ sub HasRight
+
+=head2 sub HasRight (Right => 'right' Object => undef)
+
+
+Checks to see whether this principal has the right "Right" for the Object
+specified. If the Object parameter is omitted, checks to see whether the 
+user has the right globally.
+
+This still hard codes to check to see if a user has queue-level rights
+if we ask about a specific ticket.
+
+
+This takes the params:
+
+    Right => name of a right
+
+    And either:
+
+    Object => an RT style object (->id will get its id)
+
+
+
+
+Returns 1 if a matching ACE was found.
+
+Returns undef if no ACE was found.
+
+=cut
+
+sub HasRight {
+
+    my $self = shift;
+    my %args = ( Right      => undef,
+                 Object     => undef,
+                 EquivObjects    => undef,
+                 @_ );
+
+    if ( $self->Disabled ) {
+        $RT::Logger->err( "Disabled User:  " . $self->id . " failed access check for " . $args{'Right'} );
+        return (undef);
+    }
+
+    if ( !defined $args{'Right'} ) {
+        require Carp;
+        $RT::Logger->debug( Carp::cluck("HasRight called without a right") );
+        return (undef);
+    }
+
+    if ( defined( $args{'Object'} )) {
+        return (undef) unless (UNIVERSAL::can( $args{'Object'}, 'id' ) );
+        push(@{$args{'EquivObjects'}}, $args{Object});
+    }
+    elsif ( $args{'ObjectId'} && $args{'ObjectType'} ) {
+        $RT::Logger->crit(Carp::cluck("API not supprted"));
+    }
+    else {
+        $RT::Logger->crit("$self HasRight called with no valid object");
+        return (undef);
+    }
+
+    # If this object is a ticket, we care about ticket roles and queue roles
+    if ( (ref($args{'Object'}) eq 'RT::Ticket') && $args{'Object'}->Id) {
+        # this is a little bit hacky, but basically, now that we've done the ticket roles magic, we load the queue object
+        # and ask all the rest of our questions about the queue.
+        push (@{$args{'EquivObjects'}}, $args{'Object'}->QueueObj);
+
+    }
+
+
+    # {{{ If we've cached a win or loss for this lookup say so
+
+    # {{{ Construct a hashkey to cache decisions in
+    my $hashkey = do {
+       no warnings 'uninitialized';
+        
+       # We don't worry about the hash ordering, as this is only
+       # temporarily used; also if the key changes it would be
+       # invalidated anyway.
+        join (
+            ";:;", $self->Id, map {
+                $_,                              # the key of each arguments
+                ($_ eq 'EquivObjects')           # for object arrayref...
+                   ? map(_ReferenceId($_), @{$args{$_}}) # calculate each
+                    : _ReferenceId( $args{$_} ) # otherwise just the value
+            } keys %args
+        );
+    };
+    # }}}
+
+    #Anything older than 60 seconds needs to be rechecked
+    my $cache_timeout = ( time - 60 );
+
+    # {{{ if we've cached a positive result for this query, return 1
+    if (    ( defined $self->_ACLCache->{"$hashkey"} )
+         && ( $self->_ACLCache->{"$hashkey"}{'val'} == 1 )
+         && ( defined $self->_ACLCache->{"$hashkey"}{'set'} )
+         && ( $self->_ACLCache->{"$hashkey"}{'set'} > $cache_timeout ) ) {
+
+        #$RT::Logger->debug("Cached ACL win for ".  $args{'Right'}.$args{'Scope'}.  $args{'AppliesTo'}."\n");      
+        return ( 1);
+    }
+    # }}}
+
+    #  {{{ if we've cached a negative result for this query return undef
+    elsif (    ( defined $self->_ACLCache->{"$hashkey"} )
+            && ( $self->_ACLCache->{"$hashkey"}{'val'} == -1 )
+            && ( defined $self->_ACLCache->{"$hashkey"}{'set'} )
+            && ( $self->_ACLCache->{"$hashkey"}{'set'} > $cache_timeout ) ) {
+
+        #$RT::Logger->debug("Cached ACL loss decision for ".  $args{'Right'}.$args{'Scope'}.  $args{'AppliesTo'}."\n");            
+
+        return (undef);
+    }
+    # }}}
+
+    # }}}
+
+
+
+    #  {{{ Out of date docs
+    
+    #   We want to grant the right if:
+
+
+    #    # The user has the right as a member of a system-internal or 
+    #    # user-defined group
+    #
+    #    Find all records from the ACL where they're granted to a group 
+    #    of type "UserDefined" or "System"
+    #    for the object "System or the object "Queue N" and the group we're looking
+    #    at has the recursive member $self->Id
+    #
+    #    # The user has the right based on a role
+    #
+    #    Find all the records from ACL where they're granted to the role "foo"
+    #    for the object "System" or the object "Queue N" and the group we're looking
+    #   at is of domain  ("RT::Queue-Role" and applies to the right queue)
+    #                             or ("RT::Ticket-Role" and applies to the right ticket)
+    #    and the type is the same as the type of the ACL and the group has
+    #    the recursive member $self->Id
+    #
+
+    # }}}
+
+    my ( $or_look_at_object_rights, $or_check_roles );
+    my $right = $args{'Right'};
+
+    # {{{ Construct Right Match
+
+    # If an object is defined, we want to look at rights for that object
+   
+    my @look_at_objects;
+    push (@look_at_objects, "ACL.ObjectType = 'RT::System'")
+        unless $self->can('_IsOverrideGlobalACL') and $self->_IsOverrideGlobalACL($args{Object});
+
+
+
+    foreach my $obj (@{$args{'EquivObjects'}}) {
+            next unless (UNIVERSAL::can($obj, 'id'));
+            my $type = ref($obj);
+            my $id = $obj->id;
+            push @look_at_objects, "(ACL.ObjectType = '$type' AND ACL.ObjectId = '$id')"; 
+            }
+
+     
+    # }}}
+
+    # {{{ Build that honkin-big SQL query
+
+    
+
+    my $query_base = "SELECT ACL.id from ACL, Groups, Principals, CachedGroupMembers WHERE  ".
+    # Only find superuser or rights with the name $right
+   "(ACL.RightName = 'SuperUser' OR  ACL.RightName = '$right') ".
+   # Never find disabled groups.
+   "AND Principals.Disabled = 0 " .
+   "AND CachedGroupMembers.Disabled = 0  ".
+    "AND Principals.id = Groups.id " .  # We always grant rights to Groups
+
+    # See if the principal is a member of the group recursively or _is the rightholder_
+    # never find recursively disabled group members
+    # also, check to see if the right is being granted _directly_ to this principal,
+    #  as is the case when we want to look up group rights
+    "AND  Principals.id = CachedGroupMembers.GroupId AND CachedGroupMembers.MemberId = '" . $self->Id . "' ".
+
+    # Make sure the rights apply to the entire system or to the object in question
+    "AND ( ".join(' OR ', @look_at_objects).") ";
+
+
+
+    # The groups query does the query based on group membership and individual user rights
+
+       my $groups_query = $query_base . 
+
+    # limit the result set to groups of types ACLEquivalence (user)  UserDefined, SystemInternal and Personal
+    "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";
+        
+    my @roles;
+    foreach my $object (@{$args{'EquivObjects'}}) { 
+          push (@roles, $self->_RolesForObject(ref($object), $object->id));
+    }
+
+    # The roles query does the query based on roles
+    my $roles_query;
+    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";
+
+   }
+
+
+
+    # }}}
+
+    # {{{ Actually check the ACL by performing an SQL query
+    #   $RT::Logger->debug("Now Trying $groups_query");        
+    my $hitcount = $self->_Handle->FetchResult($groups_query);
+
+    # }}}
+    
+    # {{{ if there's a match, the right is granted 
+    if ($hitcount) {
+
+        # Cache a positive hit.
+        $self->_ACLCache->{"$hashkey"}{'set'} = time;
+        $self->_ACLCache->{"$hashkey"}{'val'} = 1;
+        return (1);
+    }
+    # }}}
+    # {{{ If there's no match on groups, try it on roles
+    else {   
+
+       $hitcount = $self->_Handle->FetchResult($roles_query);
+
+        if ($hitcount) {
+
+            # Cache a positive hit.
+            $self->_ACLCache->{"$hashkey"}{'set'} = time;
+            $self->_ACLCache->{"$hashkey"}{'val'} = 1;
+            return (1);
+           }
+
+        else {
+            # cache a negative hit
+            $self->_ACLCache->{"$hashkey"}{'set'} = time;
+            $self->_ACLCache->{"$hashkey"}{'val'} = -1;
+
+            return (undef);
+           }
+    }
+    # }}}
+}
+
+# }}}
+
+# {{{ _RolesForObject
+
+
+
+=head2 _RolesForObject( $object_type, $object_id)
+
+Returns an SQL clause finding role groups for Objects
+
+=cut
+
+
+sub _RolesForObject {
+    my $self = shift;
+    my $type = shift;
+    my $id = shift;
+    my $clause = "(Groups.Domain = '".$type."-Role' AND Groups.Instance = '" . $id. "') ";
+
+    return($clause);
+}
+
+# }}}
+
+# }}}
+
+# {{{ ACL caching
+
+# {{{ _ACLCache
+
+=head2 _ACLCache
+
+# Function: _ACLCache
+# Type    : private instance
+# Args    : none
+# Lvalue  : hash: ACLCache
+# Desc    : Returns a reference to the Key cache hash
+
+=cut
+
+sub _ACLCache {
+    return(\%_ACL_KEY_CACHE);
+}
+
+# }}}
+
+# {{{ _InvalidateACLCache
+
+=head2 _InvalidateACLCache
+
+Cleans out and reinitializes the user rights key cache
+
+=cut
+
+sub _InvalidateACLCache {
+    %_ACL_KEY_CACHE = ();
+}
+
+# }}}
+
+# }}}
+
+
+# {{{ _GetPrincipalTypeForACL
+
+=head2 _GetPrincipalTypeForACL
+
+Gets the principal type. if it's a user, it's a user. if it's a role group and it has a Type, 
+return that. if it has no type, return group.
+
+=cut
+
+sub _GetPrincipalTypeForACL {
+    my $self = shift;
+    my $type;    
+    if ($self->PrincipalType eq 'Group' && $self->Object->Domain =~ /Role$/) {
+        $type = $self->Object->Type;
+    }
+    else {
+        $type = $self->PrincipalType;
+    }
+
+    return($type);
+}
+
+# }}}
+
+# {{{ _ReferenceId
+
+=head2 _ReferenceId
+
+Returns a list uniquely representing an object or normal scalar.
+
+For scalars, its string value is returned; for objects that has an
+id() method, its class name and Id are returned as a string seperated by a "-".
+
+=cut
+
+sub _ReferenceId {
+    my $scalar = shift;
+
+    # just return the value for non-objects
+    return $scalar unless UNIVERSAL::can($scalar, 'id');
+
+    # an object -- return the class and id
+    return(ref($scalar)."-". $scalar->id);
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/Principals.pm b/rt/lib/RT/Principals.pm
new file mode 100644 (file)
index 0000000..c45a4c7
--- /dev/null
@@ -0,0 +1,115 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+  RT::Principals -- Class Description
+=head1 SYNOPSIS
+
+  use RT::Principals
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=cut
+
+package RT::Principals;
+
+use RT::SearchBuilder;
+use RT::Principal;
+
+use vars qw( @ISA );
+@ISA= qw(RT::SearchBuilder);
+
+
+sub _Init {
+    my $self = shift;
+    $self->{'table'} = 'Principals';
+    $self->{'primary_key'} = 'id';
+
+
+    return ( $self->SUPER::_Init(@_) );
+}
+
+
+=item NewItem
+
+Returns an empty new RT::Principal item
+
+=cut
+
+sub NewItem {
+    my $self = shift;
+    return(RT::Principal->new($self->CurrentUser));
+}
+
+        eval "require RT::Principals_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/Principals_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::Principals_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/Principals_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::Principals_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/Principals_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::Principals_Overlay, RT::Principals_Vendor, RT::Principals_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/Principals_Overlay.pm b/rt/lib/RT/Principals_Overlay.pm
new file mode 100644 (file)
index 0000000..0d8c54c
--- /dev/null
@@ -0,0 +1,52 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Principals - a collection of RT::Principal objects
+
+=head1 SYNOPSIS
+
+  use RT::Principals;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Principals);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+
+
+1;
diff --git a/rt/lib/RT/Queue_Overlay.pm b/rt/lib/RT/Queue_Overlay.pm
new file mode 100644 (file)
index 0000000..4eb265f
--- /dev/null
@@ -0,0 +1,1012 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Queue - an RT Queue object
+
+=head1 SYNOPSIS
+
+  use RT::Queue;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing 
+
+use RT::Queue;
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use vars qw(@STATUS @ACTIVE_STATUS @INACTIVE_STATUS $RIGHTS);
+use RT::Groups;
+use RT::ACL;
+
+
+@ACTIVE_STATUS = qw(new open stalled);
+@INACTIVE_STATUS = qw(resolved rejected deleted);
+@STATUS = (@ACTIVE_STATUS, @INACTIVE_STATUS);
+
+# $self->loc('new'); # For the string extractor to get a string to localize
+# $self->loc('open'); # For the string extractor to get a string to localize
+# $self->loc('stalled'); # For the string extractor to get a string to localize
+# $self->loc('resolved'); # For the string extractor to get a string to localize
+# $self->loc('rejected'); # For the string extractor to get a string to localize
+# $self->loc('deleted'); # For the string extractor to get a string to localize
+
+
+$RIGHTS = {
+    SeeQueue            => 'Can this principal see this queue',       # loc_pair
+    AdminQueue          => 'Create, delete and modify queues',        # loc_pair
+    ShowACL             => 'Display Access Control List',             # loc_pair
+    ModifyACL           => 'Modify Access Control List',              # loc_pair
+    ModifyQueueWatchers => 'Modify the queue watchers',               # loc_pair
+    AdminCustomFields   => 'Create, delete and modify custom fields', # loc_pair
+    ModifyTemplate      => 'Modify Scrip templates for this queue',   # loc_pair
+    ShowTemplate        => 'Display Scrip templates for this queue',  # loc_pair
+
+    ModifyScrips => 'Modify Scrips for this queue',                   # loc_pair
+    ShowScrips   => 'Display Scrips for this queue',                  # loc_pair
+
+    ShowTicket         => 'Show ticket summaries',                    # loc_pair
+    ShowTicketComments => 'Show ticket private commentary',           # loc_pair
+
+    Watch => 'Sign up as a ticket Requestor or ticket or queue Cc',   # loc_pair
+    WatchAsAdminCc  => 'Sign up as a ticket or queue AdminCc',        # loc_pair
+    CreateTicket    => 'Create tickets in this queue',                # loc_pair
+    ReplyToTicket   => 'Reply to tickets',                            # loc_pair
+    CommentOnTicket => 'Comment on tickets',                          # loc_pair
+    OwnTicket       => 'Own tickets',                                 # loc_pair
+    ModifyTicket    => 'Modify tickets',                              # loc_pair
+    DeleteTicket    => 'Delete tickets',                              # loc_pair
+    TakeTicket      => 'Take tickets',                                # loc_pair
+    StealTicket     => 'Steal tickets',                               # loc_pair
+
+};
+
+# Tell RT::ACE that this sort of object can get acls granted
+$RT::ACE::OBJECT_TYPES{'RT::Queue'} = 1;
+
+# TODO: This should be refactored out into an RT::ACLedObject or something
+# stuff the rights into a hash of rights that can exist.
+
+foreach my $right ( keys %{$RIGHTS} ) {
+    $RT::ACE::LOWERCASERIGHTNAMES{ lc $right } = $right;
+}
+    
+
+=head2 AvailableRights
+
+Returns a hash of available rights for this object. The keys are the right names and the values are a description of what the rights do
+
+=cut
+
+sub AvailableRights {
+    my $self = shift;
+    return($RIGHTS);
+}
+
+# {{{ ActiveStatusArray
+
+=head2 ActiveStatusArray
+
+Returns an array of all ActiveStatuses for this queue
+
+=cut
+
+sub ActiveStatusArray {
+    my $self = shift;
+    return (@ACTIVE_STATUS);
+}
+
+# }}}
+
+# {{{ InactiveStatusArray
+
+=head2 InactiveStatusArray
+
+Returns an array of all InactiveStatuses for this queue
+
+=cut
+
+sub InactiveStatusArray {
+    my $self = shift;
+    return (@INACTIVE_STATUS);
+}
+
+# }}}
+
+# {{{ StatusArray
+
+=head2 StatusArray
+
+Returns an array of all statuses for this queue
+
+=cut
+
+sub StatusArray {
+    my $self = shift;
+    return (@STATUS);
+}
+
+# }}}
+
+# {{{ IsValidStatus
+
+=head2 IsValidStatus VALUE
+
+Returns true if VALUE is a valid status.  Otherwise, returns 0
+
+=for testing
+my $q = RT::Queue->new($RT::SystemUser);
+ok($q->IsValidStatus('new')== 1, 'New is a valid status');
+ok($q->IsValidStatus('f00')== 0, 'f00 is not a valid status');
+
+=cut
+
+sub IsValidStatus {
+    my $self  = shift;
+    my $value = shift;
+
+    my $retval = grep ( /^$value$/, $self->StatusArray );
+    return ($retval);
+
+}
+
+# }}}
+
+# {{{ IsActiveStatus
+
+=head2 IsActiveStatus VALUE
+
+Returns true if VALUE is a Active status.  Otherwise, returns 0
+
+=for testing
+my $q = RT::Queue->new($RT::SystemUser);
+ok($q->IsActiveStatus('new')== 1, 'New is a Active status');
+ok($q->IsActiveStatus('rejected')== 0, 'Rejected is an inactive status');
+ok($q->IsActiveStatus('f00')== 0, 'f00 is not a Active status');
+
+=cut
+
+sub IsActiveStatus {
+    my $self  = shift;
+    my $value = shift;
+
+    my $retval = grep ( /^$value$/, $self->ActiveStatusArray );
+    return ($retval);
+
+}
+
+# }}}
+
+# {{{ IsInactiveStatus
+
+=head2 IsInactiveStatus VALUE
+
+Returns true if VALUE is a Inactive status.  Otherwise, returns 0
+
+=for testing
+my $q = RT::Queue->new($RT::SystemUser);
+ok($q->IsInactiveStatus('new')== 0, 'New is a Active status');
+ok($q->IsInactiveStatus('rejected')== 1, 'rejeected is an Inactive status');
+ok($q->IsInactiveStatus('f00')== 0, 'f00 is not a Active status');
+
+=cut
+
+sub IsInactiveStatus {
+    my $self  = shift;
+    my $value = shift;
+
+    my $retval = grep ( /^$value$/, $self->InactiveStatusArray );
+    return ($retval);
+
+}
+
+# }}}
+
+
+# {{{ sub Create
+
+=head2 Create
+
+Create takes the name of the new queue 
+If you pass the ACL check, it creates the queue and returns its queue id.
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = (
+        Name              => undef,
+        CorrespondAddress => '',
+        Description       => '',
+        CommentAddress    => '',
+        InitialPriority   => "0",
+        FinalPriority     => "0",
+        DefaultDueIn      => "0",
+        @_
+    );
+
+    unless ( $self->CurrentUser->HasRight(Right => 'AdminQueue', Object => $RT::System) )
+    {    #Check them ACLs
+        return ( 0, $self->loc("No permission to create queues") );
+    }
+
+    unless ( $self->ValidateName( $args{'Name'} ) ) {
+        return ( 0, $self->loc('Queue already exists') );
+    }
+
+    #TODO better input validation
+    $RT::Handle->BeginTransaction();
+
+    my $id = $self->SUPER::Create(%args);
+    unless ($id) {
+        $RT::Handle->Rollback();
+        return ( 0, $self->loc('Queue could not be created') );
+    }
+
+    my $create_ret = $self->_CreateQueueGroups();
+    unless ($create_ret) {
+        $RT::Handle->Rollback();
+        return ( 0, $self->loc('Queue could not be created') );
+    }
+
+    $RT::Handle->Commit();
+    return ( $id, $self->loc("Queue created") );
+}
+
+# }}}
+
+# {{{ sub Delete 
+
+sub Delete {
+    my $self = shift;
+    return ( 0,
+        $self->loc('Deleting this object would break referential integrity') );
+}
+
+# }}}
+
+# {{{ sub SetDisabled
+
+=head2 SetDisabled
+
+Takes a boolean.
+1 will cause this queue to no longer be avaialble for tickets.
+0 will re-enable this queue
+
+=cut
+
+# }}}
+
+# {{{ sub Load 
+
+=head2 Load
+
+Takes either a numerical id or a textual Name and loads the specified queue.
+
+=cut
+
+sub Load {
+    my $self = shift;
+
+    my $identifier = shift;
+    if ( !$identifier ) {
+        return (undef);
+    }
+
+    if ( $identifier =~ /^(\d+)$/ ) {
+        $self->SUPER::LoadById($identifier);
+    }
+    else {
+        $self->LoadByCol( "Name", $identifier );
+    }
+
+    return ( $self->Id );
+
+}
+
+# }}}
+
+# {{{ sub ValidateName
+
+=head2 ValidateName NAME
+
+Takes a queue name. Returns true if it's an ok name for
+a new queue. Returns undef if there's already a queue by that name.
+
+=cut
+
+sub ValidateName {
+    my $self = shift;
+    my $name = shift;
+
+    my $tempqueue = new RT::Queue($RT::SystemUser);
+    $tempqueue->Load($name);
+
+    #If we couldn't load it :)
+    unless ( $tempqueue->id() ) {
+        return (1);
+    }
+
+    #If this queue exists, return undef
+    #Avoid the ACL check.
+    if ( $tempqueue->Name() ) {
+        return (undef);
+    }
+
+    #If the queue doesn't exist, return 1
+    else {
+        return (1);
+    }
+
+}
+
+# }}}
+
+# {{{ sub Templates
+
+=head2 Templates
+
+Returns an RT::Templates object of all of this queue's templates.
+
+=cut
+
+sub Templates {
+    my $self = shift;
+
+    my $templates = RT::Templates->new( $self->CurrentUser );
+
+    if ( $self->CurrentUserHasRight('ShowTemplate') ) {
+        $templates->LimitToQueue( $self->id );
+    }
+
+    return ($templates);
+}
+
+# }}}
+
+# {{{ Dealing with custom fields
+
+# {{{  CustomField
+
+=item CustomField NAME
+
+Load the queue-specific custom field named NAME
+
+=cut
+
+sub CustomField {
+    my $self = shift;
+    my $name = shift;
+    my $cf = RT::CustomField->new($self->CurrentUser);
+    $cf->LoadByNameAndQueue(Name => $name, Queue => $self->Id); 
+    return ($cf);
+}
+
+
+# {{{ CustomFields
+
+=item CustomFields
+
+Returns an RT::CustomFields object containing all global custom fields, as well as those tied to this queue
+
+=cut
+
+sub CustomFields {
+    my $self = shift;
+
+    my $cfs = RT::CustomFields->new( $self->CurrentUser );
+    if ( $self->CurrentUserHasRight('SeeQueue') ) {
+        $cfs->LimitToGlobalOrQueue( $self->Id );
+    }
+    return ($cfs);
+}
+
+# }}}
+
+# }}}
+
+
+# {{{ Routines dealing with watchers.
+
+# {{{ _CreateQueueGroups 
+
+=head2 _CreateQueueGroups
+
+Create the ticket groups and relationships for this ticket. 
+This routine expects to be called from Ticket->Create _inside of a transaction_
+
+It will create four groups for this ticket: Requestor, Cc, AdminCc and Owner.
+
+It will return true on success and undef on failure.
+
+=begin testing
+
+my $Queue = RT::Queue->new($RT::SystemUser); my ($id, $msg) = $Queue->Create(Name => "Foo",
+                );
+ok ($id, "Foo $id was created");
+ok(my $group = RT::Group->new($RT::SystemUser));
+ok($group->LoadQueueRoleGroup(Queue => $id, Type=> 'Cc'));
+ok ($group->Id, "Found the requestors object for this Queue");
+
+
+ok ((my $add_id, $add_msg) = $Queue->AddWatcher(Type => 'Cc', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
+ok ($add_id, "Add succeeded: ($add_msg)");
+ok(my $bob = RT::User->new($RT::SystemUser), "Creating a bob rt::user");
+$bob->LoadByEmail('bob@fsck.com');
+ok($bob->Id,  "Found the bob rt user");
+ok ($Queue->IsWatcher(Type => 'Cc', PrincipalId => $bob->PrincipalId), "The Queue actually has bob at fsck.com as a requestor");;
+ok ((my $add_id, $add_msg) = $Queue->DeleteWatcher(Type =>'Cc', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
+ok (!$Queue->IsWatcher(Type => 'Cc', Principal => $bob->PrincipalId), "The Queue no longer has bob at fsck.com as a requestor");;
+
+
+$group = RT::Group->new($RT::SystemUser);
+ok($group->LoadQueueRoleGroup(Queue => $id, Type=> 'Cc'));
+ok ($group->Id, "Found the cc object for this Queue");
+$group = RT::Group->new($RT::SystemUser);
+ok($group->LoadQueueRoleGroup(Queue => $id, Type=> 'AdminCc'));
+ok ($group->Id, "Found the AdminCc object for this Queue");
+
+=end testing
+
+=cut
+
+
+sub _CreateQueueGroups {
+    my $self = shift;
+
+    my @types = qw(Cc AdminCc Requestor Owner);
+
+    foreach my $type (@types) {
+        my $type_obj = RT::Group->new($self->CurrentUser);
+        my ($id, $msg) = $type_obj->CreateRoleGroup(Instance => $self->Id, 
+                                                     Type => $type,
+                                                     Domain => 'RT::Queue-Role');
+        unless ($id) {
+            $RT::Logger->error("Couldn't create a Queue group of type '$type' for ticket ".
+                               $self->Id.": ".$msg);
+            return(undef);
+        }
+     }
+    return(1);
+   
+}
+
+
+# }}}
+
+# {{{ sub AddWatcher
+
+=head2 AddWatcher
+
+AddWatcher takes a parameter hash. The keys are as follows:
+
+Type        One of Requestor, Cc, AdminCc
+
+PrinicpalId The RT::Principal id of the user or group that's being added as a watcher
+Email       The email address of the new watcher. If a user with this 
+            email address can't be found, a new nonprivileged user will be created.
+
+If the watcher you\'re trying to set has an RT account, set the Owner paremeter to their User Id. Otherwise, set the Email parameter to their Email address.
+
+=cut
+
+sub AddWatcher {
+    my $self = shift;
+    my %args = (
+        Type  => undef,
+        PrincipalId => undef,
+        Email => undef,
+        @_
+    );
+
+    # {{{ Check ACLS
+    #If the watcher we're trying to add is for the current user
+    if ( $self->CurrentUser->PrincipalId  eq $args{'PrincipalId'}) {
+        #  If it's an AdminCc and they don't have 
+        #   'WatchAsAdminCc' or 'ModifyTicket', bail
+        if ( $args{'Type'} eq 'AdminCc' ) {
+            unless ( $self->CurrentUserHasRight('ModifyQueueWatchers')
+                or $self->CurrentUserHasRight('WatchAsAdminCc') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+
+        #  If it's a Requestor or Cc and they don't have
+        #   'Watch' or 'ModifyTicket', bail
+        elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) {
+
+            unless ( $self->CurrentUserHasRight('ModifyQueueWatchers')
+                or $self->CurrentUserHasRight('Watch') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+     else {
+            $RT::Logger->warn( "$self -> AddWatcher got passed a bogus type");
+            return ( 0, $self->loc('Error in parameters to Queue->AddWatcher') );
+        }
+    }
+
+    # If the watcher isn't the current user 
+    # and the current user  doesn't have 'ModifyQueueWatcher'
+    # bail
+    else {
+        unless ( $self->CurrentUserHasRight('ModifyQueueWatchers') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+
+    # }}}
+
+    return ( $self->_AddWatcher(%args) );
+}
+
+#This contains the meat of AddWatcher. but can be called from a routine like
+# Create, which doesn't need the additional acl check
+sub _AddWatcher {
+    my $self = shift;
+    my %args = (
+        Type   => undef,
+        Silent => undef,
+        PrincipalId => undef,
+        Email => undef,
+        @_
+    );
+
+
+    my $principal = RT::Principal->new($self->CurrentUser);
+    if ($args{'PrincipalId'}) {
+        $principal->Load($args{'PrincipalId'});
+    }
+    elsif ($args{'Email'}) {
+
+        my $user = RT::User->new($self->CurrentUser);
+        $user->LoadByEmail($args{'Email'});
+
+        unless ($user->Id) {
+            $user->Load($args{'Email'});
+        }
+        if ($user->Id) { # If the user exists
+            $principal->Load($user->PrincipalId);
+        } else {
+
+        # if the user doesn't exist, we need to create a new user
+             my $new_user = RT::User->new($RT::SystemUser);
+
+            my ( $Val, $Message ) = $new_user->Create(
+                Name => $args{'Email'},
+                EmailAddress => $args{'Email'},
+                RealName     => $args{'Email'},
+                Privileged   => 0,
+                Comments     => 'Autocreated when added as a watcher');
+            unless ($Val) {
+                $RT::Logger->error("Failed to create user ".$args{'Email'} .": " .$Message);
+                # Deal with the race condition of two account creations at once
+                $new_user->LoadByEmail($args{'Email'});
+            }
+            $principal->Load($new_user->PrincipalId);
+        }
+    }
+    # If we can't find this watcher, we need to bail.
+    unless ($principal->Id) {
+        return(0, $self->loc("Could not find or create that user"));
+    }
+
+
+    my $group = RT::Group->new($self->CurrentUser);
+    $group->LoadQueueRoleGroup(Type => $args{'Type'}, Queue => $self->Id);
+    unless ($group->id) {
+        return(0,$self->loc("Group not found"));
+    }
+
+    if ( $group->HasMember( $principal)) {
+
+        return ( 0, $self->loc('That principal is already a [_1] for this queue', $args{'Type'}) );
+    }
+
+
+    my ($m_id, $m_msg) = $group->_AddMember(PrincipalId => $principal->Id);
+    unless ($m_id) {
+        $RT::Logger->error("Failed to add ".$principal->Id." as a member of group ".$group->Id."\n".$m_msg);
+
+        return ( 0, $self->loc('Could not make that principal a [_1] for this queue', $args{'Type'}) );
+    }
+    return ( 1, $self->loc('Added principal as a [_1] for this queue', $args{'Type'}) );
+}
+
+# }}}
+
+# {{{ sub DeleteWatcher
+
+=head2 DeleteWatcher { Type => TYPE, PrincipalId => PRINCIPAL_ID, Email => EMAIL_ADDRESS }
+
+
+Deletes a queue  watcher.  Takes two arguments:
+
+Type  (one of Requestor,Cc,AdminCc)
+
+and one of
+
+PrincipalId (an RT::Principal Id of the watcher you want to remove)
+    OR
+Email (the email address of an existing wathcer)
+
+
+=cut
+
+
+sub DeleteWatcher {
+    my $self = shift;
+
+    my %args = ( Type => undef,
+                 PrincipalId => undef,
+                 @_ );
+
+    unless ($args{'PrincipalId'} ) {
+        return(0, $self->loc("No principal specified"));
+    }
+    my $principal = RT::Principal->new($self->CurrentUser);
+    $principal->Load($args{'PrincipalId'});
+
+    # If we can't find this watcher, we need to bail.
+    unless ($principal->Id) {
+        return(0, $self->loc("Could not find that principal"));
+    }
+
+    my $group = RT::Group->new($self->CurrentUser);
+    $group->LoadQueueRoleGroup(Type => $args{'Type'}, Queue => $self->Id);
+    unless ($group->id) {
+        return(0,$self->loc("Group not found"));
+    }
+
+    # {{{ Check ACLS
+    #If the watcher we're trying to add is for the current user
+    if ( $self->CurrentUser->PrincipalId  eq $args{'PrincipalId'}) {
+        #  If it's an AdminCc and they don't have 
+        #   'WatchAsAdminCc' or 'ModifyQueue', bail
+  if ( $args{'Type'} eq 'AdminCc' ) {
+            unless ( $self->CurrentUserHasRight('ModifyQueueWatchers')
+                or $self->CurrentUserHasRight('WatchAsAdminCc') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+
+        #  If it's a Requestor or Cc and they don't have
+        #   'Watch' or 'ModifyQueue', bail
+        elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) {
+            unless ( $self->CurrentUserHasRight('ModifyQueueWatchers')
+                or $self->CurrentUserHasRight('Watch') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+        else {
+            $RT::Logger->warn( "$self -> DelWatcher got passed a bogus type");
+            return ( 0, $self->loc('Error in parameters to Queue->DelWatcher') );
+        }
+    }
+
+    # If the watcher isn't the current user 
+    # and the current user  doesn't have 'ModifyQueueWathcers' bail
+    else {
+        unless ( $self->CurrentUserHasRight('ModifyQueueWatchers') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+
+    # }}}
+
+
+    # see if this user is already a watcher.
+
+    unless ( $group->HasMember($principal)) {
+        return ( 0,
+        $self->loc('That principal is not a [_1] for this queue', $args{'Type'}) );
+    }
+
+    my ($m_id, $m_msg) = $group->_DeleteMember($principal->Id);
+    unless ($m_id) {
+        $RT::Logger->error("Failed to delete ".$principal->Id.
+                           " as a member of group ".$group->Id."\n".$m_msg);
+
+        return ( 0,    $self->loc('Could not remove that principal as a [_1] for this queue', $args{'Type'}) );
+    }
+
+    return ( 1, $self->loc("[_1] is no longer a [_2] for this queue.", $principal->Object->Name, $args{'Type'} ));
+}
+
+# }}}
+
+# {{{ AdminCcAddresses
+
+=head2 AdminCcAddresses
+
+returns String: All queue AdminCc email addresses as a string
+
+=cut
+
+sub AdminCcAddresses {
+    my $self = shift;
+    
+    unless ( $self->CurrentUserHasRight('SeeQueue') ) {
+        return undef;
+    }   
+    
+    return ( $self->AdminCc->MemberEmailAddressesAsString )
+    
+}   
+
+# }}}
+
+# {{{ CcAddresses
+
+=head2 CcAddresses
+
+returns String: All queue Ccs as a string of email addresses
+
+=cut
+
+sub CcAddresses {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('SeeQueue') ) {
+        return undef;
+    }
+
+    return ( $self->Cc->MemberEmailAddressesAsString);
+
+}
+# }}}
+
+
+# {{{ sub Cc
+
+=head2 Cc
+
+Takes nothing.
+Returns an RT::Group object which contains this Queue's Ccs.
+If the user doesn't have "ShowQueue" permission, returns an empty group
+
+=cut
+
+sub Cc {
+    my $self = shift;
+
+    my $group = RT::Group->new($self->CurrentUser);
+    if ( $self->CurrentUserHasRight('SeeQueue') ) {
+        $group->LoadQueueRoleGroup(Type => 'Cc', Queue => $self->Id);
+    }
+    return ($group);
+
+}
+
+# }}}
+
+# {{{ sub AdminCc
+
+=head2 AdminCc
+
+Takes nothing.
+Returns an RT::Group object which contains this Queue's AdminCcs.
+If the user doesn't have "ShowQueue" permission, returns an empty group
+
+=cut
+
+sub AdminCc {
+    my $self = shift;
+
+    my $group = RT::Group->new($self->CurrentUser);
+    if ( $self->CurrentUserHasRight('SeeQueue') ) {
+        $group->LoadQueueRoleGroup(Type => 'AdminCc', Queue => $self->Id);
+    }
+    return ($group);
+
+}
+
+# }}}
+
+# {{{ IsWatcher, IsCc, IsAdminCc
+
+# {{{ sub IsWatcher
+# a generic routine to be called by IsRequestor, IsCc and IsAdminCc
+
+=head2 IsWatcher { Type => TYPE, PrincipalId => PRINCIPAL_ID }
+
+Takes a param hash with the attributes Type and PrincipalId
+
+Type is one of Requestor, Cc, AdminCc and Owner
+
+PrincipalId is an RT::Principal id 
+
+Returns true if that principal is a member of the group Type for this queue
+
+
+=cut
+
+sub IsWatcher {
+    my $self = shift;
+
+    my %args = ( Type  => 'Cc',
+        PrincipalId    => undef,
+        @_
+    );
+
+    # Load the relevant group. 
+    my $group = RT::Group->new($self->CurrentUser);
+    $group->LoadQueueRoleGroup(Type => $args{'Type'}, Queue => $self->id);
+    # Ask if it has the member in question
+
+    my $principal = RT::Principal->new($self->CurrentUser);
+    $principal->Load($args{'PrincipalId'});
+
+    return ($group->HasMember($principal));
+}
+
+# }}}
+
+
+# {{{ sub IsCc
+
+=head2 IsCc PRINCIPAL_ID
+
+  Takes an RT::Principal id.
+  Returns true if the principal is a requestor of the current queue.
+
+
+=cut
+
+sub IsCc {
+    my $self = shift;
+    my $cc   = shift;
+
+    return ( $self->IsWatcher( Type => 'Cc', PrincipalId => $cc ) );
+
+}
+
+# }}}
+
+# {{{ sub IsAdminCc
+
+=head2 IsAdminCc PRINCIPAL_ID
+
+  Takes an RT::Principal id.
+  Returns true if the principal is a requestor of the current queue.
+
+=cut
+
+sub IsAdminCc {
+    my $self   = shift;
+    my $person = shift;
+
+    return ( $self->IsWatcher( Type => 'AdminCc', PrincipalId => $person ) );
+
+}
+
+# }}}
+
+
+# }}}
+
+
+
+
+
+# }}}
+
+# {{{ ACCESS CONTROL
+
+# {{{ sub _Set
+sub _Set {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('AdminQueue') ) {
+        return ( 0, $self->loc('Permission Denied') );
+    }
+    return ( $self->SUPER::_Set(@_) );
+}
+
+# }}}
+
+# {{{ sub _Value
+
+sub _Value {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('SeeQueue') ) {
+        return (undef);
+    }
+
+    return ( $self->__Value(@_) );
+}
+
+# }}}
+
+# {{{ sub CurrentUserHasRight
+
+=head2 CurrentUserHasRight
+
+Takes one argument. A textual string with the name of the right we want to check.
+Returns true if the current user has that right for this queue.
+Returns undef otherwise.
+
+=cut
+
+sub CurrentUserHasRight {
+    my $self  = shift;
+    my $right = shift;
+
+    return (
+        $self->HasRight(
+            Principal => $self->CurrentUser,
+            Right     => "$right"
+          )
+    );
+
+}
+
+# }}}
+
+# {{{ sub HasRight
+
+=head2 HasRight
+
+Takes a param hash with the fields 'Right' and 'Principal'.
+Principal defaults to the current user.
+Returns true if the principal has that right for this queue.
+Returns undef otherwise.
+
+=cut
+
+# TAKES: Right and optional "Principal" which defaults to the current user
+sub HasRight {
+    my $self = shift;
+    my %args = (
+        Right     => undef,
+        Principal => $self->CurrentUser,
+        @_
+    );
+    unless ( defined $args{'Principal'} ) {
+        $RT::Logger->debug("Principal undefined in Queue::HasRight");
+
+    }
+    return (
+        $args{'Principal'}->HasRight(
+            Object => $self,
+            Right    => $args{'Right'}
+          )
+    );
+}
+
+# }}}
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/Queues_Overlay.pm b/rt/lib/RT/Queues_Overlay.pm
new file mode 100644 (file)
index 0000000..b85144b
--- /dev/null
@@ -0,0 +1,130 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Queues - a collection of RT::Queue objects
+
+=head1 SYNOPSIS
+
+  use RT::Queues;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Queues);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub _Init
+sub _Init { 
+  my $self = shift;
+  $self->{'table'} = "Queues";
+  $self->{'primary_key'} = "id";
+
+  # By default, order by name
+  $self->OrderBy( ALIAS => 'main',
+                 FIELD => 'Name',
+                 ORDER => 'ASC');
+
+  return ($self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ sub _DoSearch 
+
+=head2 _DoSearch
+
+  A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that _Disabled rows never get seen unless
+we're explicitly trying to see them.
+
+=cut
+
+sub _DoSearch {
+    my $self = shift;
+    
+    #unless we really want to find disabled rows, make sure we\'re only finding enabled ones.
+    unless($self->{'find_disabled_rows'}) {
+       $self->LimitToEnabled();
+    }
+    
+    return($self->SUPER::_DoSearch(@_));
+    
+}
+
+# }}}
+  
+
+# {{{ sub Limit 
+sub Limit  {
+  my $self = shift;
+  my %args = ( ENTRYAGGREGATOR => 'AND',
+              @_);
+  $self->SUPER::Limit(%args);
+}
+# }}}
+
+# {{{ sub Next 
+
+=head2 Next
+
+Returns the next queue that this user can see.
+
+=cut
+  
+sub Next {
+    my $self = shift;
+    
+    
+    my $Queue = $self->SUPER::Next();
+    if ((defined($Queue)) and (ref($Queue))) {
+
+       if ($Queue->CurrentUserHasRight('SeeQueue')) {
+           return($Queue);
+       }
+       
+       #If the user doesn't have the right to show this queue
+       else {  
+           return($self->Next());
+       }
+    }
+    #if there never was any queue
+    else {
+       return(undef);
+    }  
+    
+}
+# }}}
+
+1;
+
diff --git a/rt/lib/RT/ScripAction_Overlay.pm b/rt/lib/RT/ScripAction_Overlay.pm
new file mode 100644 (file)
index 0000000..e2b018a
--- /dev/null
@@ -0,0 +1,217 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::ScripAction - RT Action object
+
+=head1 SYNOPSIS
+
+  use RT::ScripAction;
+
+
+=head1 DESCRIPTION
+
+This module should never be called directly by client code. it's an internal module which
+should only be accessed through exported APIs in other modules.
+
+
+=begin testing
+
+ok (require RT::ScripAction);
+
+=end testing
+
+=head1 METHODS
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{  sub _Init 
+sub _Init  {
+    my $self = shift; 
+    $self->{'table'} = "ScripActions";
+    return ($self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ sub _Accessible 
+sub _Accessible  {
+    my $self = shift;
+    my %Cols = ( Name  => 'read',
+                Description => 'read',
+                ExecModule  => 'read',
+                Argument  => 'read',
+                Creator => 'read/auto',
+                Created => 'read/auto',
+                LastUpdatedBy => 'read/auto',
+                LastUpdated => 'read/auto'
+       );
+    return($self->SUPER::_Accessible(@_, %Cols));
+}
+# }}}
+
+# {{{ sub Create 
+=head2 Create
+  
+ Takes a hash. Creates a new Action entry.
+ should be better documented.
+=cut
+
+sub Create  {
+    my $self = shift;
+    #TODO check these args and do smart things.
+    return($self->SUPER::Create(@_));
+}
+# }}}
+
+# {{{ sub Delete 
+sub Delete  {
+    my $self = shift;
+    
+    return (0, "ScripAction->Delete not implemented");
+}
+# }}}
+
+# {{{ sub Load 
+sub Load  {
+    my $self = shift;
+    my $identifier = shift;
+    
+    if (!$identifier) {
+       return (0, $self->loc('Input error'));
+    }      
+    
+    if ($identifier !~ /\D/) {
+       $self->SUPER::Load($identifier);
+    }
+    else {
+       $self->LoadByCol('Name', $identifier);
+       
+    }
+
+    if (@_) {
+       # Set the template Id to the passed in template    
+       my $template = shift;
+       
+       $self->{'Template'} = $template;
+    }
+    return ($self->loc('[_1] ScripAction loaded', $self->Id));
+}
+# }}}
+
+# {{{ sub LoadAction 
+
+=head2 LoadAction HASH
+
+  Takes a hash consisting of TicketObj and TransactionObj.  Loads an RT::Action:: module.
+
+=cut
+
+sub LoadAction  {
+    my $self = shift;
+    my %args = ( TransactionObj => undef,
+                TicketObj => undef,
+                @_ );
+    
+    #TODO: Put this in an eval  
+    $self->ExecModule =~ /^(\w+)$/;
+    my $module = $1;
+    my $type = "RT::Action::". $module;
+    eval "require $type" || die "Require of $type failed.\n$@\n";
+    
+    $self->{'Action'}  = $type->new ( 'ScripActionObj' => $self, 
+                                     'TicketObj' => $args{'TicketObj'},
+                                     'ScripObj' => $args{'ScripObj'},
+                                     'TransactionObj' => $args{'TransactionObj'},
+                                     'TemplateObj' => $self->TemplateObj,
+                                     'Argument' => $self->Argument,
+                                   );
+}
+# }}}
+
+# {{{ sub TemplateObj
+
+=head2 TemplateObj
+
+Return this action\'s template object
+
+=cut
+
+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'});
+       
+    }
+    
+    return ($self->{'TemplateObj'});
+}
+# }}}
+
+# The following methods call the action object
+
+# {{{ sub Prepare 
+
+sub Prepare  {
+    my $self = shift;
+    return ($self->{'Action'}->Prepare());
+  
+}
+# }}}
+
+# {{{ sub Commit 
+sub Commit  {
+    my $self = shift;
+    return($self->{'Action'}->Commit());
+    
+    
+}
+# }}}
+
+# {{{ sub Describe 
+sub Describe  {
+    my $self = shift;
+    return ($self->{'Action'}->Describe());
+    
+}
+# }}}
+
+# {{{ sub DESTROY
+sub DESTROY {
+    my $self=shift;
+    $self->{'Action'} = undef;
+    $self->{'TemplateObj'} = undef;
+}
+# }}}
+
+
+1;
+
+
diff --git a/rt/lib/RT/ScripActions_Overlay.pm b/rt/lib/RT/ScripActions_Overlay.pm
new file mode 100644 (file)
index 0000000..83cd646
--- /dev/null
@@ -0,0 +1,87 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::ScripActions - Collection of Action objects
+
+=head1 SYNOPSIS
+
+  use RT::ScripActions;
+
+
+=head1 DESCRIPTION
+
+
+=begin testing
+
+ok (require RT::ScripActions);
+
+=end testing
+
+=head1 METHODS
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub _Init
+sub _Init { 
+  my $self = shift;
+  $self->{'table'} = "ScripActions";
+  $self->{'primary_key'} = "id";
+  return ( $self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ sub LimitToType 
+sub LimitToType  {
+  my $self = shift;
+  my $type = shift;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Type',
+               VALUE => "$type")
+      if defined $type;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Type',
+               VALUE => "Correspond")
+      if $type eq "Create";
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Type',
+               VALUE => 'any');
+  
+}
+# }}}
+
+# {{{ sub NewItem 
+sub NewItem  {
+  my $self = shift;
+  return(RT::ScripAction->new($self->CurrentUser));
+
+}
+# }}}
+
+
+1;
+
diff --git a/rt/lib/RT/ScripCondition_Overlay.pm b/rt/lib/RT/ScripCondition_Overlay.pm
new file mode 100644 (file)
index 0000000..158bc57
--- /dev/null
@@ -0,0 +1,210 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::ScripCondition - RT scrip conditional
+
+=head1 SYNOPSIS
+
+  use RT::ScripCondition;
+
+
+=head1 DESCRIPTION
+
+This module should never be called directly by client code. it's an internal module which
+should only be accessed through exported APIs in other modules.
+
+
+=begin testing
+
+ok (require RT::ScripCondition);
+
+=end testing
+
+=head1 METHODS
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+# {{{  sub _Init 
+sub _Init  {
+    my $self = shift; 
+    $self->{'table'} = "ScripConditions";
+    return ($self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ sub _Accessible 
+sub _Accessible  {
+    my $self = shift;
+    my %Cols = ( Name  => 'read',
+                Description => 'read',
+                ApplicableTransTypes    => 'read',
+                ExecModule  => 'read',
+                Argument  => 'read',
+                Creator => 'read/auto',
+                Created => 'read/auto',
+                LastUpdatedBy => 'read/auto',
+                LastUpdated => 'read/auto'
+              );
+    return($self->SUPER::_Accessible(@_, %Cols));
+}
+# }}}
+
+# {{{ sub Create 
+
+=head2 Create
+  
+  Takes a hash. Creates a new Condition entry.
+  should be better documented.
+
+=cut
+
+sub Create  {
+    my $self = shift;
+    return($self->SUPER::Create(@_));
+}
+# }}}
+
+# {{{ sub Delete 
+
+=head2 Delete
+
+No API available for deleting things just yet.
+
+=cut
+
+sub Delete  {
+    my $self = shift;
+    return(0, $self->loc('Unimplemented'));
+}
+# }}}
+
+# {{{ sub Load 
+
+=head2 Load IDENTIFIER
+
+Loads a condition takes a name or ScripCondition id.
+
+=cut
+
+sub Load  {
+    my $self = shift;
+    my $identifier = shift;
+    
+    unless (defined $identifier) {
+       return (undef);
+    }      
+    
+    if ($identifier !~ /\D/) {
+       return ($self->SUPER::LoadById($identifier));
+    }
+    else {
+       return ($self->LoadByCol('Name', $identifier));
+    }
+}
+# }}}
+
+# {{{ sub LoadCondition 
+
+=head2 LoadCondition  HASH
+
+takes a hash which has the following elements:  TransactionObj and TicketObj.
+Loads the Condition module in question.
+
+=cut
+
+
+sub LoadCondition  {
+    my $self = shift;
+    my %args = ( TransactionObj => undef,
+                TicketObj => undef,
+                @_ );
+    
+    #TODO: Put this in an eval  
+    $self->ExecModule =~ /^(\w+)$/;
+    my $module = $1;
+    my $type = "RT::Condition::". $module;
+    
+    eval "require $type" || die "Require of $type failed.\n$@\n";
+    
+    $self->{'Condition'}  = $type->new ( 'ScripConditionObj' => $self, 
+                                        'TicketObj' => $args{'TicketObj'},
+                                        'ScripObj' => $args{'ScripObj'},
+                                        'TransactionObj' => $args{'TransactionObj'},
+                                        'Argument' => $self->Argument,
+                                        'ApplicableTransTypes' => $self->ApplicableTransTypes,
+                                      );
+}
+# }}}
+
+# {{{ The following methods call the Condition object
+
+
+# {{{ sub Describe 
+
+=head2 Describe 
+
+Helper method to call the condition module\'s Describe method.
+
+=cut
+
+sub Describe  {
+    my $self = shift;
+    return ($self->{'Condition'}->Describe());
+    
+}
+# }}}
+
+# {{{ sub IsApplicable 
+
+=head2 IsApplicable
+
+Helper method to call the condition module\'s IsApplicable method.
+
+=cut
+
+sub IsApplicable  {
+    my $self = shift;
+    return ($self->{'Condition'}->IsApplicable());
+    
+}
+# }}}
+
+# }}}
+
+# {{{ sub DESTROY
+sub DESTROY {
+    my $self=shift;
+    $self->{'Condition'} = undef;
+}
+# }}}
+
+
+1;
+
+
diff --git a/rt/lib/RT/ScripConditions_Overlay.pm b/rt/lib/RT/ScripConditions_Overlay.pm
new file mode 100644 (file)
index 0000000..8bef908
--- /dev/null
@@ -0,0 +1,87 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::ScripConditions - Collection of Action objects
+
+=head1 SYNOPSIS
+
+  use RT::ScripConditions;
+
+
+=head1 DESCRIPTION
+
+
+
+=begin testing
+
+ok (require RT::ScripConditions);
+
+=end testing
+
+=head1 METHODS
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub _Init
+sub _Init { 
+  my $self = shift;
+  $self->{'table'} = "ScripConditions";
+  $self->{'primary_key'} = "id";
+  return ( $self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ sub LimitToType 
+sub LimitToType  {
+  my $self = shift;
+  my $type = shift;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Type',
+               VALUE => "$type")
+      if defined $type;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Type',
+               VALUE => "Correspond")
+      if $type eq "Create";
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Type',
+               VALUE => 'any');
+  
+}
+# }}}
+
+# {{{ sub NewItem 
+sub NewItem  {
+  my $self = shift;
+  return(RT::ScripCondition->new($self->CurrentUser));
+}
+# }}}
+
+
+1;
+
diff --git a/rt/lib/RT/Scrip_Overlay.pm b/rt/lib/RT/Scrip_Overlay.pm
new file mode 100644 (file)
index 0000000..06462a9
--- /dev/null
@@ -0,0 +1,507 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Scrip - an RT Scrip object
+
+=head1 SYNOPSIS
+
+  use RT::Scrip;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok (require RT::Scrip);
+
+
+my $q = RT::Queue->new($RT::SystemUser);
+$q->Create(Name => 'ScripTest');
+ok($q->Id, "Created a scriptest queue");
+
+my $s1 = RT::Scrip->new($RT::SystemUser);
+my ($val, $msg) =$s1->Create( Queue => $q->Id,
+             ScripAction => 'User Defined',
+             ScripCondition => 'User Defined',
+             CustomIsApplicableCode => 'if ($self->TicketObj->Subject =~ /fire/) { return (1);} else { return(0)}',
+             CustomPrepareCode => 'return 1',
+             CustomCommitCode => '$self->TicketObj->SetPriority("87");',
+             Template => 'Blank'
+    );
+ok($val,$msg);
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+my ($tv,$ttv,$tm) = $ticket->Create(Queue => $q->Id,
+                                    Subject => "hair on fire",
+                                    );
+ok($tv, $tm);
+
+ok ($ticket->Priority == '87', "Ticket priority is set right");
+
+
+my $ticket2 = RT::Ticket->new($RT::SystemUser);
+my ($t2v,$t2tv,$t2m) = $ticket2->Create(Queue => $q->Id,
+                                    Subject => "hair in water",
+                                    );
+ok($t2v, $t2m);
+
+ok ($ticket2->Priority != '87', "Ticket priority is set right");
+
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+# {{{ sub Create 
+
+=head2 Create
+
+Creates a new entry in the Scrips table. Takes a paramhash with:
+
+        Queue                  => 0,
+        Description            => undef,
+        Template               => undef,
+        ScripAction            => undef,
+        ScripCondition         => undef,
+        CustomPrepareCode      => undef,
+        CustomCommitCode       => undef,
+        CustomIsApplicableCode => undef,
+
+
+
+
+Returns (retval, msg);
+retval is 0 for failure or scrip id.  msg is a textual description of what happened.
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = (
+        Queue                  => 0,
+        Template               => 0, # name or id
+        ScripAction            => 0, # name or id
+        ScripCondition         => 0, # name or id
+        Stage                  => 'TransactionCreate',
+        Description            => undef,
+        CustomPrepareCode      => undef,
+        CustomCommitCode       => undef,
+        CustomIsApplicableCode => undef,
+
+        @_
+    );
+
+
+    if (! $args{'Queue'} ) {
+        unless ( $self->CurrentUser->HasRight( Object => $RT::System, Right => 'ModifyScrips') ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+        $args{'Queue'} = 0;            # avoid undef sneaking in
+    }
+    else {
+        my $QueueObj = new RT::Queue( $self->CurrentUser );
+        $QueueObj->Load( $args{'Queue'} );
+        unless ( $QueueObj->id() ) {
+            return ( 0, $self->loc('Invalid queue') );
+        }
+        unless ( $QueueObj->CurrentUserHasRight('ModifyScrips') ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+        $args{'Queue'} = $QueueObj->id();
+    }
+
+    #TODO +++ validate input 
+
+    require RT::ScripAction;
+    my $action = new RT::ScripAction( $self->CurrentUser );
+    $action->Load( $args{'ScripAction'} || '0' );
+    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' );
+    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' );
+
+    unless ( $condition->Id ) {
+        return ( 0, $self->loc('Condition not found') );
+    }
+
+    my ($id,$msg) = $self->SUPER::Create(
+        Queue                  => $args{'Queue'},
+        Template               => $template->Id,
+        ScripCondition         => $condition->id,
+        Stage                  => $args{'Stage'},
+        ScripAction            => $action->Id,
+        Description            => $args{'Description'},
+        CustomPrepareCode      => $args{'CustomPrepareCode'},
+        CustomCommitCode       => $args{'CustomCommitCode'},
+        CustomIsApplicableCode => $args{'CustomIsApplicableCode'},
+
+    );
+    if ($id) {
+        return ( $id, $self->loc('Scrip Created') );
+    }
+    else {
+        return($id,$msg);
+    }
+}
+
+# }}}
+
+# {{{ sub Delete
+
+=head2 Delete
+
+Delete this object
+
+=cut
+
+sub Delete {
+    my $self = shift;
+    
+    unless ($self->CurrentUserHasRight('ModifyScrips')) {
+       return (0, $self->loc('Permission Denied'));
+    }
+    
+    return ($self->SUPER::Delete(@_));
+}
+# }}}
+
+# {{{ sub QueueObj
+
+=head2 QueueObj
+
+Retuns an RT::Queue object with this Scrip\'s queue
+
+=cut
+
+sub QueueObj {
+    my $self = shift;
+    
+    if (!$self->{'QueueObj'})  {
+       require RT::Queue;
+       $self->{'QueueObj'} = RT::Queue->new($self->CurrentUser);
+       $self->{'QueueObj'}->Load($self->__Value('Queue'));
+    }
+    return ($self->{'QueueObj'});
+}
+
+# }}}
+
+# {{{ sub ActionObj
+
+
+=head2 ActionObj
+
+Retuns an RT::Action object with this Scrip\'s Action
+
+=cut
+
+sub ActionObj {
+    my $self = shift;
+    
+    unless (defined $self->{'ScripActionObj'})  {
+       require RT::ScripAction;
+       
+       $self->{'ScripActionObj'} = RT::ScripAction->new($self->CurrentUser);
+       #TODO: why are we loading Actions with templates like this. 
+       # two seperate methods might make more sense
+       $self->{'ScripActionObj'}->Load($self->ScripAction, $self->Template);
+    }
+    return ($self->{'ScripActionObj'});
+}
+
+# }}}
+
+# {{{ sub ConditionObj
+
+=head2 ConditionObj
+
+Retuns an RT::ScripCondition object with this Scrip's IsApplicable
+
+=cut
+
+sub ConditionObj {
+    my $self = shift;
+    
+    unless (defined $self->{'ScripConditionObj'})  {
+       require RT::ScripCondition;
+       $self->{'ScripConditionObj'} = RT::ScripCondition->new($self->CurrentUser);
+       $self->{'ScripConditionObj'}->Load($self->ScripCondition);
+    }
+    return ($self->{'ScripConditionObj'});
+}
+
+# }}}
+
+# {{{ sub TemplateObj
+=head2 TemplateObj
+
+Retuns an RT::Template object with this Scrip\'s Template
+
+=cut
+
+sub TemplateObj {
+    my $self = shift;
+    
+    unless (defined $self->{'TemplateObj'})  {
+       require RT::Template;
+           $self->{'TemplateObj'} = RT::Template->new($self->CurrentUser);
+           $self->{'TemplateObj'}->Load($self->Template);
+    }
+    return ($self->{'TemplateObj'});
+}
+
+# }}}
+
+
+# {{{ Dealing with this instance of a scrip
+
+=head2 Apply { TicketObj => undef, TransactionObj => undef}
+
+This method instantiates the ScripCondition and ScripAction objects for a
+single execution of this scrip. it then calls the IsApplicable method of the 
+ScripCondition.
+If that succeeds, it calls the Prepare method of the
+ScripAction. If that succeeds, it calls the Commit method of the ScripAction.
+
+Usually, the ticket and transaction objects passed to this method
+should be loaded by the SuperUser role
+
+=cut
+
+
+# {{{ sub Apply
+
+sub Apply {
+    my $self = shift;
+    my %args = ( TicketObj      => undef,
+                 TransactionObj => undef,
+                 @_ );
+
+    # We want to make sure that if a scrip dies, we don't get
+    # hurt
+    eval {
+
+        #Load the scrip's Condition object
+        $self->ConditionObj->LoadCondition(
+                                      ScripObj       => $self,
+                                      TicketObj      => $args{'TicketObj'},
+                                      TransactionObj => $args{'TransactionObj'},
+        );
+
+        unless ( $self->IsApplicable() ) {
+            $self->ConditionObj->DESTROY;
+            return (undef);
+        }
+
+        #If it's applicable, prepare and commit it
+        $self->ActionObj->LoadAction( ScripObj       => $self,
+                                      TicketObj      => $args{'TicketObj'},
+                                      TransactionObj => $args{'TransactionObj'},
+        );
+
+        unless ( $self->Prepare() ) {
+            $RT::Logger->info(
+                          "$self: Couldn't prepare " . $self->ActionObj->Name );
+            $self->ActionObj->DESTROY();
+            $self->ConditionObj->DESTROY();
+            return (undef);
+        }
+        unless ( $self->Commit() ) {
+            $RT::Logger->info(
+                           "$self: Couldn't commit " . $self->ActionObj->Name );
+            $self->ActionObj->DESTROY();
+            $self->ConditionObj->DESTROY();
+            return (undef);
+        }
+
+        #Searchbuilder caching isn't perfectly coherent. got to reload the ticket object, since it
+        # may have changed
+        $args{'TicketObj'}->Load($args{'TicketObj'}->Id);
+
+        #We're done with it. lets clean up.
+        #TODO: something else isn't letting these get garbage collected. check em out.
+        $self->ActionObj->DESTROY();
+        $self->ConditionObj->DESTROY();
+        return (1);
+    };
+    if ($@) {
+        $RT::Logger->error( "Scrip " . $self->Id . " died. - " . $@ );
+    }
+
+}
+# }}}
+
+# {{{ sub IsApplicable
+
+=head2 IsApplicable
+
+Calls the  Condition object\'s IsApplicable method
+
+=cut
+
+sub IsApplicable {
+    my $self = shift;
+    return ($self->ConditionObj->IsApplicable(@_));
+}
+
+# }}}
+
+# {{{ sub Prepare
+
+=head2 Prepare
+
+Calls the action object's prepare method
+
+=cut
+
+sub Prepare {
+    my $self = shift;
+    $self->ActionObj->Prepare(@_);
+}
+
+# }}}
+
+# {{{ sub Commit
+
+=head2 Commit
+
+Calls the action object's commit method
+
+=cut
+
+sub Commit {
+    my $self = shift;
+    $self->ActionObj->Commit(@_);
+}
+
+# }}}
+
+# }}}
+
+# {{{ sub DESTROY
+sub DESTROY {
+    my $self = shift;
+    $self->{'ActionObj'} = undef;
+}
+# }}}
+
+# {{{ ACL related methods
+
+# {{{ sub _Set
+
+# does an acl check and then passes off the call
+sub _Set {
+    my $self = shift;
+    
+    unless ($self->CurrentUserHasRight('ModifyScrips')) {
+        $RT::Logger->debug("CurrentUser can't modify Scrips for ".$self->Queue."\n");
+       return (0, $self->loc('Permission Denied'));
+    }
+    return $self->__Set(@_);
+}
+
+# }}}
+
+# {{{ sub _Value
+# does an acl check and then passes off the call
+sub _Value {
+    my $self = shift;
+    
+    unless ($self->CurrentUserHasRight('ShowScrips')) {
+        $RT::Logger->debug("CurrentUser can't modify Scrips for ".$self->__Value('Queue')."\n");
+       return (undef);
+    }
+    
+    return $self->__Value(@_);
+}
+# }}}
+
+# {{{ sub CurrentUserHasRight
+
+=head2 CurrentUserHasRight
+
+Helper menthod for HasRight. Presets Principal to CurrentUser then 
+calls HasRight.
+
+=cut
+
+sub CurrentUserHasRight {
+    my $self = shift;
+    my $right = shift;
+    return ($self->HasRight( Principal => $self->CurrentUser->UserObj,
+                             Right => $right ));
+    
+}
+
+# }}}
+
+# {{{ sub HasRight
+
+=head2 HasRight
+
+Takes a param-hash consisting of "Right" and "Principal"  Principal is 
+an RT::User object or an RT::CurrentUser object. "Right" is a textual
+Right string that applies to Scrips.
+
+=cut
+
+sub HasRight {
+    my $self = shift;
+    my %args = ( Right => undef,
+                 Principal => undef,
+                 @_ );
+    
+    if ((defined $self->SUPER::_Value('Queue')) and ($self->SUPER::_Value('Queue') != 0)) {
+        return ( $args{'Principal'}->HasRight(
+                                                  Right => $args{'Right'},
+                                                  Object => $self->QueueObj
+                                                 ) 
+              );
+       
+    }
+    else {
+        return( $args{'Principal'}->HasRight( Object => $RT::System, Right =>  $args{'Right'}) );
+    }
+}
+# }}}
+
+# }}}
+
+1;
+
+
diff --git a/rt/lib/RT/Scrips_Overlay.pm b/rt/lib/RT/Scrips_Overlay.pm
new file mode 100644 (file)
index 0000000..46e31c2
--- /dev/null
@@ -0,0 +1,133 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Scrips - a collection of RT Scrip objects
+
+=head1 SYNOPSIS
+
+  use RT::Scrips;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Scrips);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub LimitToQueue 
+
+=head2 LimitToQueue
+
+Takes a queue id (numerical) as its only argument. Makes sure that 
+Scopes it pulls out apply to this queue (or another that you've selected with
+another call to this method
+
+=cut
+
+sub LimitToQueue  {
+   my $self = shift;
+  my $queue = shift;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Queue',
+               VALUE => "$queue")
+      if defined $queue;
+  
+}
+# }}}
+
+# {{{ sub LimitToGlobal
+
+=head2 LimitToGlobal
+
+Makes sure that 
+Scopes it pulls out apply to all queues (or another that you've selected with
+another call to this method or LimitToQueue
+
+=cut
+
+
+sub LimitToGlobal  {
+   my $self = shift;
+  $self->Limit (ENTRYAGGREGATOR => 'OR',
+               FIELD => 'Queue',
+               VALUE => 0);
+  
+}
+# }}}
+
+# {{{ sub NewItem 
+sub NewItem  {
+  my $self = shift;
+  
+  return(new RT::Scrip($self->CurrentUser));
+}
+# }}}
+
+# {{{ sub Next 
+
+=head2 Next
+
+Returns the next scrip that this user can see.
+
+=cut
+  
+sub Next {
+    my $self = shift;
+    
+    
+    my $Scrip = $self->SUPER::Next();
+    if ((defined($Scrip)) and (ref($Scrip))) {
+
+       if ($Scrip->CurrentUserHasRight('ShowScrips')) {
+           return($Scrip);
+       }
+       
+       #If the user doesn't have the right to show this scrip
+       else {  
+           return($self->Next());
+       }
+    }
+    #if there never was any scrip
+    else {
+       return(undef);
+    }  
+    
+}
+# }}}
+
+1;
+
diff --git a/rt/lib/RT/Search/ActiveTicketsInQueue.pm b/rt/lib/RT/Search/ActiveTicketsInQueue.pm
new file mode 100644 (file)
index 0000000..766e42e
--- /dev/null
@@ -0,0 +1,78 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Search::ActiveTicketsInQueue
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+Find all active tickets in the queue named in the argument passed in
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Search::Generic);
+
+=end testing
+
+
+=cut
+
+package RT::Search::ActiveTicketsInQueue;
+
+use strict;
+use base qw(RT::Search::Generic);
+
+
+# {{{ sub Describe 
+sub Describe  {
+  my $self = shift;
+  return ($self->loc("No description for [_1]", ref $self));
+}
+# }}}
+
+# {{{ sub Prepare
+sub Prepare  {
+  my $self = shift;
+
+  $self->TicketsObj->LimitQueue(VALUE => $self->Argument);
+
+  foreach my $status (RT::Queue->ActiveStatusArray()) {
+        $self->TicketsObj->LimitStatus(VALUE => $status);
+  }
+
+  return(1);
+}
+# }}}
+
+eval "require RT::Search::ActiveTicketsInQueue_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Search/ActiveTicketsInQueue_Vendor.pm});
+eval "require RT::Search::ActiveTicketsInQueue_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Search/ActiveTicketsInQueue_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Search/Generic.pm b/rt/lib/RT/Search/Generic.pm
new file mode 100644 (file)
index 0000000..f872c2a
--- /dev/null
@@ -0,0 +1,128 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Search::Generic - ;
+
+=head1 SYNOPSIS
+
+    use RT::Search::Generic;
+    my $tickets = RT::Tickets->new($CurrentUser);
+    my $foo = RT::Search::Generic->new(Argument => $arg,
+                                       TicketsObj => $tickets);
+    $foo->Prepare();
+    while ( my $ticket = $foo->Next ) {
+        # Do something with each ticket we've found
+    }
+
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::Search::Generic);
+
+=end testing
+
+
+=cut
+
+package RT::Search::Generic;
+
+use strict;
+
+# {{{ sub new 
+sub new  {
+  my $proto = shift;
+  my $class = ref($proto) || $proto;
+  my $self  = {};
+  bless ($self, $class);
+  $self->_Init(@_);
+  return $self;
+}
+# }}}
+
+# {{{ sub _Init 
+sub _Init  {
+  my $self = shift;
+  my %args = ( 
+           TicketsObj => undef,
+              Argument => undef,
+              @_ );
+  
+  $self->{'TicketsObj'} = $args{'TicketsObj'}; 
+  $self->{'Argument'} = $args{'Argument'};
+}
+# }}}
+
+# {{{ sub Argument 
+
+=head2 Argument
+
+Return the optional argument associated with this Search
+
+=cut
+
+sub Argument  {
+  my $self = shift;
+  return($self->{'Argument'});
+}
+# }}}
+
+
+=head2 TicketsObj 
+
+Return the Tickets object passed into this search
+
+=cut
+
+sub TicketsObj {
+    my $self = shift;
+    return($self->{'TicketsObj'});
+}
+
+# {{{ sub Describe 
+sub Describe  {
+  my $self = shift;
+  return ($self->loc("No description for [_1]", ref $self));
+}
+# }}}
+
+# {{{ sub Prepare
+sub Prepare  {
+  my $self = shift;
+  return(1);
+}
+# }}}
+
+eval "require RT::Search::Generic_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Search/Generic_Vendor.pm});
+eval "require RT::Search::Generic_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Search/Generic_Local.pm});
+
+1;
diff --git a/rt/lib/RT/SearchBuilder.pm b/rt/lib/RT/SearchBuilder.pm
new file mode 100644 (file)
index 0000000..22c9aff
--- /dev/null
@@ -0,0 +1,200 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::SearchBuilder - a baseclass for RT collection objects
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+
+=begin testing
+
+ok (require RT::SearchBuilder);
+
+=end testing
+
+
+=cut
+
+package RT::SearchBuilder;
+
+use RT::Base;
+use DBIx::SearchBuilder;
+
+use strict;
+use vars qw(@ISA);
+@ISA = qw(DBIx::SearchBuilder RT::Base);
+
+# {{{ sub _Init 
+sub _Init  {
+    my $self = shift;
+    
+    $self->{'user'} = shift;
+    unless(defined($self->CurrentUser)) {
+       use Carp;
+       Carp::confess("$self was created without a CurrentUser");
+       $RT::Logger->err("$self was created without a CurrentUser");
+       return(0);
+    }
+    $self->SUPER::_Init( 'Handle' => $RT::Handle);
+}
+# }}}
+
+# {{{ sub LimitToEnabled
+
+=head2 LimitToEnabled
+
+Only find items that haven\'t been disabled
+
+=cut
+
+sub LimitToEnabled {
+    my $self = shift;
+    
+    $self->Limit( FIELD => 'Disabled',
+                 VALUE => '0',
+                 OPERATOR => '=' );
+}
+# }}}
+
+# {{{ sub LimitToDisabled
+
+=head2 LimitToDeleted
+
+Only find items that have been deleted.
+
+=cut
+
+sub LimitToDeleted {
+    my $self = shift;
+    
+    $self->{'find_disabled_rows'} = 1;
+    $self->Limit( FIELD => 'Disabled',
+                 OPERATOR => '=',
+                 VALUE => '1'
+               );
+}
+# }}}
+
+# {{{ sub FindAllRows
+
+=head2 FindAllRows
+
+Find all matching rows, regardless of whether they are disabled or not
+
+=cut
+
+sub FindAllRows {
+  shift->{'find_disabled_rows'} = 1;
+}
+
+# {{{ sub Limit 
+
+=head2 Limit PARAMHASH
+
+This Limit sub calls SUPER::Limit, but defaults "CASESENSITIVE" to 1, thus
+making sure that by default lots of things don't do extra work trying to 
+match lower(colname) agaist lc($val);
+
+=cut
+
+sub Limit {
+       my $self = shift;
+       my %args = ( CASESENSITIVE => 1,
+                    @_ );
+
+   return $self->SUPER::Limit(%args);
+}
+
+# }}}
+
+# {{{ sub ItemsArrayRef
+
+=item ItemsArrayRef
+
+Return this object's ItemsArray.
+If it has a SortOrder attribute, sort the array by SortOrder.
+Otherwise, if it has a "Name" attribute, sort alphabetically by Name
+Otherwise, just give up and return it in the order it came from the db.
+
+
+=begin testing
+
+use_ok(RT::Queues);
+ok(my $queues = RT::Queues->new($RT::SystemUser), 'Created a queues object');
+ok( $queues->UnLimit(),'Unlimited the result set of the queues object');
+my $items = $queues->ItemsArrayRef();
+my @items = @{$items};
+
+ok($queues->NewItem->_Accessible('Name','read'));
+my @sorted = sort {lc($a->Name) cmp lc($b->Name)} @items;
+ok (@sorted, "We have an array of queues, sorted". join(',',map {$_->Name} @sorted));
+
+ok (@items, "We have an array of queues, raw". join(',',map {$_->Name} @items));
+my @sorted_ids = map {$_->id } @sorted;
+my @items_ids = map {$_->id } @items;
+
+is ($#sorted, $#items);
+is ($sorted[0]->Name, $items[0]->Name);
+is ($sorted[-1]->Name, $items[-1]->Name);
+is_deeply(\@items_ids, \@sorted_ids, "ItemsArrayRef sorts alphabetically by name");;
+
+
+=end testing
+
+=cut
+
+sub ItemsArrayRef {
+    my $self = shift;
+    my @items;
+    
+    if ($self->NewItem()->_Accessible('SortOrder','read')) {
+        @items = sort { $a->SortOrder <=> $b->SortOrder } @{$self->SUPER::ItemsArrayRef()};
+    }
+    elsif ($self->NewItem()->_Accessible('Name','read')) {
+        @items = sort { lc($a->Name) cmp lc($b->Name) } @{$self->SUPER::ItemsArrayRef()};
+    }
+    else {
+        @items = @{$self->SUPER::ItemsArrayRef()};
+    }
+
+    return(\@items);
+
+}
+
+# }}}
+
+eval "require RT::SearchBuilder_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/SearchBuilder_Vendor.pm});
+eval "require RT::SearchBuilder_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/SearchBuilder_Local.pm});
+
+1;
+
+
diff --git a/rt/lib/RT/System.pm b/rt/lib/RT/System.pm
new file mode 100644 (file)
index 0000000..bfa5a4e
--- /dev/null
@@ -0,0 +1,165 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME 
+
+RT::System
+
+=head1 DESCRIPTION
+
+RT::System is a simple global object used as a focal point for things
+that are system-wide.
+
+It works sort of like an RT::Record, except it's really a single object that has
+an id of "1" when instantiated.
+
+This gets used by the ACL system so that you can have rights for the scope "RT::System"
+
+In the future, there will probably be other API goodness encapsulated here.
+
+=cut
+
+
+package RT::System;
+use base qw /RT::Base/;
+use strict;
+
+use RT::ACL;
+use vars qw/ $RIGHTS/;
+
+# System rights are rights granted to the whole system
+# XXX TODO Can't localize these outside of having an object around.
+$RIGHTS = {
+    SuperUser              => 'Do anything and everything',           # loc_pair
+    AdminAllPersonalGroups =>
+      "Create, delete and modify the members of any user's personal groups"
+    ,                                                                 # loc_pair
+    AdminOwnPersonalGroups =>
+      'Create, delete and modify the members of personal groups',     # loc_pair
+    AdminUsers     => 'Create, delete and modify users',              # loc_pair
+    ModifySelf     => "Modify one's own RT account",                  # loc_pair
+    DelegateRights =>
+      "Delegate specific rights which have been granted to you."      # loc_pair
+};
+
+# Tell RT::ACE that this sort of object can get acls granted
+$RT::ACE::OBJECT_TYPES{'RT::System'} = 1;
+
+foreach my $right ( keys %{$RIGHTS} ) {
+    $RT::ACE::LOWERCASERIGHTNAMES{ lc $right } = $right;
+}
+
+
+=head2 AvailableRights
+
+Returns a hash of available rights for this object. The keys are the right names and the values are a description of what the rights do
+
+=begin testing
+
+my $s = RT::System->new($RT::SystemUser);
+my $rights = $s->AvailableRights;
+ok ($rights, "Rights defined");
+ok ($rights->{'AdminUsers'},"AdminUsers right found");
+ok ($rights->{'CreateTicket'},"CreateTicket right found");
+ok ($rights->{'AdminGroupMembership'},"ModifyGroupMembers right found");
+ok (!$rights->{'CasdasdsreateTicket'},"bogus right not found");
+
+
+
+=end testing
+
+
+=cut
+
+sub AvailableRights {
+    my $self = shift;
+
+    my $queue = RT::Queue->new($RT::SystemUser);
+    my $group = RT::Group->new($RT::SystemUser);
+
+    my $qr =$queue->AvailableRights();
+    my $gr = $group->AvailableRights();
+
+    # Build a merged list of all system wide rights, queue rights and group rights.
+    my %rights = (%{$RIGHTS}, %{$gr}, %{$qr});
+    return(\%rights);
+}
+
+
+=head2 new
+
+Create a new RT::System object. Really, you should be using $RT::System
+
+=cut
+
+                         
+sub new {
+    my $proto = shift;
+    my $class = ref($proto) || $proto;
+    my $self  = {};
+    bless( $self, $class );
+
+
+    return ($self);
+}
+
+=head2 id
+
+Returns RT::System's id. It's 1. 
+
+
+=begin testing
+
+use RT::System;
+my $sys = RT::System->new();
+is( $sys->Id, 1);
+is ($sys->id, 1);
+
+=end testing
+
+
+=cut
+
+*Id = \&id;
+
+sub id {
+    return (1);
+}
+
+=head2 Load
+
+Since this object is pretending to be an RT::Record, we need a load method.
+It does nothing
+
+=cut
+
+sub Load {
+       return (1);
+}
+
+eval "require RT::System_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/System_Vendor.pm});
+eval "require RT::System_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/System_Local.pm});
+
+1;
diff --git a/rt/lib/RT/Template_Overlay.pm b/rt/lib/RT/Template_Overlay.pm
new file mode 100644 (file)
index 0000000..0b5e67d
--- /dev/null
@@ -0,0 +1,411 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Portions Copyright 2000 Tobias Brox <tobix@cpan.org> 
+
+=head1 NAME
+
+  RT::Template - RT's template object
+
+=head1 SYNOPSIS
+
+  use RT::Template;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::Template);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use Text::Template;
+use MIME::Entity;
+use MIME::Parser;
+use File::Temp qw /tempdir/;
+
+
+# {{{ sub _Accessible 
+
+sub _Accessible {
+    my $self = shift;
+    my %Cols = (
+        id            => 'read',
+        Name          => 'read/write',
+        Description   => 'read/write',
+        Type          => 'read/write',    #Type is one of Action or Message
+        Content       => 'read/write',
+        Queue         => 'read/write',
+        Creator       => 'read/auto',
+        Created       => 'read/auto',
+        LastUpdatedBy => 'read/auto',
+        LastUpdated   => 'read/auto'
+    );
+    return $self->SUPER::_Accessible( @_, %Cols );
+}
+
+# }}}
+
+# {{{ sub _Set
+
+sub _Set {
+    my $self = shift;
+
+    # use super::value or we get acl blocked
+    if ( ( defined $self->SUPER::_Value('Queue') )
+        && ( $self->SUPER::_Value('Queue') == 0 ) )
+    {
+        unless ( $self->CurrentUser->HasRight( Object => $RT::System, Right => 'ModifyTemplate') ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+    }
+    else {
+
+        unless ( $self->CurrentUserHasQueueRight('ModifyTemplate') ) {
+            return ( 0, $self->loc('Permission Denied') );
+        }
+    }
+    return ( $self->SUPER::_Set(@_) );
+
+}
+
+# }}}
+
+# {{{ sub _Value 
+
+=head2 _Value
+
+Takes the name of a table column.
+Returns its value as a string, if the user passes an ACL check
+
+
+=begin testing
+
+my $t = RT::Template->new($RT::SystemUser);
+$t->Create(Name => "Foo", Queue => 1);
+my $t2 = RT::Template->new($RT::Nobody);
+$t2->Load($t->Id);
+ok($t2->QueueObj->id, "Got the template's queue objet");
+
+=end testing
+
+
+
+=cut
+
+sub _Value {
+
+    my $self  = shift;
+    my $field = shift;
+
+   
+    #If the current user doesn't have ACLs, don't let em at it.  
+    #use super::value or we get acl blocked
+    if ( ( !defined $self->__Value('Queue') )
+        || ( $self->__Value('Queue') == 0 ) )
+    {
+        unless ( $self->CurrentUser->HasRight( Object => $RT::System, Right => 'ShowTemplate') ) {
+            return (undef);
+        }
+    }
+    else {
+        unless ( $self->CurrentUserHasQueueRight('ShowTemplate') ) {
+            return (undef);
+        }
+    }
+    return ( $self->__Value($field) );
+
+}
+
+# }}}
+
+# {{{ sub Load
+
+=head2 Load <identifer>
+
+Load a template, either by number or by name
+
+=cut
+
+sub Load {
+    my $self       = shift;
+    my $identifier = shift;
+
+    if ( !$identifier ) {
+        return (undef);
+    }
+
+    if ( $identifier !~ /\D/ ) {
+        $self->SUPER::LoadById($identifier);
+    }
+    else {
+        $self->LoadByCol( 'Name', $identifier );
+
+    }
+}
+
+# }}}
+
+# {{{ sub LoadGlobalTemplate
+
+=head2 LoadGlobalTemplate NAME
+
+Load the global tempalte with the name NAME
+
+=cut
+
+sub LoadGlobalTemplate {
+    my $self = shift;
+    my $id   = shift;
+
+    return ( $self->LoadQueueTemplate( Queue => 0, Name => $id ) );
+}
+
+# }}}
+
+# {{{ sub LoadQueueTemplate
+
+=head2  LoadQueueTemplate (Queue => QUEUEID, Name => NAME)
+
+Loads the Queue template named NAME for Queue QUEUE.
+
+=cut
+
+sub LoadQueueTemplate {
+    my $self = shift;
+    my %args = (
+        Queue => undef,
+        Name  => undef
+    );
+
+    return ( $self->LoadByCols( Name => $args{'Name'}, Queue => {'Queue'} ) );
+
+}
+
+# }}}
+
+# {{{ sub Create
+
+=head2 Create
+
+Takes a paramhash of Content, Queue, Name and Description.
+Name should be a unique string identifying this Template.
+Description and Content should be the template's title and content.
+Queue should be 0 for a global template and the queue # for a queue-specific 
+template.
+
+Returns the Template's id # if the create was successful. Returns undef for
+unknown database failure.
+
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = (
+        Content     => undef,
+        Queue       => 0,
+        Description => '[no description]',
+        Type => 'Action',    #By default, template are 'Action' templates
+        Name => undef,
+        @_
+    );
+
+    if ( !$args{'Queue'}  ) {
+        unless ( $self->CurrentUser->HasRight(Right =>'ModifyTemplate', Object => $RT::System) ) {
+            return (undef);
+        }
+        $args{'Queue'} = 0;
+    }
+    else {
+        my $QueueObj = new RT::Queue( $self->CurrentUser );
+        $QueueObj->Load( $args{'Queue'} ) || return ( 0, $self->loc('Invalid queue') );
+    
+        unless ( $QueueObj->CurrentUserHasRight('ModifyTemplate') ) {
+            return (undef);
+        }
+        $args{'Queue'} = $QueueObj->Id;
+    }
+
+    my $result = $self->SUPER::Create(
+        Content => $args{'Content'},
+        Queue   =>  $args{'Queue'},
+        Description => $args{'Description'},
+        Name        => $args{'Name'}
+    );
+
+    return ($result);
+
+}
+
+# }}}
+
+# {{{ sub Delete
+
+=head2 Delete
+
+Delete this template.
+
+=cut
+
+sub Delete {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasQueueRight('ModifyTemplate') ) {
+        return ( 0, $self->loc('Permission Denied') );
+    }
+
+    return ( $self->SUPER::Delete(@_) );
+}
+
+# }}}
+
+# {{{ sub MIMEObj
+sub MIMEObj {
+    my $self = shift;
+    return ( $self->{'MIMEObj'} );
+}
+
+# }}}
+
+# {{{ sub Parse 
+
+=item Parse
+
+ This routine performs Text::Template parsing on the template and then
+ imports the results into a MIME::Entity so we can really use it
+ It returns a tuple of (val, message)
+ If val is 0, the message contains an error message
+
+=cut
+
+sub Parse {
+    my $self = shift;
+
+    #We're passing in whatever we were passed. it's destined for _ParseContent
+    my $content = $self->_ParseContent(@_);
+
+    #Lets build our mime Entity
+
+    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");
+    }
+    else {
+       # 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) };
+    my $error = ( $@ || $parser->last_error );
+
+    if ($error) {
+        $RT::Logger->error("$error");
+        return ( 0, $error );
+    }
+
+    # Unfold all headers
+    $self->{'MIMEObj'}->head->unfold();
+
+    return ( 1, $self->loc("Template parsed") );
+   
+
+}
+
+# }}}
+
+# {{{ sub _ParseContent
+
+# Perform Template substitutions on the template
+
+sub _ParseContent {
+    my $self = shift;
+    my %args = (
+        Argument       => undef,
+        TicketObj      => undef,
+        TransactionObj => undef,
+        @_
+    );
+
+
+    $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;
+
+    # We need to untaint the content of the template, since we'll be working
+    # with it
+    my $content = $self->Content();
+    $content =~ s/^(.*)$/$1/;
+    my $template = Text::Template->new(
+        TYPE   => 'STRING',
+        SOURCE => $content
+    );
+
+    my $retval = $template->fill_in( PACKAGE => 'T' );
+
+    # MIME::Parser has problems dealing with high-bit utf8 data.
+    Encode::_utf8_off($retval);
+    return ($retval);
+}
+
+# }}}
+
+# {{{ sub CurrentUserHasQueueRight
+
+=head2 CurrentUserHasQueueRight
+
+Helper function to call the template's queue's CurrentUserHasQueueRight with the passed in args.
+
+=cut
+
+sub CurrentUserHasQueueRight {
+    my $self = shift;
+    return ( $self->QueueObj->CurrentUserHasRight(@_) );
+}
+
+# }}}
+1;
diff --git a/rt/lib/RT/Templates_Overlay.pm b/rt/lib/RT/Templates_Overlay.pm
new file mode 100644 (file)
index 0000000..6bc992e
--- /dev/null
@@ -0,0 +1,141 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Templates - a collection of RT Template objects
+
+=head1 SYNOPSIS
+
+  use RT::Templates;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok (require RT::Templates);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+# {{{ sub _Init
+
+=head2 _Init
+
+  Returns RT::Templates specific init info like table and primary key names
+
+=cut
+
+sub _Init {
+    
+    my $self = shift;
+    $self->{'table'} = "Templates";
+    $self->{'primary_key'} = "id";
+    return ($self->SUPER::_Init(@_));
+}
+# }}}
+
+# {{{ LimitToNotInQueue
+
+=head2 LimitToNotInQueue
+
+Takes a queue id # and limits the returned set of templates to those which 
+aren't that queue's templates.
+
+=cut
+
+sub LimitToNotInQueue {
+    my $self = shift;
+    my $queue_id = shift;
+    $self->Limit(FIELD => 'Queue',
+                 VALUE => "$queue_id",
+                 OPERATOR => '!='
+                );
+}
+# }}}
+
+# {{{ LimitToGlobal
+
+=head2 LimitToGlobal
+
+Takes no arguments. Limits the returned set to "Global" templates
+which can be used with any queue.
+
+=cut
+
+sub LimitToGlobal {
+    my $self = shift;
+    my $queue_id = shift;
+    $self->Limit(FIELD => 'Queue',
+                 VALUE => "0",
+                 OPERATOR => '='
+                );
+}
+# }}}
+
+# {{{ LimitToQueue
+
+=head2 LimitToQueue
+
+Takes a queue id # and limits the returned set of templates to that queue's
+templates
+
+=cut
+
+sub LimitToQueue {
+    my $self = shift;
+    my $queue_id = shift;
+    $self->Limit(FIELD => 'Queue',
+                 VALUE => "$queue_id",
+                 OPERATOR => '='
+                );
+}
+# }}}
+
+# {{{ sub NewItem 
+
+=head2 NewItem
+
+Returns a new empty Template object
+
+=cut
+
+sub NewItem  {
+  my $self = shift;
+
+  use RT::Template;
+  my $item = new RT::Template($self->CurrentUser);
+  return($item);
+}
+# }}}
+
+1;
+
diff --git a/rt/lib/RT/TicketCustomFieldValue.pm b/rt/lib/RT/TicketCustomFieldValue.pm
new file mode 100644 (file)
index 0000000..862a5dc
--- /dev/null
@@ -0,0 +1,286 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+RT::TicketCustomFieldValue
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=cut
+
+package RT::TicketCustomFieldValue;
+use RT::Record; 
+use RT::CustomField;
+use RT::Ticket;
+
+
+use vars qw( @ISA );
+@ISA= qw( RT::Record );
+
+sub _Init {
+  my $self = shift; 
+
+  $self->Table('TicketCustomFieldValues');
+  $self->SUPER::_Init(@_);
+}
+
+
+
+
+
+=item Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+  int(11) 'Ticket'.
+  int(11) 'CustomField'.
+  varchar(255) 'Content'.
+
+=cut
+
+
+
+
+sub Create {
+    my $self = shift;
+    my %args = ( 
+                Ticket => '0',
+                CustomField => '0',
+                Content => '',
+
+                 @_);
+    $self->SUPER::Create(
+                         Ticket => $args{'Ticket'},
+                         CustomField => $args{'CustomField'},
+                         Content => $args{'Content'},
+);
+
+}
+
+
+
+=item id
+
+Returns the current value of id. 
+(In the database, id is stored as int(11).)
+
+
+=cut
+
+
+=item Ticket
+
+Returns the current value of Ticket. 
+(In the database, Ticket is stored as int(11).)
+
+
+
+=item SetTicket VALUE
+
+
+Set Ticket to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Ticket will be stored as a int(11).)
+
+
+=cut
+
+
+=item TicketObj
+
+Returns the Ticket Object which has the id returned by Ticket
+
+
+=cut
+
+sub TicketObj {
+       my $self = shift;
+       my $Ticket =  RT::Ticket->new($self->CurrentUser);
+       $Ticket->Load($self->__Value('Ticket'));
+       return($Ticket);
+}
+
+=item CustomField
+
+Returns the current value of CustomField. 
+(In the database, CustomField is stored as int(11).)
+
+
+
+=item SetCustomField VALUE
+
+
+Set CustomField to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, CustomField will be stored as a int(11).)
+
+
+=cut
+
+
+=item CustomFieldObj
+
+Returns the CustomField Object which has the id returned by CustomField
+
+
+=cut
+
+sub CustomFieldObj {
+       my $self = shift;
+       my $CustomField =  RT::CustomField->new($self->CurrentUser);
+       $CustomField->Load($self->__Value('CustomField'));
+       return($CustomField);
+}
+
+=item Content
+
+Returns the current value of Content. 
+(In the database, Content is stored as varchar(255).)
+
+
+
+=item SetContent VALUE
+
+
+Set Content to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, Content will be stored as a varchar(255).)
+
+
+=cut
+
+
+=item Creator
+
+Returns the current value of Creator. 
+(In the database, Creator is stored as int(11).)
+
+
+=cut
+
+
+=item Created
+
+Returns the current value of Created. 
+(In the database, Created is stored as datetime.)
+
+
+=cut
+
+
+=item LastUpdatedBy
+
+Returns the current value of LastUpdatedBy. 
+(In the database, LastUpdatedBy is stored as int(11).)
+
+
+=cut
+
+
+=item LastUpdated
+
+Returns the current value of LastUpdated. 
+(In the database, LastUpdated is stored as datetime.)
+
+
+=cut
+
+
+
+sub _ClassAccessible {
+    {
+     
+        id =>
+               {read => 1, type => 'int(11)', default => ''},
+        Ticket => 
+               {read => 1, write => 1, type => 'int(11)', default => '0'},
+        CustomField => 
+               {read => 1, write => 1, type => 'int(11)', default => '0'},
+        Content => 
+               {read => 1, write => 1, type => 'varchar(255)', default => ''},
+        Creator => 
+               {read => 1, auto => 1, type => 'int(11)', default => '0'},
+        Created => 
+               {read => 1, auto => 1, type => 'datetime', default => ''},
+        LastUpdatedBy => 
+               {read => 1, auto => 1, type => 'int(11)', default => '0'},
+        LastUpdated => 
+               {read => 1, auto => 1, type => 'datetime', default => ''},
+
+ }
+};
+
+
+        eval "require RT::TicketCustomFieldValue_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::TicketCustomFieldValue_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::TicketCustomFieldValue_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::TicketCustomFieldValue_Overlay, RT::TicketCustomFieldValue_Vendor, RT::TicketCustomFieldValue_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm b/rt/lib/RT/TicketCustomFieldValue_Overlay.pm
new file mode 100644 (file)
index 0000000..c395eca
--- /dev/null
@@ -0,0 +1,52 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+no warnings qw(redefine);
+
+
+
+=head2 LoadByTicketContentAndCustomField { Ticket => TICKET, CustomField => CUSTOMFIELD, Content => CONTENT }
+
+Loads a custom field value by Ticket, Content and which CustomField it's tied to
+
+=cut
+
+
+sub LoadByTicketContentAndCustomField {
+    my $self = shift;
+    my %args = ( Ticket => undef,
+                CustomField => undef,
+                Content => undef,
+                @_
+                );
+
+
+    $self->LoadByCols( Content => $args{'Content'},
+                         CustomField => $args{'CustomField'},
+                         Ticket => $args{'Ticket'});
+
+    
+}
+
+1;
diff --git a/rt/lib/RT/TicketCustomFieldValues.pm b/rt/lib/RT/TicketCustomFieldValues.pm
new file mode 100644 (file)
index 0000000..f137f53
--- /dev/null
@@ -0,0 +1,115 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+
+
+=head1 NAME
+
+  RT::TicketCustomFieldValues -- Class Description
+=head1 SYNOPSIS
+
+  use RT::TicketCustomFieldValues
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=cut
+
+package RT::TicketCustomFieldValues;
+
+use RT::SearchBuilder;
+use RT::TicketCustomFieldValue;
+
+use vars qw( @ISA );
+@ISA= qw(RT::SearchBuilder);
+
+
+sub _Init {
+    my $self = shift;
+    $self->{'table'} = 'TicketCustomFieldValues';
+    $self->{'primary_key'} = 'id';
+
+
+    return ( $self->SUPER::_Init(@_) );
+}
+
+
+=item NewItem
+
+Returns an empty new RT::TicketCustomFieldValue item
+
+=cut
+
+sub NewItem {
+    my $self = shift;
+    return(RT::TicketCustomFieldValue->new($self->CurrentUser));
+}
+
+        eval "require RT::TicketCustomFieldValues_Overlay";
+        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Overlay.pm}) {
+            die $@;
+        };
+
+        eval "require RT::TicketCustomFieldValues_Vendor";
+        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Vendor.pm}) {
+            die $@;
+        };
+
+        eval "require RT::TicketCustomFieldValues_Local";
+        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Local.pm}) {
+            die $@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows "overlay" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+RT::TicketCustomFieldValues_Overlay, RT::TicketCustomFieldValues_Vendor, RT::TicketCustomFieldValues_Local
+
+=cut
+
+
+1;
diff --git a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm b/rt/lib/RT/TicketCustomFieldValues_Overlay.pm
new file mode 100644 (file)
index 0000000..5777c37
--- /dev/null
@@ -0,0 +1,86 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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;
+no warnings qw(redefine);
+
+# {{{ sub LimitToCustomField
+
+=head2 LimitToCustomField FIELD
+
+Limits the returned set to values for the custom field with Id FIELD
+
+=cut
+  
+sub LimitToCustomField {
+    my $self = shift;
+    my $cf = shift;
+    return ($self->Limit( FIELD => 'CustomField',
+                         VALUE => $cf,
+                         OPERATOR => '='));
+
+}
+
+# }}}
+
+# {{{ sub LimitToTicket
+
+=head2 LimitToTicket TICKETID
+
+Limits the returned set to values for the ticket with Id TICKETID
+
+=cut
+  
+sub LimitToTicket {
+    my $self = shift;
+    my $ticket = shift;
+    return ($self->Limit( FIELD => 'Ticket',
+                         VALUE => $ticket,
+                         OPERATOR => '='));
+
+}
+
+# }}}
+
+
+=sub HasEntry VALUE
+
+Returns true if this CustomFieldValues collection has an entry with content that eq VALUE
+
+=cut
+
+
+sub HasEntry {
+    my $self = shift;
+    my $value = shift;
+
+    #TODO: this could cache and optimize a fair bit.
+    foreach my $item (@{$self->ItemsArrayRef}) {
+        return(1) if ($item->Content eq $value);  
+    }
+    return undef;
+
+}
+
+1;
+
diff --git a/rt/lib/RT/Ticket_Overlay.pm b/rt/lib/RT/Ticket_Overlay.pm
new file mode 100644 (file)
index 0000000..c88bbc9
--- /dev/null
@@ -0,0 +1,4040 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# {{{ Front Material 
+
+=head1 SYNOPSIS
+
+  use RT::Ticket;
+  my $ticket = new RT::Ticket($CurrentUser);
+  $ticket->Load($ticket_id);
+
+=head1 DESCRIPTION
+
+This module lets you manipulate RT\'s ticket object.
+
+
+=head1 METHODS
+
+=begin testing
+
+use_ok ( RT::Queue);
+ok(my $testqueue = RT::Queue->new($RT::SystemUser));
+ok($testqueue->Create( Name => 'ticket tests'));
+ok($testqueue->Id != 0);
+use_ok(RT::CustomField);
+ok(my $testcf = RT::CustomField->new($RT::SystemUser));
+ok($testcf->Create( Name => 'selectmulti',
+                    Queue => $testqueue->id,
+                               Type => 'SelectMultiple'));
+ok($testcf->AddValue ( Name => 'Value1',
+                        SortOrder => '1',
+                        Description => 'A testing value'));
+ok($testcf->AddValue ( Name => 'Value2',
+                        SortOrder => '2',
+                        Description => 'Another testing value'));
+ok($testcf->AddValue ( Name => 'Value3',
+                        SortOrder => '3',
+                        Description => 'Yet Another testing value'));
+                       
+ok($testcf->Values->Count == 3);
+
+use_ok(RT::Ticket);
+
+my $u = RT::User->new($RT::SystemUser);
+$u->Load("root");
+ok ($u->Id, "Found the root user");
+ok(my $t = RT::Ticket->new($RT::SystemUser));
+ok(my ($id, $msg) = $t->Create( Queue => $testqueue->Id,
+               Subject => 'Testing',
+               Owner => $u->Id
+              ));
+ok($id != 0);
+ok ($t->OwnerObj->Id == $u->Id, "Root is the ticket owner");
+ok(my ($cfv, $cfm) =$t->AddCustomFieldValue(Field => $testcf->Id,
+                           Value => 'Value1'));
+ok($cfv != 0, "Custom field creation didn't return an error: $cfm");
+ok($t->CustomFieldValues($testcf->Id)->Count == 1);
+ok($t->CustomFieldValues($testcf->Id)->First &&
+    $t->CustomFieldValues($testcf->Id)->First->Content eq 'Value1');;
+
+ok(my ($cfdv, $cfdm) = $t->DeleteCustomFieldValue(Field => $testcf->Id,
+                        Value => 'Value1'));
+ok ($cfdv != 0, "Deleted a custom field value: $cfdm");
+ok($t->CustomFieldValues($testcf->Id)->Count == 0);
+
+ok(my $t2 = RT::Ticket->new($RT::SystemUser));
+ok($t2->Load($id));
+ok($t2->Subject eq 'Testing');
+ok($t2->QueueObj->Id eq $testqueue->id);
+ok($t2->OwnerObj->Id == $u->Id);
+
+my $t3 = RT::Ticket->new($RT::SystemUser);
+my ($id3, $msg3) = $t3->Create( Queue => $testqueue->Id,
+                                Subject => 'Testing',
+                                Owner => $u->Id);
+my ($cfv1, $cfm1) = $t->AddCustomFieldValue(Field => $testcf->Id,
+ Value => 'Value1');
+ok($cfv1 != 0, "Adding a custom field to ticket 1 is successful: $cfm");
+my ($cfv2, $cfm2) = $t3->AddCustomFieldValue(Field => $testcf->Id,
+ Value => 'Value2');
+ok($cfv2 != 0, "Adding a custom field to ticket 2 is successful: $cfm");
+my ($cfv3, $cfm3) = $t->AddCustomFieldValue(Field => $testcf->Id,
+ Value => 'Value3');
+ok($cfv3 != 0, "Adding a custom field to ticket 1 is successful: $cfm");
+ok($t->CustomFieldValues($testcf->Id)->Count == 2,
+   "This ticket has 2 custom field values");
+ok($t3->CustomFieldValues($testcf->Id)->Count == 1,
+   "This ticket has 1 custom field value");
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use RT::Queue;
+use RT::User;
+use RT::Record;
+use RT::Links;
+use RT::Date;
+use RT::CustomFields;
+use RT::TicketCustomFieldValues;
+use RT::Tickets;
+use RT::URI::fsck_com_rt;
+use RT::URI;
+
+=begin testing
+
+
+ok(require RT::Ticket, "Loading the RT::Ticket library");
+
+=end testing
+
+=cut
+
+# }}}
+
+# {{{ LINKTYPEMAP
+# A helper table for relationships mapping to make it easier
+# to build and parse links between tickets
+
+use vars '%LINKTYPEMAP';
+
+%LINKTYPEMAP = (
+    MemberOf => { Type => 'MemberOf',
+                  Mode => 'Target', },
+    Members => { Type => 'MemberOf',
+                 Mode => 'Base', },
+    HasMember => { Type => 'MemberOf',
+                   Mode => 'Base', },
+    RefersTo => { Type => 'RefersTo',
+                  Mode => 'Target', },
+    ReferredToBy => { Type => 'RefersTo',
+                      Mode => 'Base', },
+    DependsOn => { Type => 'DependsOn',
+                   Mode => 'Target', },
+    DependedOnBy => { Type => 'DependsOn',
+                      Mode => 'Base', },
+
+);
+
+# }}}
+
+# {{{ LINKDIRMAP
+# A helper table for relationships mapping to make it easier
+# to build and parse links between tickets
+
+use vars '%LINKDIRMAP';
+
+%LINKDIRMAP = (
+    MemberOf => { Base => 'MemberOf',
+                  Target => 'HasMember', },
+    RefersTo => { Base => 'RefersTo',
+                Target => 'ReferredToBy', },
+    DependsOn => { Base => 'DependsOn',
+                   Target => 'DependedOnBy', },
+
+);
+
+# }}}
+
+# {{{ sub Load
+
+=head2 Load
+
+Takes a single argument. This can be a ticket id, ticket alias or 
+local ticket uri.  If the ticket can't be loaded, returns undef.
+Otherwise, returns the ticket id.
+
+=cut
+
+sub Load {
+    my $self = shift;
+    my $id   = shift;
+
+    #TODO modify this routine to look at EffectiveId and do the recursive load
+    # thing. be careful to cache all the interim tickets we try so we don't loop forever.
+
+    #If it's a local URI, turn it into a ticket id
+    if ( $id =~ /^$RT::TicketBaseURI(\d+)$/ ) {
+        $id = $1;
+    }
+
+    #If it's a remote URI, we're going to punt for now
+    elsif ( $id =~ '://' ) {
+        return (undef);
+    }
+
+    #If we have an integer URI, load the ticket
+    if ( $id =~ /^\d+$/ ) {
+        my $ticketid = $self->LoadById($id);
+
+        unless ($ticketid) {
+            $RT::Logger->debug("$self tried to load a bogus ticket: $id\n");
+            return (undef);
+        }
+    }
+
+    #It's not a URI. It's not a numerical ticket ID. Punt!
+    else {
+        return (undef);
+    }
+
+    #If we're merged, resolve the merge.
+    if ( ( $self->EffectiveId ) and ( $self->EffectiveId != $self->Id ) ) {
+        return ( $self->Load( $self->EffectiveId ) );
+    }
+
+    #Ok. we're loaded. lets get outa here.
+    return ( $self->Id );
+
+}
+
+# }}}
+
+# {{{ sub LoadByURI
+
+=head2 LoadByURI
+
+Given a local ticket URI, loads the specified ticket.
+
+=cut
+
+sub LoadByURI {
+    my $self = shift;
+    my $uri  = shift;
+
+    if ( $uri =~ /^$RT::TicketBaseURI(\d+)$/ ) {
+        my $id = $1;
+        return ( $self->Load($id) );
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ sub Create
+
+=head2 Create (ARGS)
+
+Arguments: ARGS is a hash of named parameters.  Valid parameters are:
+
+  id 
+  Queue  - Either a Queue object or a Queue Name
+  Requestor -  A reference to a list of RT::User objects, email addresses or RT user Names
+  Cc  - A reference to a list of RT::User objects, email addresses or Names
+  AdminCc  - A reference to a  list of RT::User objects, email addresses or Names
+  Type -- The ticket\'s type. ignore this for now
+  Owner -- This ticket\'s owner. either an RT::User object or this user\'s id
+  Subject -- A string describing the subject of the ticket
+  InitialPriority -- an integer from 0 to 99
+  FinalPriority -- an integer from 0 to 99
+  Status -- any valid status (Defined in RT::Queue)
+  TimeEstimated -- an integer. estimated time for this task in minutes
+  TimeWorked -- an integer. time worked so far in minutes
+  TimeLeft -- an integer. time remaining in minutes
+  Starts -- an ISO date describing the ticket\'s start date and time in GMT
+  Due -- an ISO date describing the ticket\'s due date and time in GMT
+  MIMEObj -- a MIME::Entity object with the content of the initial ticket request.
+  CustomField-<n> -- a scalar or array of values for the customfield with the id <n>
+
+
+Returns: TICKETID, Transaction Object, Error Message
+
+
+=begin testing
+
+my $t = RT::Ticket->new($RT::SystemUser);
+
+ok( $t->Create(Queue => 'General', Due => '2002-05-21 00:00:00', ReferredToBy => 'http://www.cpan.org', RefersTo => 'http://fsck.com', Subject => 'This is a subject'), "Ticket Created");
+
+ok ( my $id = $t->Id, "Got ticket id");
+ok ($t->RefersTo->First->Target =~ /fsck.com/, "Got refers to");
+ok ($t->ReferredToBy->First->Base =~ /cpan.org/, "Got referredtoby");
+ok ($t->ResolvedObj->Unix == -1, "It hasn't been resolved - ". $t->ResolvedObj->Unix);
+
+=end testing
+
+=cut
+
+sub Create {
+    my $self = shift;
+
+    my %args = ( id              => undef,
+                 Queue           => undef,
+                 Requestor       => undef,
+                 Cc              => undef,
+                 AdminCc         => undef,
+                 Type            => 'ticket',
+                 Owner           => undef,
+                 Subject         => '',
+                 InitialPriority => undef,
+                 FinalPriority   => undef,
+                 Status          => 'new',
+                 TimeWorked      => "0",
+                 TimeLeft        => 0,
+                 TimeEstimated        => 0,
+                 Due             => undef,
+                 Starts          => undef,
+                 Started         => undef,
+                 Resolved        => undef,
+                 MIMEObj         => undef,
+                 _RecordTransaction => 1,
+                 
+
+
+                 @_ );
+
+    my ( $ErrStr, $Owner, $resolved );
+    my (@non_fatal_errors);
+
+    my $QueueObj = RT::Queue->new($RT::SystemUser);
+
+    
+    if ( ( defined( $args{'Queue'} ) ) && ( !ref( $args{'Queue'} ) ) ) {
+        $QueueObj->Load( $args{'Queue'} );
+    }
+    elsif ( ref( $args{'Queue'} ) eq 'RT::Queue' ) {
+        $QueueObj->Load( $args{'Queue'}->Id );
+    }
+    else {
+        $RT::Logger->debug( $args{'Queue'} . " not a recognised queue object.");
+    }
+;
+
+    #Can't create a ticket without a queue.
+    unless ( defined($QueueObj) && $QueueObj->Id ) {
+        $RT::Logger->debug("$self No queue given for ticket creation.");
+        return ( 0, 0, $self->loc('Could not create ticket. Queue not set') );
+    }
+
+    #Now that we have a queue, Check the ACLS
+    unless ( $self->CurrentUser->HasRight( Right    => 'CreateTicket',
+                                                Object => $QueueObj )
+      ) {
+        return ( 0, 0,
+                 $self->loc( "No permission to create tickets in the queue '[_1]'", $QueueObj->Name ) );
+    }
+
+    unless ( $QueueObj->IsValidStatus( $args{'Status'} ) ) {
+        return ( 0, 0, $self->loc('Invalid value for status') );
+    }
+
+
+    #Since we have a queue, we can set queue defaults
+    #Initial Priority
+
+    # If there's no queue default initial priority and it's not set, set it to 0
+    $args{'InitialPriority'} = ( $QueueObj->InitialPriority || 0 )
+      unless ( defined $args{'InitialPriority'} );
+
+    #Final priority 
+
+    # If there's no queue default final priority and it's not set, set it to 0
+    $args{'FinalPriority'} = ( $QueueObj->FinalPriority || 0 )
+      unless ( defined $args{'FinalPriority'} );
+
+    # {{{ Dates
+    #TODO we should see what sort of due date we're getting, rather +
+    # than assuming it's in ISO format.
+
+    #Set the due date. if we didn't get fed one, use the queue default due in
+    my $Due = new RT::Date( $self->CurrentUser );
+
+    if ( $args{'Due'} ) {
+        $Due->Set( Format => 'ISO', Value  => $args{'Due'} );
+    }
+    elsif (  $QueueObj->DefaultDueIn  ) {
+        $Due->SetToNow;
+        $Due->AddDays( $QueueObj->DefaultDueIn );
+    }
+
+    my $Starts = new RT::Date( $self->CurrentUser );
+    if ( defined $args{'Starts'} ) {
+        $Starts->Set( Format => 'ISO', Value  => $args{'Starts'} );
+    }
+
+    my $Started = new RT::Date( $self->CurrentUser );
+    if ( defined $args{'Started'} ) {
+        $Started->Set( Format => 'ISO', Value  => $args{'Started'} );
+    }
+
+    my $Resolved = new RT::Date( $self->CurrentUser );
+    if ( defined $args{'Resolved'} ) {
+        $Resolved->Set( Format => 'ISO', Value  => $args{'Resolved'} );
+    }
+
+
+    #If the status is an inactive status, set the resolved date
+    if ($QueueObj->IsInactiveStatus($args{'Status'}) && !$args{'Resolved'}) {
+        $RT::Logger->debug("Got a ".$args{'Status'} . "ticket with a resolved of ".$args{'Resolved'});
+        $Resolved->SetToNow;
+    }
+
+    # }}}
+
+    # {{{ Dealing with time fields
+
+    $args{'TimeEstimated'} = 0 unless defined $args{'TimeEstimated'};
+    $args{'TimeWorked'}    = 0 unless defined $args{'TimeWorked'};
+    $args{'TimeLeft'}      = 0 unless defined $args{'TimeLeft'};
+
+    # }}}
+
+    # {{{ Deal with setting the owner
+
+    if ( ref( $args{'Owner'} ) eq 'RT::User' ) {
+        $Owner = $args{'Owner'};
+    }
+
+    #If we've been handed something else, try to load the user.
+    elsif ( defined $args{'Owner'} ) {
+        $Owner = RT::User->new( $self->CurrentUser );
+        $Owner->Load( $args{'Owner'} );
+
+    }
+
+    #If we have a proposed owner and they don't have the right 
+    #to own a ticket, scream about it and make them not the owner
+    if (     ( defined($Owner) )
+         and ( $Owner->Id )
+         and ( $Owner->Id != $RT::Nobody->Id )
+         and ( !$Owner->HasRight( Object => $QueueObj,
+                                       Right    => 'OwnTicket' ) )
+      ) {
+
+        $RT::Logger->warning( "User "
+                              . $Owner->Name . "("
+                              . $Owner->id
+                              . ") was proposed "
+                              . "as a ticket owner but has no rights to own "
+                              . "tickets in ".$QueueObj->Name );
+
+        push @non_fatal_errors, $self->loc("Invalid owner. Defaulting to 'nobody'.");
+
+        $Owner = undef;
+    }
+
+    #If we haven't been handed a valid owner, make it nobody.
+    unless ( defined($Owner) && $Owner->Id ) {
+        $Owner = new RT::User( $self->CurrentUser );
+        $Owner->Load( $RT::Nobody->Id );
+    }
+
+    # }}}
+
+    # We attempt to load or create each of the people who might have a role for this ticket
+    # _outside_ the transaction, so we don't get into ticket creation races
+    foreach my $type ( "Cc", "AdminCc", "Requestor" ) {
+     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+$/);
+        }
+    }
+
+
+    $RT::Handle->BeginTransaction();
+
+    my %params =( Queue           => $QueueObj->Id,
+                                   Owner           => $Owner->Id,
+                                   Subject         => $args{'Subject'},
+                                   InitialPriority => $args{'InitialPriority'},
+                                   FinalPriority   => $args{'FinalPriority'},
+                                   Priority        => $args{'InitialPriority'},
+                                   Status          => $args{'Status'},
+                                   TimeWorked      => $args{'TimeWorked'},
+                                   TimeEstimated   => $args{'TimeEstimated'},
+                                   TimeLeft        => $args{'TimeLeft'},
+                                   Type            => $args{'Type'},
+                                   Starts          => $Starts->ISO,
+                                   Started         => $Started->ISO,
+                                   Resolved        => $Resolved->ISO,
+                                   Due             => $Due->ISO );
+
+    # Parameters passed in during an import that we probably don't want to touch, otherwise
+    foreach my $attr qw(id Creator Created LastUpdated LastUpdatedBy) {
+        $params{$attr} = $args{$attr} if ($args{$attr});
+    }
+
+    # Delete null integer parameters
+    foreach my $attr qw(TimeWorked TimeLeft TimeEstimated InitialPriority FinalPriority) {
+        delete $params{$attr}  unless (exists $params{$attr} && $params{$attr});
+    }
+
+
+    my $id = $self->SUPER::Create( %params);
+    unless ($id) {
+        $RT::Logger->crit( "Couldn't create a ticket");
+        $RT::Handle->Rollback();
+        return ( 0, 0, $self->loc( "Ticket could not be created due to an internal error") );
+    }
+
+    #Set the ticket's effective ID now that we've created it.
+    my ( $val, $msg ) = $self->__Set( Field => 'EffectiveId', Value => $id );
+
+    unless ($val) {
+        $RT::Logger->crit("$self ->Create couldn't set EffectiveId: $msg\n");
+        $RT::Handle->Rollback();
+        return ( 0, 0, $self->loc( "Ticket could not be created due to an internal error") );
+    }
+
+    my $create_groups_ret = $self->_CreateTicketGroups();
+    unless ($create_groups_ret) {
+        $RT::Logger->crit( "Couldn't create ticket groups for ticket "
+                           . $self->Id
+                           . ". aborting Ticket creation." );
+        $RT::Handle->Rollback();
+        return ( 0, 0,
+                 $self->loc( "Ticket could not be created due to an internal error") );
+    }
+
+    # Set the owner in the Groups table
+    # We denormalize it into the Ticket table too because doing otherwise would 
+    # kill performance, bigtime. It gets kept in lockstep thanks to the magic of transactionalization
+
+    $self->OwnerGroup->_AddMember( PrincipalId => $Owner->PrincipalId , InsideTransaction => 1);
+
+    # {{{ Deal with setting up watchers
+
+
+    foreach my $type ( "Cc", "AdminCc", "Requestor" ) {
+        next unless (defined $args{$type});
+        foreach my $watcher ( ref( $args{$type} ) ? @{ $args{$type} } : ( $args{$type} ) ) {
+
+           # we reason that all-digits number must be a principal id, not email
+           # this is the only way to can add
+           my $field = 'Email';
+           $field = 'PrincipalId' if $watcher =~ /^\d+$/;
+
+           my ( $wval, $wmsg );
+
+            if ( $type eq 'AdminCc' ) {
+
+                # Note that we're using AddWatcher, rather than _AddWatcher, as we 
+                # actually _want_ that ACL check. Otherwise, random ticket creators
+                # could make themselves adminccs and maybe get ticket rights. that would
+                # be poor
+                ( $wval, $wmsg ) = $self->AddWatcher( Type   => $type,
+                                                         $field => $watcher,
+                                                         Silent => 1 );
+            }
+            else {
+                ( $wval, $wmsg ) = $self->_AddWatcher( Type   => $type,
+                                                          $field => $watcher,
+                                                          Silent => 1 );
+            }
+
+            push @non_fatal_errors, $wmsg unless ($wval);
+        }
+    }
+
+    # }}}
+    # {{{ Deal with setting up links
+
+
+    foreach my $type ( keys %LINKTYPEMAP ) {
+        next unless (defined $args{$type});
+        foreach my $link (
+            ref( $args{$type} ) ? @{ $args{$type} } : ( $args{$type} ) )
+        {
+            my ( $wval, $wmsg ) = $self->AddLink(
+                Type                          => $LINKTYPEMAP{$type}->{'Type'},
+                $LINKTYPEMAP{$type}->{'Mode'} => $link,
+                Silent                        => 1
+            );
+
+            push @non_fatal_errors, $wmsg unless ($wval);
+        }
+    }
+
+    # }}}
+
+   # {{{ Add all the custom fields 
+
+    foreach my $arg ( keys %args ) {
+    next unless ( $arg =~ /^CustomField-(\d+)$/i );
+    my $cfid = $1;
+    foreach
+      my $value ( ref( $args{$arg} ) ? @{ $args{$arg} } : ( $args{$arg} ) ) {
+        next unless ($value);
+        $self->_AddCustomFieldValue( Field => $cfid,
+                                     Value => $value,
+                                     RecordTransaction => 0
+                                 );
+    }
+    }
+    # }}}
+
+    if ( $args{'_RecordTransaction'} ) {
+        # {{{ Add a transaction for the create
+        my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction(
+                                                     Type      => "Create",
+                                                     TimeTaken => 0,
+                                                     MIMEObj => $args{'MIMEObj'}
+        );
+
+
+        if ( $self->Id && $Trans ) {
+            $ErrStr = $self->loc( "Ticket [_1] created in queue '[_2]'", $self->Id, $QueueObj->Name );
+            $ErrStr = join ( "\n", $ErrStr, @non_fatal_errors );
+
+            $RT::Logger->info("Ticket ".$self->Id. " created in queue '".$QueueObj->Name."' by ".$self->CurrentUser->Name);
+        }
+        else {
+            $RT::Handle->Rollback();
+
+            # TODO where does this get errstr from?
+            $RT::Logger->error("Ticket couldn't be created: $ErrStr");
+            return ( 0, 0, $self->loc( "Ticket could not be created due to an internal error"));
+        }
+
+        $RT::Handle->Commit();
+        return ( $self->Id, $TransObj->Id, $ErrStr );
+        # }}}
+    }
+    else {
+
+        # Not going to record a transaction
+        $RT::Handle->Commit();
+        $ErrStr = $self->loc( "Ticket [_1] created in queue '[_2]'", $self->Id, $QueueObj->Name );
+        $ErrStr = join ( "\n", $ErrStr, @non_fatal_errors );
+        return ( $self->Id, $0, $ErrStr );
+
+    }
+}
+
+
+# }}}
+
+# {{{ sub CreateFromEmailMessage
+
+
+=head2 CreateFromEmailMessage { Message, Queue, ExtractActorFromHeaders } 
+
+This code replaces what was once a large part of the email gateway.
+It takes an email message as a parameter, parses out the sender, subject
+and a MIME object. It then creates a ticket based on those attributes
+
+=cut
+
+sub CreateFromEmailMessage {
+    my $self = shift;
+    my %args = ( Message => undef,
+                 Queue => undef,
+                 ExtractActorFromSender => undef,
+                 @_ );
+
+    
+    # Pull out requestor
+
+    # Pull out Cc?
+
+    # 
+
+
+}
+
+# }}}
+
+
+# {{{ CreateFrom822
+
+=head2 FORMAT
+
+CreateTickets uses the template as a template for an ordered set of tickets 
+to create. The basic format is as follows:
+
+
+ ===Create-Ticket: identifier
+ Param: Value
+ Param2: Value
+ Param3: Value
+ Content: Blah
+ blah
+ blah
+ ENDOFCONTENT
+=head2 Acceptable fields
+
+A complete list of acceptable fields for this beastie:
+
+
+    *  Queue           => Name or id# of a queue
+       Subject         => A text string
+       Status          => A valid status. defaults to 'new'
+
+       Due             => Dates can be specified in seconds since the epoch
+                          to be handled literally or in a semi-free textual
+                          format which RT will attempt to parse.
+       Starts          => 
+       Started         => 
+       Resolved        => 
+       Owner           => Username or id of an RT user who can and should own 
+                          this ticket
+   +   Requestor       => Email address
+   +   Cc              => Email address 
+   +   AdminCc         => Email address 
+       TimeWorked      => 
+       TimeEstimated   => 
+       TimeLeft        => 
+       InitialPriority => 
+       FinalPriority   => 
+       Type            => 
+    +  DependsOn       => 
+    +  DependedOnBy    =>
+    +  RefersTo        =>
+    +  ReferredToBy    => 
+    +  Members         =>
+    +  MemberOf        => 
+       Content         => content. Can extend to multiple lines. Everything
+                          within a template after a Content: header is treated
+                          as content until we hit a line containing only 
+                          ENDOFCONTENT
+       ContentType     => the content-type of the Content field
+       CustomField-<id#> => custom field value
+
+Fields marked with an * are required.
+
+Fields marked with a + man have multiple values, simply
+by repeating the fieldname on a new line with an additional value.
+
+
+When parsed, field names are converted to lowercase and have -s stripped.
+Refers-To, RefersTo, refersto, refers-to and r-e-f-er-s-tO will all 
+be treated as the same thing.
+
+
+=begin testing
+
+use_ok(RT::Ticket);
+
+=end testing
+
+
+=cut
+
+sub CreateFrom822 {
+    my $self    = shift;
+    my $content = shift;
+
+
+
+    my %args = $self->_Parse822HeadersForAttributes($content);
+
+    # Now we have a %args to work with.
+    # Make sure we have at least the minimum set of
+    # reasonable data and do our thang
+    my $ticket = RT::Ticket->new($RT::SystemUser);
+
+    my %ticketargs = (
+        Queue           => $args{'queue'},
+        Subject         => $args{'subject'},
+        Status          => $args{'status'},
+        Due             => $args{'due'},
+        Starts          => $args{'starts'},
+        Started         => $args{'started'},
+        Resolved        => $args{'resolved'},
+        Owner           => $args{'owner'},
+        Requestor       => $args{'requestor'},
+        Cc              => $args{'cc'},
+        AdminCc         => $args{'admincc'},
+        TimeWorked      => $args{'timeworked'},
+        TimeEstimated   => $args{'timeestimated'},
+        TimeLeft        => $args{'timeleft'},
+        InitialPriority => $args{'initialpriority'},
+        FinalPriority   => $args{'finalpriority'},
+        Type            => $args{'type'},
+        DependsOn       => $args{'dependson'},
+        DependedOnBy    => $args{'dependedonby'},
+        RefersTo        => $args{'refersto'},
+        ReferredToBy    => $args{'referredtoby'},
+        Members         => $args{'members'},
+        MemberOf        => $args{'memberof'},
+        MIMEObj         => $args{'mimeobj'}
+    );
+
+    # Add custom field entries to %ticketargs.
+    # TODO: allow named custom fields
+    map {
+        /^customfield-(\d+)$/
+          && ( $ticketargs{ "CustomField-" . $1 } = $args{$_} );
+    } keys(%args);
+
+    my ( $id, $transid, $msg ) = $ticket->Create(%ticketargs);
+    unless ($id) {
+        $RT::Logger->error( "Couldn't create a related ticket for "
+              . $self->TicketObj->Id . " "
+              . $msg );
+    }
+
+    return (1);
+}
+
+# }}}
+
+# {{{ UpdateFrom822 
+
+=head2 UpdateFrom822 $MESSAGE
+
+Takes an RFC822 format message as a string and uses it to make a bunch of changes to a ticket.
+Returns an um. ask me again when the code exists
+
+
+=begin testing
+
+my $simple_update = <<EOF;
+Subject: target
+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");
+$ticket->UpdateFrom822($simple_update);
+is($ticket->Subject, 'target', "changed the subject");
+my $jesse = RT::User->new($RT::SystemUser);
+$jesse->LoadByEmail('jesse@example.com');
+ok ($jesse->Id, "There's a user for jesse");
+ok($ticket->Requestors->HasMember( $jesse->PrincipalObj), "It has the jesse principal object as a requestor ");
+
+=end testing
+
+
+=cut
+
+sub UpdateFrom822 {
+        my $self = shift;
+        my $content = shift;
+        my %args = $self->_Parse822HeadersForAttributes($content);
+
+        
+    my %ticketargs = (
+        Queue           => $args{'queue'},
+        Subject         => $args{'subject'},
+        Status          => $args{'status'},
+        Due             => $args{'due'},
+        Starts          => $args{'starts'},
+        Started         => $args{'started'},
+        Resolved        => $args{'resolved'},
+        Owner           => $args{'owner'},
+        Requestor       => $args{'requestor'},
+        Cc              => $args{'cc'},
+        AdminCc         => $args{'admincc'},
+        TimeWorked      => $args{'timeworked'},
+        TimeEstimated   => $args{'timeestimated'},
+        TimeLeft        => $args{'timeleft'},
+        InitialPriority => $args{'initialpriority'},
+        Priority => $args{'priority'},
+        FinalPriority   => $args{'finalpriority'},
+        Type            => $args{'type'},
+        DependsOn       => $args{'dependson'},
+        DependedOnBy    => $args{'dependedonby'},
+        RefersTo        => $args{'refersto'},
+        ReferredToBy    => $args{'referredtoby'},
+        Members         => $args{'members'},
+        MemberOf        => $args{'memberof'},
+        MIMEObj         => $args{'mimeobj'}
+    );
+
+    foreach my $type qw(Requestor Cc Admincc) {
+
+        foreach my $action ( 'Add', 'Del', '' ) {
+
+            my $lctag = lc($action) . lc($type);
+            foreach my $list ( $args{$lctag}, $args{ $lctag . 's' } ) {
+
+                foreach my $entry ( ref($list) ? @{$list} : ($list) ) {
+                    push @{$ticketargs{ $action . $type }} , split ( /\s*,\s*/, $entry );
+                }
+
+            }
+
+            # Todo: if we're given an explicit list, transmute it into a list of adds/deletes
+
+        }
+    }
+
+    # Add custom field entries to %ticketargs.
+    # TODO: allow named custom fields
+    map {
+        /^customfield-(\d+)$/
+          && ( $ticketargs{ "CustomField-" . $1 } = $args{$_} );
+    } keys(%args);
+
+# for each ticket we've been told to update, iterate through the set of
+# rfc822 headers and perform that update to the ticket.
+
+
+    # {{{ Set basic fields 
+    my @attribs = qw(
+      Subject
+      FinalPriority
+      Priority
+      TimeEstimated
+      TimeWorked
+      TimeLeft
+      Status
+      Queue
+      Type
+    );
+
+
+    # Resolve the queue from a name to a numeric id.
+    if ( $ticketargs{'Queue'} and ( $ticketargs{'Queue'} !~ /^(\d+)$/ ) ) {
+        my $tempqueue = RT::Queue->new($RT::SystemUser);
+        $tempqueue->Load( $ticketargs{'Queue'} );
+        $ticketargs{'Queue'} = $tempqueue->Id() if ( $tempqueue->id );
+    }
+
+    # die "updaterecordobject is a webui thingy";
+    my @results;
+
+    foreach my $attribute (@attribs) {
+        my $value = $ticketargs{$attribute};
+
+        if ( $value ne $self->$attribute() ) {
+
+            my $method = "Set$attribute";
+            my ( $code, $msg ) = $self->$method($value);
+
+            push @results, $self->loc($attribute) . ': ' . $msg;
+
+        }
+    }
+
+    # We special case owner changing, so we can use ForceOwnerChange
+    if ( $ticketargs{'Owner'} && ( $self->Owner != $ticketargs{'Owner'} ) ) {
+        my $ChownType = "Give";
+        $ChownType = "Force" if ( $ticketargs{'ForceOwnerChange'} );
+
+        my ( $val, $msg ) = $self->SetOwner( $ticketargs{'Owner'}, $ChownType );
+        push ( @results, $msg );
+    }
+
+    # }}}
+# Deal with setting watchers
+
+
+# Acceptable arguments:
+#  Requestor
+#  Requestors
+#  AddRequestor
+#  AddRequestors
+#  DelRequestor
+ foreach my $type qw(Requestor Cc AdminCc) {
+
+        # 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);
+                push (@results, $msg) ;
+                }
+
+        # If we've been given a number of addresses to add, do it.
+                foreach my $address (@{$ticketargs{'Add'.$type}}) {
+                $RT::Logger->debug("Adding $address as a $type");
+                my ($id, $msg) = $self->AddWatcher( Type => $type, Email => $address);
+                push (@results, $msg) ;
+
+        }
+
+
+}
+
+
+}
+# }}}
+
+# {{{ _Parse822HeadersForAttributes Content
+
+=head2 _Parse822HeadersForAttributes Content
+
+Takes an RFC822 style message and parses its attributes into a hash.
+
+=cut
+
+sub _Parse822HeadersForAttributes {
+    my $self    = shift;
+    my $content = shift;
+    my %args;
+
+    my @lines = ( split ( /\n/, $content ) );
+    while ( defined( my $line = shift @lines ) ) {
+        if ( $line =~ /^(.*?):(?:\s+(.*))?$/ ) {
+            my $value = $2;
+            my $tag   = lc($1);
+
+            $tag =~ s/-//g;
+            if ( defined( $args{$tag} ) )
+            {    #if we're about to get a second value, make it an array
+                $args{$tag} = [ $args{$tag} ];
+            }
+            if ( ref( $args{$tag} ) )
+            {    #If it's an array, we want to push the value
+                push @{ $args{$tag} }, $value;
+            }
+            else {    #if there's nothing there, just set the value
+                $args{$tag} = $value;
+            }
+        } elsif ($line =~ /^$/) {
+
+            #TODO: this won't work, since "" isn't of the form "foo:value"
+
+                while ( defined( my $l = shift @lines ) ) {
+                    push @{ $args{'content'} }, $l;
+                }
+            }
+        
+    }
+
+    foreach my $date qw(due starts started resolved) {
+        my $dateobj = RT::Date->new($RT::SystemUser);
+        if ( $args{$date} =~ /^\d+$/ ) {
+            $dateobj->Set( Format => 'unix', Value => $args{$date} );
+        }
+        else {
+            $dateobj->Set( Format => 'unknown', Value => $args{$date} );
+        }
+        $args{$date} = $dateobj->ISO;
+    }
+    $args{'mimeobj'} = MIME::Entity->new();
+    $args{'mimeobj'}->build(
+        Type => ( $args{'contenttype'} || 'text/plain' ),
+        Data => ($args{'content'} || '')
+    );
+
+    return (%args);
+}
+
+# }}}
+
+# {{{ sub Import
+
+=head2 Import PARAMHASH
+
+Import a ticket. 
+Doesn\'t create a transaction. 
+Doesn\'t supply queue defaults, etc.
+
+Returns: TICKETID
+
+=cut
+
+sub Import {
+    my $self = shift;
+    my ( $ErrStr, $QueueObj, $Owner );
+
+    my %args = (
+        id              => undef,
+        EffectiveId     => undef,
+        Queue           => undef,
+        Requestor       => undef,
+        Type            => 'ticket',
+        Owner           => $RT::Nobody->Id,
+        Subject         => '[no subject]',
+        InitialPriority => undef,
+        FinalPriority   => undef,
+        Status          => 'new',
+        TimeWorked      => "0",
+        Due             => undef,
+        Created         => undef,
+        Updated         => undef,
+        Resolved        => undef,
+        Told            => undef,
+        @_
+    );
+
+    if ( ( defined( $args{'Queue'} ) ) && ( !ref( $args{'Queue'} ) ) ) {
+        $QueueObj = RT::Queue->new($RT::SystemUser);
+        $QueueObj->Load( $args{'Queue'} );
+
+        #TODO error check this and return 0 if it\'s not loading properly +++
+    }
+    elsif ( ref( $args{'Queue'} ) eq 'RT::Queue' ) {
+        $QueueObj = RT::Queue->new($RT::SystemUser);
+        $QueueObj->Load( $args{'Queue'}->Id );
+    }
+    else {
+        $RT::Logger->debug(
+            "$self " . $args{'Queue'} . " not a recognised queue object." );
+    }
+
+    #Can't create a ticket without a queue.
+    unless ( defined($QueueObj) and $QueueObj->Id ) {
+        $RT::Logger->debug("$self No queue given for ticket creation.");
+        return ( 0, $self->loc('Could not create ticket. Queue not set') );
+    }
+
+    #Now that we have a queue, Check the ACLS
+    unless (
+        $self->CurrentUser->HasRight(
+            Right    => 'CreateTicket',
+            Object => $QueueObj
+        )
+      )
+    {
+        return ( 0,
+            $self->loc("No permission to create tickets in the queue '[_1]'"
+              , $QueueObj->Name));
+    }
+
+    # {{{ Deal with setting the owner
+
+    # Attempt to take user object, user name or user id.
+    # Assign to nobody if lookup fails.
+    if ( defined( $args{'Owner'} ) ) {
+        if ( ref( $args{'Owner'} ) ) {
+            $Owner = $args{'Owner'};
+        }
+        else {
+            $Owner = new RT::User( $self->CurrentUser );
+            $Owner->Load( $args{'Owner'} );
+            if ( !defined( $Owner->id ) ) {
+                $Owner->Load( $RT::Nobody->id );
+            }
+        }
+    }
+
+    #If we have a proposed owner and they don't have the right 
+    #to own a ticket, scream about it and make them not the owner
+    if (
+        ( defined($Owner) )
+        and ( $Owner->Id != $RT::Nobody->Id )
+        and (
+            !$Owner->HasRight(
+                Object => $QueueObj,
+                Right    => 'OwnTicket'
+            )
+        )
+      )
+    {
+
+        $RT::Logger->warning( "$self user "
+              . $Owner->Name . "("
+              . $Owner->id
+              . ") was proposed "
+              . "as a ticket owner but has no rights to own "
+              . "tickets in '"
+              . $QueueObj->Name . "'\n" );
+
+        $Owner = undef;
+    }
+
+    #If we haven't been handed a valid owner, make it nobody.
+    unless ( defined($Owner) ) {
+        $Owner = new RT::User( $self->CurrentUser );
+        $Owner->Load( $RT::Nobody->UserObj->Id );
+    }
+
+    # }}}
+
+    unless ( $self->ValidateStatus( $args{'Status'} ) ) {
+        return ( 0, $self->loc("'[_1]' is an invalid value for status", $args{'Status'}) );
+    }
+
+    $self->{'_AccessibleCache'}{Created}       = { 'read' => 1, 'write' => 1 };
+    $self->{'_AccessibleCache'}{Creator}       = { 'read' => 1, 'auto'  => 1 };
+    $self->{'_AccessibleCache'}{LastUpdated}   = { 'read' => 1, 'write' => 1 };
+    $self->{'_AccessibleCache'}{LastUpdatedBy} = { 'read' => 1, 'auto'  => 1 };
+
+    # If we're coming in with an id, set that now.
+    my $EffectiveId = undef;
+    if ( $args{'id'} ) {
+        $EffectiveId = $args{'id'};
+
+    }
+
+    my $id = $self->SUPER::Create(
+        id              => $args{'id'},
+        EffectiveId     => $EffectiveId,
+        Queue           => $QueueObj->Id,
+        Owner           => $Owner->Id,
+        Subject         => $args{'Subject'},           # loc
+        InitialPriority => $args{'InitialPriority'},   # loc
+        FinalPriority   => $args{'FinalPriority'},     # loc
+        Priority        => $args{'InitialPriority'},   # loc
+        Status          => $args{'Status'},            # loc
+        TimeWorked      => $args{'TimeWorked'},                # loc
+        Type            => $args{'Type'},              # loc
+        Created         => $args{'Created'},           # loc
+        Told            => $args{'Told'},              # loc
+        LastUpdated     => $args{'Updated'},           # loc
+        Resolved        => $args{'Resolved'},          # loc
+        Due             => $args{'Due'},               # loc
+    );
+
+    # If the ticket didn't have an id
+    # Set the ticket's effective ID now that we've created it.
+    if ( $args{'id'} ) {
+        $self->Load( $args{'id'} );
+    }
+    else {
+        my ( $val, $msg ) =
+          $self->__Set( Field => 'EffectiveId', Value => $id );
+
+        unless ($val) {
+            $RT::Logger->err(
+                $self . "->Import couldn't set EffectiveId: $msg\n" );
+        }
+    }
+
+    my $watcher;
+    foreach $watcher ( @{ $args{'Cc'} } ) {
+        $self->_AddWatcher( Type => 'Cc', Person => $watcher, Silent => 1 );
+    }
+    foreach $watcher ( @{ $args{'AdminCc'} } ) {
+        $self->_AddWatcher( Type => 'AdminCc', Person => $watcher,
+            Silent => 1 );
+    }
+    foreach $watcher ( @{ $args{'Requestor'} } ) {
+        $self->_AddWatcher( Type => 'Requestor', Person => $watcher,
+            Silent => 1 );
+    }
+
+    return ( $self->Id, $ErrStr );
+}
+
+# }}}
+
+
+# {{{ Routines dealing with watchers.
+
+# {{{ _CreateTicketGroups 
+
+=head2 _CreateTicketGroups
+
+Create the ticket groups and relationships for this ticket. 
+This routine expects to be called from Ticket->Create _inside of a transaction_
+
+It will create four groups for this ticket: Requestor, Cc, AdminCc and Owner.
+
+It will return true on success and undef on failure.
+
+=begin testing
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+my ($id, $msg) = $ticket->Create(Subject => "Foo",
+                Owner => $RT::SystemUser->Id,
+                Status => 'open',
+                Requestor => ['jesse@example.com'],
+                Queue => '1'
+                );
+ok ($id, "Ticket $id was created");
+ok(my $group = RT::Group->new($RT::SystemUser));
+ok($group->LoadTicketRoleGroup(Ticket => $id, Type=> 'Requestor'));
+ok ($group->Id, "Found the requestors object for this ticket");
+
+ok(my $jesse = RT::User->new($RT::SystemUser), "Creating a jesse rt::user");
+$jesse->LoadByEmail('jesse@example.com');
+ok($jesse->Id,  "Found the jesse rt user");
+
+
+ok ($ticket->IsWatcher(Type => 'Requestor', PrincipalId => $jesse->PrincipalId), "The ticket actually has jesse at fsck.com as a requestor");
+ok ((my $add_id, $add_msg) = $ticket->AddWatcher(Type => 'Requestor', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
+ok ($add_id, "Add succeeded: ($add_msg)");
+ok(my $bob = RT::User->new($RT::SystemUser), "Creating a bob rt::user");
+$bob->LoadByEmail('bob@fsck.com');
+ok($bob->Id,  "Found the bob rt user");
+ok ($ticket->IsWatcher(Type => 'Requestor', PrincipalId => $bob->PrincipalId), "The ticket actually has bob at fsck.com as a requestor");;
+ok ((my $add_id, $add_msg) = $ticket->DeleteWatcher(Type =>'Requestor', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
+ok (!$ticket->IsWatcher(Type => 'Requestor', Principal => $bob->PrincipalId), "The ticket no longer has bob at fsck.com as a requestor");;
+
+
+$group = RT::Group->new($RT::SystemUser);
+ok($group->LoadTicketRoleGroup(Ticket => $id, Type=> 'Cc'));
+ok ($group->Id, "Found the cc object for this ticket");
+$group = RT::Group->new($RT::SystemUser);
+ok($group->LoadTicketRoleGroup(Ticket => $id, Type=> 'AdminCc'));
+ok ($group->Id, "Found the AdminCc object for this ticket");
+$group = RT::Group->new($RT::SystemUser);
+ok($group->LoadTicketRoleGroup(Ticket => $id, Type=> 'Owner'));
+ok ($group->Id, "Found the Owner object for this ticket");
+ok($group->HasMember($RT::SystemUser->UserObj->PrincipalObj), "the owner group has the member 'RT_System'");
+
+=end testing
+
+=cut
+
+
+sub _CreateTicketGroups {
+    my $self = shift;
+    
+    my @types = qw(Requestor Owner Cc AdminCc);
+
+    foreach my $type (@types) {
+        my $type_obj = RT::Group->new($self->CurrentUser);
+        my ($id, $msg) = $type_obj->CreateRoleGroup(Domain => 'RT::Ticket-Role',
+                                                       Instance => $self->Id, 
+                                                       Type => $type);
+        unless ($id) {
+            $RT::Logger->error("Couldn't create a ticket group of type '$type' for ticket ".
+                               $self->Id.": ".$msg);     
+            return(undef);
+        }
+     }
+    return(1);
+    
+}
+
+# }}}
+
+# {{{ sub OwnerGroup
+
+=head2 OwnerGroup
+
+A constructor which returns an RT::Group object containing the owner of this ticket.
+
+=cut
+
+sub OwnerGroup {
+    my $self = shift;
+    my $owner_obj = RT::Group->new($self->CurrentUser);
+    $owner_obj->LoadTicketRoleGroup( Ticket => $self->Id,  Type => 'Owner');
+    return ($owner_obj);
+}
+
+# }}}
+
+
+# {{{ sub AddWatcher
+
+=head2 AddWatcher
+
+AddWatcher takes a parameter hash. The keys are as follows:
+
+Type        One of Requestor, Cc, AdminCc
+
+PrinicpalId The RT::Principal id of the user or group that's being added as a watcher
+
+Email       The email address of the new watcher. If a user with this 
+            email address can't be found, a new nonprivileged user will be created.
+
+If the watcher you\'re trying to set has an RT account, set the Owner paremeter to their User Id. Otherwise, set the Email parameter to their Email address.
+
+=cut
+
+sub AddWatcher {
+    my $self = shift;
+    my %args = (
+        Type  => undef,
+        PrincipalId => undef,
+        Email => undef,
+        @_
+    );
+
+    # {{{ Check ACLS
+    #If the watcher we're trying to add is for the current user
+    if ( $self->CurrentUser->PrincipalId  eq $args{'PrincipalId'}) {
+        #  If it's an AdminCc and they don't have 
+        #   'WatchAsAdminCc' or 'ModifyTicket', bail
+        if ( $args{'Type'} eq 'AdminCc' ) {
+            unless ( $self->CurrentUserHasRight('ModifyTicket')
+                or $self->CurrentUserHasRight('WatchAsAdminCc') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+
+        #  If it's a Requestor or Cc and they don't have
+        #   'Watch' or 'ModifyTicket', bail
+        elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) {
+
+            unless ( $self->CurrentUserHasRight('ModifyTicket')
+                or $self->CurrentUserHasRight('Watch') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+        else {
+            $RT::Logger->warn( "$self -> AddWatcher got passed a bogus type");
+            return ( 0, $self->loc('Error in parameters to Ticket->AddWatcher') );
+        }
+    }
+
+    # If the watcher isn't the current user 
+    # and the current user  doesn't have 'ModifyTicket'
+    # bail
+    else {
+        unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+
+    # }}}
+
+    return ( $self->_AddWatcher(%args) );
+}
+
+#This contains the meat of AddWatcher. but can be called from a routine like
+# Create, which doesn't need the additional acl check
+sub _AddWatcher {
+    my $self = shift;
+    my %args = (
+        Type   => undef,
+        Silent => undef,
+        PrincipalId => undef,
+        Email => undef,
+        @_
+    );
+
+
+    my $principal = RT::Principal->new($self->CurrentUser);
+    if ($args{'Email'}) {
+        my $user = RT::User->new($RT::SystemUser);
+        my ($pid, $msg) = $user->LoadOrCreateByEmail($args{'Email'});
+        if ($pid) {
+            $args{'PrincipalId'} = $pid; 
+        }
+    }
+    if ($args{'PrincipalId'}) {
+        $principal->Load($args{'PrincipalId'});
+    } 
+
+    # If we can't find this watcher, we need to bail.
+    unless ($principal->Id) {
+            $RT::Logger->error("Could not load create a user with the email address '".$args{'Email'}. "' to add as a watcher for ticket ".$self->Id);
+        return(0, $self->loc("Could not find or create that user"));
+    }
+
+
+    my $group = RT::Group->new($self->CurrentUser);
+    $group->LoadTicketRoleGroup(Type => $args{'Type'}, Ticket => $self->Id);
+    unless ($group->id) {
+        return(0,$self->loc("Group not found"));
+    }
+
+    if ( $group->HasMember( $principal)) {
+
+        return ( 0, $self->loc('That principal is already a [_1] for this ticket', $self->loc($args{'Type'})) );
+    }
+
+
+    my ( $m_id, $m_msg ) = $group->_AddMember( PrincipalId => $principal->Id,
+                                               InsideTransaction => 1 );
+    unless ($m_id) {
+        $RT::Logger->error("Failed to add ".$principal->Id." as a member of group ".$group->Id."\n".$m_msg);
+
+        return ( 0, $self->loc('Could not make that principal a [_1] for this ticket', $self->loc($args{'Type'})) );
+    }
+
+    unless ( $args{'Silent'} ) {
+        $self->_NewTransaction(
+            Type     => 'AddWatcher',
+            NewValue => $principal->Id,
+            Field    => $args{'Type'}
+        );
+    }
+
+        return ( 1, $self->loc('Added principal as a [_1] for this ticket', $self->loc($args{'Type'})) );
+}
+
+# }}}
+
+
+# {{{ sub DeleteWatcher
+
+=head2 DeleteWatcher { Type => TYPE, PrincipalId => PRINCIPAL_ID, Email => EMAIL_ADDRESS }
+
+
+Deletes a Ticket watcher.  Takes two arguments:
+
+Type  (one of Requestor,Cc,AdminCc)
+
+and one of
+
+PrincipalId (an RT::Principal Id of the watcher you want to remove)
+    OR
+Email (the email address of an existing wathcer)
+
+
+=cut
+
+
+sub DeleteWatcher {
+    my $self = shift;
+
+    my %args = ( Type => undef,
+                 PrincipalId => undef,
+                 Email => undef,
+                 @_ );
+
+    unless ($args{'PrincipalId'} || $args{'Email'} ) {
+        return(0, $self->loc("No principal specified"));
+    }
+    my $principal = RT::Principal->new($self->CurrentUser);
+    if ($args{'PrincipalId'} ) {
+
+        $principal->Load($args{'PrincipalId'});
+    } else {
+        my $user = RT::User->new($self->CurrentUser);
+        $user->LoadByEmail($args{'Email'});
+        $principal->Load($user->Id);
+    }
+    # If we can't find this watcher, we need to bail.
+    unless ($principal->Id) {
+        return(0, $self->loc("Could not find that principal"));
+    }
+
+    my $group = RT::Group->new($self->CurrentUser);
+    $group->LoadTicketRoleGroup(Type => $args{'Type'}, Ticket => $self->Id);
+    unless ($group->id) {
+        return(0,$self->loc("Group not found"));
+    }
+
+    # {{{ Check ACLS
+    #If the watcher we're trying to add is for the current user
+    if ( $self->CurrentUser->PrincipalId  eq $args{'PrincipalId'}) {
+        #  If it's an AdminCc and they don't have 
+        #   'WatchAsAdminCc' or 'ModifyTicket', bail
+        if ( $args{'Type'} eq 'AdminCc' ) {
+            unless ( $self->CurrentUserHasRight('ModifyTicket')
+                or $self->CurrentUserHasRight('WatchAsAdminCc') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+
+        #  If it's a Requestor or Cc and they don't have
+        #   'Watch' or 'ModifyTicket', bail
+        elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) {
+            unless ( $self->CurrentUserHasRight('ModifyTicket')
+                or $self->CurrentUserHasRight('Watch') ) {
+                return ( 0, $self->loc('Permission Denied'))
+            }
+        }
+        else {
+            $RT::Logger->warn( "$self -> DeleteWatcher got passed a bogus type");
+            return ( 0, $self->loc('Error in parameters to Ticket->DelWatcher') );
+        }
+    }
+
+    # If the watcher isn't the current user 
+    # and the current user  doesn't have 'ModifyTicket' bail
+    else {
+        unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+
+    # }}}
+
+
+    # see if this user is already a watcher.
+
+    unless ( $group->HasMember($principal)) {
+        return ( 0, 
+        $self->loc('That principal is not a [_1] for this ticket', $args{'Type'}) );
+    }
+
+    my ($m_id, $m_msg) = $group->_DeleteMember($principal->Id);
+    unless ($m_id) {
+        $RT::Logger->error("Failed to delete ".$principal->Id.
+                           " as a member of group ".$group->Id."\n".$m_msg);
+
+        return ( 0,    $self->loc('Could not remove that principal as a [_1] for this ticket', $args{'Type'}) );
+    }
+
+    unless ( $args{'Silent'} ) {
+        $self->_NewTransaction(
+            Type     => 'DelWatcher',
+            OldValue => $principal->Id,
+            Field    => $args{'Type'}
+        );
+    }
+
+    return ( 1, $self->loc("[_1] is no longer a [_2] for this ticket.", $principal->Object->Name, $args{'Type'} ));
+}
+
+
+
+
+# }}}
+
+
+# {{{ a set of  [foo]AsString subs that will return the various sorts of watchers for a ticket/queue as a comma delineated string
+
+=head2 RequestorAddresses
+
+ B<Returns> String: All Ticket Requestor email addresses as a string.
+
+=cut
+
+sub RequestorAddresses {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+        return undef;
+    }
+
+    return ( $self->Requestors->MemberEmailAddressesAsString );
+}
+
+
+=head2 AdminCcAddresses
+
+returns String: All Ticket AdminCc email addresses as a string
+
+=cut
+
+sub AdminCcAddresses {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+        return undef;
+    }
+
+    return ( $self->AdminCc->MemberEmailAddressesAsString )
+
+}
+
+=head2 CcAddresses
+
+returns String: All Ticket Ccs as a string of email addresses
+
+=cut
+
+sub CcAddresses {
+    my $self = shift;
+
+    unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+        return undef;
+    }
+
+    return ( $self->Cc->MemberEmailAddressesAsString);
+
+}
+
+# }}}
+
+# {{{ Routines that return RT::Watchers objects of Requestors, Ccs and AdminCcs
+
+# {{{ sub Requestors
+
+=head2 Requestors
+
+Takes nothing.
+Returns this ticket's Requestors as an RT::Group object
+
+=cut
+
+sub Requestors {
+    my $self = shift;
+
+    my $group = RT::Group->new($self->CurrentUser);
+    if ( $self->CurrentUserHasRight('ShowTicket') ) {
+        $group->LoadTicketRoleGroup(Type => 'Requestor', Ticket => $self->Id);
+    }
+    return ($group);
+
+}
+
+# }}}
+
+# {{{ sub Cc
+
+=head2 Cc
+
+Takes nothing.
+Returns an RT::Group object which contains this ticket's Ccs.
+If the user doesn't have "ShowTicket" permission, returns an empty group
+
+=cut
+
+sub Cc {
+    my $self = shift;
+
+    my $group = RT::Group->new($self->CurrentUser);
+    if ( $self->CurrentUserHasRight('ShowTicket') ) {
+        $group->LoadTicketRoleGroup(Type => 'Cc', Ticket => $self->Id);
+    }
+    return ($group);
+
+}
+
+# }}}
+
+# {{{ sub AdminCc
+
+=head2 AdminCc
+
+Takes nothing.
+Returns an RT::Group object which contains this ticket's AdminCcs.
+If the user doesn't have "ShowTicket" permission, returns an empty group
+
+=cut
+
+sub AdminCc {
+    my $self = shift;
+
+    my $group = RT::Group->new($self->CurrentUser);
+    if ( $self->CurrentUserHasRight('ShowTicket') ) {
+        $group->LoadTicketRoleGroup(Type => 'AdminCc', Ticket => $self->Id);
+    }
+    return ($group);
+
+}
+
+# }}}
+
+# }}}
+
+# {{{ IsWatcher,IsRequestor,IsCc, IsAdminCc
+
+# {{{ sub IsWatcher
+# a generic routine to be called by IsRequestor, IsCc and IsAdminCc
+
+=head2 IsWatcher { Type => TYPE, PrincipalId => PRINCIPAL_ID, Email => EMAIL }
+
+Takes a param hash with the attributes Type and either PrincipalId or Email
+
+Type is one of Requestor, Cc, AdminCc and Owner
+
+PrincipalId is an RT::Principal id, and Email is an email address.
+
+Returns true if the specified principal (or the one corresponding to the
+specified address) is a member of the group Type for this ticket.
+
+=cut
+
+sub IsWatcher {
+    my $self = shift;
+
+    my %args = ( Type  => 'Requestor',
+        PrincipalId    => undef,
+        Email          => undef,
+        @_
+    );
+
+    # Load the relevant group. 
+    my $group = RT::Group->new($self->CurrentUser);
+    $group->LoadTicketRoleGroup(Type => $args{'Type'}, Ticket => $self->id);
+
+    # Find the relevant principal.
+    my $principal = RT::Principal->new($self->CurrentUser);
+    if (!$args{PrincipalId} && $args{Email}) {
+        # Look up the specified user.
+        my $user = RT::User->new($self->CurrentUser);
+        $user->LoadByEmail($args{Email});
+        if ($user->Id) {
+            $args{PrincipalId} = $user->PrincipalId;
+        }
+        else {
+            # A non-existent user can't be a group member.
+            return 0;
+        }
+    }
+    $principal->Load($args{'PrincipalId'});
+
+    # Ask if it has the member in question
+    return ($group->HasMember($principal));
+}
+
+# }}}
+
+# {{{ sub IsRequestor
+
+=head2 IsRequestor PRINCIPAL_ID
+  
+  Takes an RT::Principal id
+  Returns true if the principal is a requestor of the current ticket.
+
+
+=cut
+
+sub IsRequestor {
+    my $self   = shift;
+    my $person = shift;
+
+    return ( $self->IsWatcher( Type => 'Requestor', PrincipalId => $person ) );
+
+};
+
+# }}}
+
+# {{{ sub IsCc
+
+=head2 IsCc PRINCIPAL_ID
+
+  Takes an RT::Principal id.
+  Returns true if the principal is a requestor of the current ticket.
+
+
+=cut
+
+sub IsCc {
+    my $self = shift;
+    my $cc   = shift;
+
+    return ( $self->IsWatcher( Type => 'Cc', PrincipalId => $cc ) );
+
+}
+
+# }}}
+
+# {{{ sub IsAdminCc
+
+=head2 IsAdminCc PRINCIPAL_ID
+
+  Takes an RT::Principal id.
+  Returns true if the principal is a requestor of the current ticket.
+
+=cut
+
+sub IsAdminCc {
+    my $self   = shift;
+    my $person = shift;
+
+    return ( $self->IsWatcher( Type => 'AdminCc', PrincipalId => $person ) );
+
+}
+
+# }}}
+
+# {{{ sub IsOwner
+
+=head2 IsOwner
+
+  Takes an RT::User object. Returns true if that user is this ticket's owner.
+returns undef otherwise
+
+=cut
+
+sub IsOwner {
+    my $self   = shift;
+    my $person = shift;
+
+    # no ACL check since this is used in acl decisions
+    # unless ($self->CurrentUserHasRight('ShowTicket')) {
+    #  return(undef);
+    #   }      
+
+    #Tickets won't yet have owners when they're being created.
+    unless ( $self->OwnerObj->id ) {
+        return (undef);
+    }
+
+    if ( $person->id == $self->OwnerObj->id ) {
+        return (1);
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with queues 
+
+# {{{ sub ValidateQueue
+
+sub ValidateQueue {
+    my $self  = shift;
+    my $Value = shift;
+
+    if ( !$Value ) {
+        $RT::Logger->warning( " RT:::Queue::ValidateQueue called with a null value. this isn't ok.");
+        return (1);
+    }
+
+    my $QueueObj = RT::Queue->new( $self->CurrentUser );
+    my $id       = $QueueObj->Load($Value);
+
+    if ($id) {
+        return (1);
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ sub SetQueue  
+
+sub SetQueue {
+    my $self     = shift;
+    my $NewQueue = shift;
+
+    #Redundant. ACL gets checked in _Set;
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    my $NewQueueObj = RT::Queue->new( $self->CurrentUser );
+    $NewQueueObj->Load($NewQueue);
+
+    unless ( $NewQueueObj->Id() ) {
+        return ( 0, $self->loc("That queue does not exist") );
+    }
+
+    if ( $NewQueueObj->Id == $self->QueueObj->Id ) {
+        return ( 0, $self->loc('That is the same value') );
+    }
+    unless (
+        $self->CurrentUser->HasRight(
+            Right    => 'CreateTicket',
+            Object => $NewQueueObj
+        )
+      )
+    {
+        return ( 0, $self->loc("You may not create requests in that queue.") );
+    }
+
+    unless (
+        $self->OwnerObj->HasRight(
+            Right    => 'OwnTicket',
+            Object => $NewQueueObj
+        )
+      )
+    {
+        $self->Untake();
+    }
+
+    return ( $self->_Set( Field => 'Queue', Value => $NewQueueObj->Id() ) );
+
+}
+
+# }}}
+
+# {{{ sub QueueObj
+
+=head2 QueueObj
+
+Takes nothing. returns this ticket's queue object
+
+=cut
+
+sub QueueObj {
+    my $self = shift;
+
+    my $queue_obj = RT::Queue->new( $self->CurrentUser );
+
+    #We call __Value so that we can avoid the ACL decision and some deep recursion
+    my ($result) = $queue_obj->Load( $self->__Value('Queue') );
+    return ($queue_obj);
+}
+
+# }}}
+
+# }}}
+
+# {{{ Date printing routines
+
+# {{{ sub DueObj
+
+=head2 DueObj
+
+  Returns an RT::Date object containing this ticket's due date
+
+=cut
+
+sub DueObj {
+    my $self = shift;
+
+    my $time = new RT::Date( $self->CurrentUser );
+
+    # -1 is RT::Date slang for never
+    if ( $self->Due ) {
+        $time->Set( Format => 'sql', Value => $self->Due );
+    }
+    else {
+        $time->Set( Format => 'unix', Value => -1 );
+    }
+
+    return $time;
+}
+
+# }}}
+
+# {{{ sub DueAsString 
+
+=head2 DueAsString
+
+Returns this ticket's due date as a human readable string
+
+=cut
+
+sub DueAsString {
+    my $self = shift;
+    return $self->DueObj->AsString();
+}
+
+# }}}
+
+# {{{ sub ResolvedObj
+
+=head2 ResolvedObj
+
+  Returns an RT::Date object of this ticket's 'resolved' time.
+
+=cut
+
+sub ResolvedObj {
+    my $self = shift;
+
+    my $time = new RT::Date( $self->CurrentUser );
+    $time->Set( Format => 'sql', Value => $self->Resolved );
+    return $time;
+}
+
+# }}}
+
+# {{{ sub SetStarted
+
+=head2 SetStarted
+
+Takes a date in ISO format or undef
+Returns a transaction id and a message
+The client calls "Start" to note that the project was started on the date in $date.
+A null date means "now"
+
+=cut
+
+sub SetStarted {
+    my $self = shift;
+    my $time = shift || 0;
+
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, self->loc("Permission Denied") );
+    }
+
+    #We create a date object to catch date weirdness
+    my $time_obj = new RT::Date( $self->CurrentUser() );
+    if ( $time != 0 ) {
+        $time_obj->Set( Format => 'ISO', Value => $time );
+    }
+    else {
+        $time_obj->SetToNow();
+    }
+
+    #Now that we're starting, open this ticket
+    #TODO do we really want to force this as policy? it should be a scrip
+
+    #We need $TicketAsSystem, in case the current user doesn't have
+    #ShowTicket
+    #
+    my $TicketAsSystem = new RT::Ticket($RT::SystemUser);
+    $TicketAsSystem->Load( $self->Id );
+    if ( $TicketAsSystem->Status eq 'new' ) {
+        $TicketAsSystem->Open();
+    }
+
+    return ( $self->_Set( Field => 'Started', Value => $time_obj->ISO ) );
+
+}
+
+# }}}
+
+# {{{ sub StartedObj
+
+=head2 StartedObj
+
+  Returns an RT::Date object which contains this ticket's 
+'Started' time.
+
+=cut
+
+sub StartedObj {
+    my $self = shift;
+
+    my $time = new RT::Date( $self->CurrentUser );
+    $time->Set( Format => 'sql', Value => $self->Started );
+    return $time;
+}
+
+# }}}
+
+# {{{ sub StartsObj
+
+=head2 StartsObj
+
+  Returns an RT::Date object which contains this ticket's 
+'Starts' time.
+
+=cut
+
+sub StartsObj {
+    my $self = shift;
+
+    my $time = new RT::Date( $self->CurrentUser );
+    $time->Set( Format => 'sql', Value => $self->Starts );
+    return $time;
+}
+
+# }}}
+
+# {{{ sub ToldObj
+
+=head2 ToldObj
+
+  Returns an RT::Date object which contains this ticket's 
+'Told' time.
+
+=cut
+
+sub ToldObj {
+    my $self = shift;
+
+    my $time = new RT::Date( $self->CurrentUser );
+    $time->Set( Format => 'sql', Value => $self->Told );
+    return $time;
+}
+
+# }}}
+
+# {{{ sub ToldAsString
+
+=head2 ToldAsString
+
+A convenience method that returns ToldObj->AsString
+
+TODO: This should be deprecated
+
+=cut
+
+sub ToldAsString {
+    my $self = shift;
+    if ( $self->Told ) {
+        return $self->ToldObj->AsString();
+    }
+    else {
+        return ("Never");
+    }
+}
+
+# }}}
+
+# {{{ sub TimeWorkedAsString
+
+=head2 TimeWorkedAsString
+
+Returns the amount of time worked on this ticket as a Text String
+
+=cut
+
+sub TimeWorkedAsString {
+    my $self = shift;
+    return "0" unless $self->TimeWorked;
+
+    #This is not really a date object, but if we diff a number of seconds 
+    #vs the epoch, we'll get a nice description of time worked.
+
+    my $worked = new RT::Date( $self->CurrentUser );
+
+    #return the  #of minutes worked turned into seconds and written as
+    # a simple text string
+
+    return ( $worked->DurationAsString( $self->TimeWorked * 60 ) );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with correspondence/comments
+
+# {{{ sub Comment
+
+=head2 Comment
+
+Comment on this ticket.
+Takes a hashref with the following attributes:
+If MIMEObj is undefined, Content will be used to build a MIME::Entity for this
+commentl
+
+MIMEObj, TimeTaken, CcMessageTo, BccMessageTo, Content.
+
+=cut
+
+## Please see file perltidy.ERR
+sub Comment {
+    my $self = shift;
+
+    my %args = ( CcMessageTo  => undef,
+                 BccMessageTo => undef,
+                 MIMEObj      => undef,
+                 Content      => undef,
+                 TimeTaken => 0,
+                 @_ );
+
+    unless (    ( $self->CurrentUserHasRight('CommentOnTicket') )
+             or ( $self->CurrentUserHasRight('ModifyTicket') ) ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    unless ( $args{'MIMEObj'} ) {
+        if ( $args{'Content'} ) {
+            use MIME::Entity;
+            $args{'MIMEObj'} = MIME::Entity->build(
+               Data => ( ref $args{'Content'} ? $args{'Content'} : [ $args{'Content'} ] )
+           );
+        }
+        else {
+
+            return ( 0, $self->loc("No correspondence attached") );
+        }
+    }
+
+    RT::I18N::SetMIMEEntityToUTF8($args{'MIMEObj'}); # convert text parts into utf-8
+
+    # If we've been passed in CcMessageTo and BccMessageTo fields,
+    # add them to the mime object for passing on to the transaction handler
+    # The "NotifyOtherRecipients" scripAction will look for RT--Send-Cc: and
+    # RT-Send-Bcc: headers
+
+    $args{'MIMEObj'}->head->add( 'RT-Send-Cc',  $args{'CcMessageTo'} )
+       if defined $args{'CcMessageTo'};
+    $args{'MIMEObj'}->head->add( 'RT-Send-Bcc', $args{'BccMessageTo'} )
+       if defined $args{'BccMessageTo'};
+
+    #Record the correspondence (write the transaction)
+    my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction(
+        Type      => 'Comment',
+        Data      => ( $args{'MIMEObj'}->head->get('subject') || 'No Subject' ),
+        TimeTaken => $args{'TimeTaken'},
+        MIMEObj   => $args{'MIMEObj'}
+    );
+
+    return ( $Trans, $self->loc("The comment has been recorded") );
+}
+
+# }}}
+
+# {{{ sub Correspond
+
+=head2 Correspond
+
+Correspond on this ticket.
+Takes a hashref with the following attributes:
+
+
+MIMEObj, TimeTaken, CcMessageTo, BccMessageTo, Content
+
+if there's no MIMEObj, Content is used to build a MIME::Entity object
+
+
+=cut
+
+sub Correspond {
+    my $self = shift;
+    my %args = ( CcMessageTo  => undef,
+                 BccMessageTo => undef,
+                 MIMEObj      => undef,
+                 Content      => undef,
+                 TimeTaken    => 0,
+                 @_ );
+
+    unless (    ( $self->CurrentUserHasRight('ReplyToTicket') )
+             or ( $self->CurrentUserHasRight('ModifyTicket') ) ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    unless ( $args{'MIMEObj'} ) {
+        if ( $args{'Content'} ) {
+            use MIME::Entity;
+            $args{'MIMEObj'} = MIME::Entity->build(
+               Data => ( ref $args{'Content'} ?  $args{'Content'} : [ $args{'Content'} ] )
+           );
+
+        }
+        else {
+
+            return ( 0, $self->loc("No correspondence attached") );
+        }
+    }
+
+    RT::I18N::SetMIMEEntityToUTF8($args{'MIMEObj'}); # convert text parts into utf-8
+
+    # If we've been passed in CcMessageTo and BccMessageTo fields,
+    # add them to the mime object for passing on to the transaction handler
+    # The "NotifyOtherRecipients" scripAction will look for RT-Send-Cc: and RT-Send-Bcc:
+    # headers
+
+    $args{'MIMEObj'}->head->add( 'RT-Send-Cc',  $args{'CcMessageTo'} )
+       if defined $args{'CcMessageTo'};
+    $args{'MIMEObj'}->head->add( 'RT-Send-Bcc', $args{'BccMessageTo'} )
+       if defined $args{'BccMessageTo'};
+
+    #Record the correspondence (write the transaction)
+    my ( $Trans, $msg, $TransObj ) = $self->_NewTransaction(
+             Type => 'Correspond',
+             Data => ( $args{'MIMEObj'}->head->get('subject') || 'No Subject' ),
+             TimeTaken => $args{'TimeTaken'},
+             MIMEObj   => $args{'MIMEObj'} );
+
+    unless ($Trans) {
+        $RT::Logger->err( "$self couldn't init a transaction $msg");
+        return ( $Trans, $self->loc("correspondence (probably) not sent"), $args{'MIMEObj'} );
+    }
+
+    #Set the last told date to now if this isn't mail from the requestor.
+    #TODO: Note that this will wrongly ack mail from any non-requestor as a "told"
+
+    unless ( $TransObj->IsInbound ) {
+        $self->_SetTold;
+    }
+
+    return ( $Trans, $self->loc("correspondence sent") );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with Links and Relations between tickets
+
+# {{{ Link Collections
+
+# {{{ sub Members
+
+=head2 Members
+
+  This returns an RT::Links object which references all the tickets 
+which are 'MembersOf' this ticket
+
+=cut
+
+sub Members {
+    my $self = shift;
+    return ( $self->_Links( 'Target', 'MemberOf' ) );
+}
+
+# }}}
+
+# {{{ sub MemberOf
+
+=head2 MemberOf
+
+  This returns an RT::Links object which references all the tickets that this
+ticket is a 'MemberOf'
+
+=cut
+
+sub MemberOf {
+    my $self = shift;
+    return ( $self->_Links( 'Base', 'MemberOf' ) );
+}
+
+# }}}
+
+# {{{ RefersTo
+
+=head2 RefersTo
+
+  This returns an RT::Links object which shows all references for which this ticket is a base
+
+=cut
+
+sub RefersTo {
+    my $self = shift;
+    return ( $self->_Links( 'Base', 'RefersTo' ) );
+}
+
+# }}}
+
+# {{{ ReferredToBy
+
+=head2 ReferredToBy
+
+  This returns an RT::Links object which shows all references for which this ticket is a target
+
+=cut
+
+sub ReferredToBy {
+    my $self = shift;
+    return ( $self->_Links( 'Target', 'RefersTo' ) );
+}
+
+# }}}
+
+# {{{ DependedOnBy
+
+=head2 DependedOnBy
+
+  This returns an RT::Links object which references all the tickets that depend on this one
+
+=cut
+
+sub DependedOnBy {
+    my $self = shift;
+    return ( $self->_Links( 'Target', 'DependsOn' ) );
+}
+
+# }}}
+
+
+
+=head2 HasUnresolvedDependencies
+
+  Takes a paramhash of Type (default to '__any').  Returns true if
+$self->UnresolvedDependencies returns an object with one or more members
+of that type.  Returns false otherwise
+
+
+=begin testing
+
+my $t1 = RT::Ticket->new($RT::SystemUser);
+my ($id, $trans, $msg) = $t1->Create(Subject => 'DepTest1', Queue => 'general');
+ok($id, "Created dep test 1 - $msg");
+
+my $t2 = RT::Ticket->new($RT::SystemUser);
+my ($id2, $trans, $msg2) = $t2->Create(Subject => 'DepTest2', Queue => 'general');
+ok($id2, "Created dep test 2 - $msg2");
+my $t3 = RT::Ticket->new($RT::SystemUser);
+my ($id3, $trans, $msg3) = $t3->Create(Subject => 'DepTest3', Queue => 'general', Type => 'approval');
+ok($id3, "Created dep test 3 - $msg3");
+
+ok ($t1->AddLink( Type => 'DependsOn', Target => $t2->id));
+ok ($t1->AddLink( Type => 'DependsOn', Target => $t3->id));
+
+ok ($t1->HasUnresolvedDependencies, "Ticket ".$t1->Id." has unresolved deps");
+ok (!$t1->HasUnresolvedDependencies( Type => 'blah' ), "Ticket ".$t1->Id." has no unresolved blahs");
+ok ($t1->HasUnresolvedDependencies( Type => 'approval' ), "Ticket ".$t1->Id." has unresolved approvals");
+ok (!$t2->HasUnresolvedDependencies, "Ticket ".$t2->Id." has no unresolved deps");
+my ($rid, $rmsg)= $t1->Resolve();
+ok(!$rid, $rmsg);
+ok($t2->Resolve);
+($rid, $rmsg)= $t1->Resolve();
+ok(!$rid, $rmsg);
+ok($t3->Resolve);
+($rid, $rmsg)= $t1->Resolve();
+ok($rid, $rmsg);
+
+
+=end testing
+
+=cut
+
+sub HasUnresolvedDependencies {
+    my $self = shift;
+    my %args = (
+        Type   => undef,
+        @_
+    );
+
+    my $deps = $self->UnresolvedDependencies;
+
+    if ($args{Type}) {
+        $deps->Limit( FIELD => 'Type', 
+              OPERATOR => '=',
+              VALUE => $args{Type}); 
+    }
+    else {
+           $deps->IgnoreType;
+    }
+
+    if ($deps->Count > 0) {
+        return 1;
+    }
+    else {
+        return (undef);
+    }
+}
+
+
+# {{{ UnresolvedDependencies 
+
+=head2 UnresolvedDependencies
+
+Returns an RT::Tickets object of tickets which this ticket depends on
+and which have a status of new, open or stalled. (That list comes from
+RT::Queue->ActiveStatusArray
+
+=cut
+
+
+sub UnresolvedDependencies {
+    my $self = shift;
+    my $deps = RT::Tickets->new($self->CurrentUser);
+
+    my @live_statuses = RT::Queue->ActiveStatusArray();
+    foreach my $status (@live_statuses) {
+        $deps->LimitStatus(VALUE => $status);
+    }
+    $deps->LimitDependedOnBy($self->Id);
+
+    return($deps);
+
+}
+
+# }}}
+
+# {{{ AllDependedOnBy
+
+=head2 AllDependedOnBy
+
+Returns an array of RT::Ticket objects which (directly or indirectly)
+depends on this ticket; takes an optional 'Type' argument in the param
+hash, which will limit returned tickets to that type, as well as cause
+tickets with that type to serve as 'leaf' nodes that stops the recursive
+dependency search.
+
+=cut
+
+sub AllDependedOnBy {
+    my $self = shift;
+    my $dep = $self->DependedOnBy;
+    my %args = (
+        Type   => undef,
+       _found => {},
+       _top   => 1,
+        @_
+    );
+
+    while (my $link = $dep->Next()) {
+       next unless ($link->BaseURI->IsLocal());
+       next if $args{_found}{$link->BaseObj->Id};
+
+       if (!$args{Type}) {
+           $args{_found}{$link->BaseObj->Id} = $link->BaseObj;
+           $link->BaseObj->AllDependedOnBy( %args, _top => 0 );
+       }
+       elsif ($link->BaseObj->Type eq $args{Type}) {
+           $args{_found}{$link->BaseObj->Id} = $link->BaseObj;
+       }
+       else {
+           $link->BaseObj->AllDependedOnBy( %args, _top => 0 );
+       }
+    }
+
+    if ($args{_top}) {
+       return map { $args{_found}{$_} } sort keys %{$args{_found}};
+    }
+    else {
+       return 1;
+    }
+}
+
+# }}}
+
+# {{{ DependsOn
+
+=head2 DependsOn
+
+  This returns an RT::Links object which references all the tickets that this ticket depends on
+
+=cut
+
+sub DependsOn {
+    my $self = shift;
+    return ( $self->_Links( 'Base', 'DependsOn' ) );
+}
+
+# }}}
+
+
+
+
+# {{{ sub _Links 
+
+sub _Links {
+    my $self = shift;
+
+    #TODO: Field isn't the right thing here. but I ahave no idea what mnemonic ---
+    #tobias meant by $f
+    my $field = shift;
+    my $type  = shift || "";
+
+    unless ( $self->{"$field$type"} ) {
+        $self->{"$field$type"} = new RT::Links( $self->CurrentUser );
+        if ( $self->CurrentUserHasRight('ShowTicket') ) {
+            # Maybe this ticket is a merged ticket
+            my $Tickets = new RT::Tickets( $self->CurrentUser );
+            # at least to myself
+            $self->{"$field$type"}->Limit( FIELD => $field,
+                                           VALUE => $self->URI,
+                                           ENTRYAGGREGATOR => 'OR' );
+            $Tickets->Limit( FIELD => 'EffectiveId',
+                             VALUE => $self->EffectiveId );
+            while (my $Ticket = $Tickets->Next) {
+                $self->{"$field$type"}->Limit( FIELD => $field,
+                                               VALUE => $Ticket->URI,
+                                               ENTRYAGGREGATOR => 'OR' );
+            }
+            $self->{"$field$type"}->Limit( FIELD => 'Type',
+                                           VALUE => $type )
+              if ($type);
+        }
+    }
+    return ( $self->{"$field$type"} );
+}
+
+# }}}
+
+# }}}
+
+# {{{ sub DeleteLink 
+
+=head2 DeleteLink
+
+Delete a link. takes a paramhash of Base, Target and Type.
+Either Base or Target must be null. The null value will 
+be replaced with this ticket\'s id
+
+=cut 
+
+sub DeleteLink {
+    my $self = shift;
+    my %args = (
+        Base   => undef,
+        Target => undef,
+        Type   => undef,
+        @_
+    );
+
+    #check acls
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        $RT::Logger->debug("No permission to delete links\n");
+        return ( 0, $self->loc('Permission Denied'))
+
+    }
+
+    #we want one of base and target. we don't care which
+    #but we only want _one_
+
+    my $direction;
+    my $remote_link;
+
+    if ( $args{'Base'} and $args{'Target'} ) {
+        $RT::Logger->debug("$self ->_DeleteLink. got both Base and Target\n");
+        return ( 0, $self->loc("Can't specifiy both base and target") );
+    }
+    elsif ( $args{'Base'} ) {
+        $args{'Target'} = $self->URI();
+       $remote_link = $args{'Base'};
+       $direction = 'Target';
+    }
+    elsif ( $args{'Target'} ) {
+        $args{'Base'} = $self->URI();
+       $remote_link = $args{'Target'};
+        $direction='Base';
+    }
+    else {
+        $RT::Logger->debug("$self: Base or Target must be specified\n");
+        return ( 0, $self->loc('Either base or target must be specified') );
+    }
+
+    my $link = new RT::Link( $self->CurrentUser );
+    $RT::Logger->debug( "Trying to load link: " . $args{'Base'} . " " . $args{'Type'} . " " . $args{'Target'} . "\n" );
+
+
+    $link->LoadByParams( Base=> $args{'Base'}, Type=> $args{'Type'}, Target=>  $args{'Target'} );
+    #it's a real link. 
+    if ( $link->id ) {
+
+        my $linkid = $link->id;
+        $link->Delete();
+
+        my $TransString = "Ticket $args{'Base'} no longer $args{Type} ticket $args{'Target'}.";
+       my $remote_uri = RT::URI->new( $RT::SystemUser );
+       $remote_uri->FromURI( $remote_link );
+
+        my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction(
+            Type      => 'DeleteLink',
+            Field => $LINKDIRMAP{$args{'Type'}}->{$direction},
+           OldValue =>  $remote_uri->URI || $remote_link,
+            TimeTaken => 0
+        );
+
+        return ( $Trans, $self->loc("Link deleted ([_1])", $TransString));
+    }
+
+    #if it's not a link we can find
+    else {
+        $RT::Logger->debug("Couldn't find that link\n");
+        return ( 0, $self->loc("Link not found") );
+    }
+}
+
+# }}}
+
+# {{{ sub AddLink
+
+=head2 AddLink
+
+Takes a paramhash of Type and one of Base or Target. Adds that link to this ticket.
+
+
+=cut
+
+sub AddLink {
+    my $self = shift;
+    my %args = ( Target => '',
+                 Base   => '',
+                 Type   => '',
+                 Silent => undef,
+                 @_ );
+
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    # Remote_link is the URI of the object that is not this ticket
+    my $remote_link;
+    my $direction;
+
+    if ( $args{'Base'} and $args{'Target'} ) {
+        $RT::Logger->debug(
+"$self tried to delete a link. both base and target were specified\n" );
+        return ( 0, $self->loc("Can't specifiy both base and target") );
+    }
+    elsif ( $args{'Base'} ) {
+        $args{'Target'} = $self->URI();
+       $remote_link = $args{'Base'};
+       $direction = 'Target';
+    }
+    elsif ( $args{'Target'} ) {
+        $args{'Base'} = $self->URI();
+       $remote_link = $args{'Target'};
+        $direction='Base';
+    }
+    else {
+        return ( 0, $self->loc('Either base or target must be specified') );
+    }
+
+    # If the base isn't a URI, make it a URI. 
+    # If the target isn't a URI, make it a URI. 
+
+    # {{{ Check if the link already exists - we don't want duplicates
+    use RT::Link;
+    my $old_link = RT::Link->new( $self->CurrentUser );
+    $old_link->LoadByParams( Base   => $args{'Base'},
+                             Type   => $args{'Type'},
+                             Target => $args{'Target'} );
+    if ( $old_link->Id ) {
+        $RT::Logger->debug("$self Somebody tried to duplicate a link");
+        return ( $old_link->id, $self->loc("Link already exists"), 0 );
+    }
+
+    # }}}
+
+    # Storing the link in the DB.
+    my $link = RT::Link->new( $self->CurrentUser );
+    my ($linkid) = $link->Create( Target => $args{Target},
+                                  Base   => $args{Base},
+                                  Type   => $args{Type} );
+
+    unless ($linkid) {
+        return ( 0, $self->loc("Link could not be created") );
+    }
+
+    my $TransString =
+      "Ticket $args{'Base'} $args{Type} ticket $args{'Target'}.";
+
+    # Don't write the transaction if we're doing this on create
+    if ( $args{'Silent'} ) {
+        return ( 1, $self->loc( "Link created ([_1])", $TransString ) );
+    }
+    else {
+       my $remote_uri = RT::URI->new( $RT::SystemUser );
+       $remote_uri->FromURI( $remote_link );
+
+        #Write the transaction
+        my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction(
+                                                         Type  => 'AddLink',
+                                                         Field => $LINKDIRMAP{$args{'Type'}}->{$direction},
+                                                                                    NewValue =>  $remote_uri->URI || $remote_link,
+                                                         TimeTaken => 0 );
+        return ( $Trans, $self->loc( "Link created ([_1])", $TransString ) );
+    }
+
+}
+
+# }}}
+
+# {{{ sub URI 
+
+=head2 URI
+
+Returns this ticket's URI
+
+=cut
+
+sub URI {
+    my $self = shift;
+    my $uri = RT::URI::fsck_com_rt->new($self->CurrentUser);
+    return($uri->URIForObject($self));
+}
+
+# }}}
+
+# {{{ sub MergeInto
+
+=head2 MergeInto
+MergeInto take the id of the ticket to merge this ticket into.
+
+=cut
+
+sub MergeInto {
+    my $self      = shift;
+    my $MergeInto = shift;
+
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    # Load up the new ticket.
+    my $NewTicket = RT::Ticket->new($RT::SystemUser);
+    $NewTicket->Load($MergeInto);
+
+    # make sure it exists.
+    unless ( defined $NewTicket->Id ) {
+        return ( 0, $self->loc("New ticket doesn't exist") );
+    }
+
+    # Make sure the current user can modify the new ticket.
+    unless ( $NewTicket->CurrentUserHasRight('ModifyTicket') ) {
+        $RT::Logger->debug("failed...");
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    $RT::Logger->debug(
+        "checking if the new ticket has the same id and effective id...");
+    unless ( $NewTicket->id == $NewTicket->EffectiveId ) {
+        $RT::Logger->err( "$self trying to merge into "
+              . $NewTicket->Id
+              . " which is itself merged.\n" );
+        return ( 0,
+            $self->loc("Can't merge into a merged ticket. You should never get this error") );
+    }
+
+    # We use EffectiveId here even though it duplicates information from
+    # the links table becasue of the massive performance hit we'd take
+    # by trying to do a seperate database query for merge info everytime 
+    # loaded a ticket. 
+
+    #update this ticket's effective id to the new ticket's id.
+    my ( $id_val, $id_msg ) = $self->__Set(
+        Field => 'EffectiveId',
+        Value => $NewTicket->Id()
+    );
+
+    unless ($id_val) {
+        $RT::Logger->error(
+            "Couldn't set effective ID for " . $self->Id . ": $id_msg" );
+        return ( 0, $self->loc("Merge failed. Couldn't set EffectiveId") );
+    }
+
+    my ( $status_val, $status_msg ) = $self->__Set( Field => 'Status', Value => 'resolved');
+
+    unless ($status_val) {
+        $RT::Logger->error( $self->loc("[_1] couldn't set status to resolved. RT's Database may be inconsistent.", $self) );
+    }
+
+
+    # update all the links that point to that old ticket
+    my $old_links_to = RT::Links->new($self->CurrentUser);
+    $old_links_to->Limit(FIELD => 'Target', VALUE => $self->URI);
+
+    while (my $link = $old_links_to->Next) {
+        if ($link->Base eq $NewTicket->URI) {
+            $link->Delete;
+        } else {
+            $link->SetTarget($NewTicket->URI);
+        }
+
+    }
+
+    my $old_links_from = RT::Links->new($self->CurrentUser);
+    $old_links_from->Limit(FIELD => 'Base', VALUE => $self->URI);
+
+    while (my $link = $old_links_from->Next) {
+        if ($link->Target eq $NewTicket->URI) {
+            $link->Delete;
+        } else {
+            $link->SetBase($NewTicket->URI);
+        }
+
+    }
+
+
+    #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) { 
+        $NewTicket->_AddWatcher( Type => 'Requestor',
+                                  Silent => 1,
+                                  PrincipalId => $watcher->MemberId);
+    }
+
+    my $Ccs = $self->Cc->MembersObj;
+    while (my $watcher = $Ccs->Next) { 
+        $NewTicket->_AddWatcher( Type => 'Cc',
+                                  Silent => 1,
+                                  PrincipalId => $watcher->MemberId);
+    }
+
+    my $AdminCcs = $self->AdminCc->MembersObj;
+    while (my $watcher = $AdminCcs->Next) { 
+        $NewTicket->_AddWatcher( Type => 'AdminCc',
+                                  Silent => 1,
+                                  PrincipalId => $watcher->MemberId);
+    }
+
+
+    #find all of the tickets that were merged into this ticket. 
+    my $old_mergees = new RT::Tickets( $self->CurrentUser );
+    $old_mergees->Limit(
+        FIELD    => 'EffectiveId',
+        OPERATOR => '=',
+        VALUE    => $self->Id
+    );
+
+    #   update their EffectiveId fields to the new ticket's id
+    while ( my $ticket = $old_mergees->Next() ) {
+        my ( $val, $msg ) = $ticket->__Set(
+            Field => 'EffectiveId',
+            Value => $NewTicket->Id()
+        );
+    }
+
+    $NewTicket->_SetLastUpdated;
+
+    return ( 1, $self->loc("Merge Successful") );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with ownership
+
+# {{{ sub OwnerObj
+
+=head2 OwnerObj
+
+Takes nothing and returns an RT::User object of 
+this ticket's owner
+
+=cut
+
+sub OwnerObj {
+    my $self = shift;
+
+    #If this gets ACLed, we lose on a rights check in User.pm and
+    #get deep recursion. if we need ACLs here, we need
+    #an equiv without ACLs
+
+    my $owner = new RT::User( $self->CurrentUser );
+    $owner->Load( $self->__Value('Owner') );
+
+    #Return the owner object
+    return ($owner);
+}
+
+# }}}
+
+# {{{ sub OwnerAsString 
+
+=head2 OwnerAsString
+
+Returns the owner's email address
+
+=cut
+
+sub OwnerAsString {
+    my $self = shift;
+    return ( $self->OwnerObj->EmailAddress );
+
+}
+
+# }}}
+
+# {{{ sub SetOwner
+
+=head2 SetOwner
+
+Takes two arguments:
+     the Id or Name of the owner 
+and  (optionally) the type of the SetOwner Transaction. It defaults
+to 'Give'.  'Steal' is also a valid option.
+
+=begin testing
+
+my $root = RT::User->new($RT::SystemUser);
+$root->Load('root');
+ok ($root->Id, "Loaded the root user");
+my $t = RT::Ticket->new($RT::SystemUser);
+$t->Load(1);
+$t->SetOwner('root');
+ok ($t->OwnerObj->Name eq 'root' , "Root owns the ticket");
+$t->Steal();
+ok ($t->OwnerObj->id eq $RT::SystemUser->id , "SystemUser owns the ticket");
+my $txns = RT::Transactions->new($RT::SystemUser);
+$txns->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$txns->Limit(FIELD => 'Ticket', VALUE => '1');
+my $steal  = $txns->First;
+ok($steal->OldValue == $root->Id , "Stolen from root");
+ok($steal->NewValue == $RT::SystemUser->Id , "Stolen by the systemuser");
+
+=end testing
+
+=cut
+
+sub SetOwner {
+    my $self     = shift;
+    my $NewOwner = shift;
+    my $Type     = shift || "Give";
+
+    # must have ModifyTicket rights
+    # or TakeTicket/StealTicket and $NewOwner is self
+    # see if it's a take
+    if ( $self->OwnerObj->Id == $RT::Nobody->Id ) {
+        unless (    $self->CurrentUserHasRight('ModifyTicket')
+                 || $self->CurrentUserHasRight('TakeTicket') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+
+    # see if it's a steal
+    elsif (    $self->OwnerObj->Id != $RT::Nobody->Id
+            && $self->OwnerObj->Id != $self->CurrentUser->id ) {
+
+        unless (    $self->CurrentUserHasRight('ModifyTicket')
+                 || $self->CurrentUserHasRight('StealTicket') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+    else {
+        unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+            return ( 0, $self->loc("Permission Denied") );
+        }
+    }
+    my $NewOwnerObj = RT::User->new( $self->CurrentUser );
+    my $OldOwnerObj = $self->OwnerObj;
+
+    $NewOwnerObj->Load($NewOwner);
+    if ( !$NewOwnerObj->Id ) {
+        return ( 0, $self->loc("That user does not exist") );
+    }
+
+    #If thie ticket has an owner and it's not the current user
+
+    if (    ( $Type ne 'Steal' )
+        and ( $Type ne 'Force' )
+        and    #If we're not stealing
+        ( $self->OwnerObj->Id != $RT::Nobody->Id ) and    #and the owner is set
+        ( $self->CurrentUser->Id ne $self->OwnerObj->Id() )
+      ) {                                                 #and it's not us
+        return ( 0,
+                 $self->loc(
+"You can only reassign tickets that you own or that are unowned" ) );
+    }
+
+    #If we've specified a new owner and that user can't modify the ticket
+    elsif ( ( $NewOwnerObj->Id )
+            and ( !$NewOwnerObj->HasRight( Right  => 'OwnTicket',
+                                           Object => $self ) )
+      ) {
+        return ( 0, $self->loc("That user may not own tickets in that queue") );
+    }
+
+    #If the ticket has an owner and it's the new owner, we don't need
+    #To do anything
+    elsif (     ( $self->OwnerObj )
+            and ( $NewOwnerObj->Id eq $self->OwnerObj->Id ) ) {
+        return ( 0, $self->loc("That user already owns that ticket") );
+    }
+
+    $RT::Handle->BeginTransaction();
+
+    # Delete the owner in the owner group, then add a new one
+    # TODO: is this safe? it's not how we really want the API to work
+    # for most things, but it's fast.
+    my ( $del_id, $del_msg ) = $self->OwnerGroup->MembersObj->First->Delete();
+    unless ($del_id) {
+        $RT::Handle->Rollback();
+        return ( 0, $self->loc("Could not change owner. ") . $del_msg );
+    }
+
+    my ( $add_id, $add_msg ) = $self->OwnerGroup->_AddMember(
+                                       PrincipalId => $NewOwnerObj->PrincipalId,
+                                       InsideTransaction => 1 );
+    unless ($add_id) {
+        $RT::Handle->Rollback();
+        return ( 0, $self->loc("Could not change owner. ") . $add_msg );
+    }
+
+    # We call set twice with slightly different arguments, so
+    # as to not have an SQL transaction span two RT transactions
+
+    my ( $val, $msg ) = $self->_Set(
+                      Field             => 'Owner',
+                      RecordTransaction => 0,
+                      Value             => $NewOwnerObj->Id,
+                      TimeTaken         => 0,
+                      TransactionType   => $Type,
+                      CheckACL          => 0,                  # don't check acl
+    );
+
+    unless ($val) {
+        $RT::Handle->Rollback;
+        return ( 0, $self->loc("Could not change owner. ") . $msg );
+    }
+
+    $RT::Handle->Commit();
+
+    my ( $trans, $msg, undef ) = $self->_NewTransaction(
+                                                   Type     => $Type,
+                                                   Field    => 'Owner',
+                                                   NewValue => $NewOwnerObj->Id,
+                                                   OldValue => $OldOwnerObj->Id,
+                                                   TimeTaken => 0 );
+
+    if ($trans) {
+        $msg = $self->loc( "Owner changed from [_1] to [_2]",
+                           $OldOwnerObj->Name, $NewOwnerObj->Name );
+
+        # TODO: make sure the trans committed properly
+    }
+    return ( $trans, $msg );
+
+}
+
+# }}}
+
+# {{{ sub Take
+
+=head2 Take
+
+A convenince method to set the ticket's owner to the current user
+
+=cut
+
+sub Take {
+    my $self = shift;
+    return ( $self->SetOwner( $self->CurrentUser->Id, 'Take' ) );
+}
+
+# }}}
+
+# {{{ sub Untake
+
+=head2 Untake
+
+Convenience method to set the owner to 'nobody' if the current user is the owner.
+
+=cut
+
+sub Untake {
+    my $self = shift;
+    return ( $self->SetOwner( $RT::Nobody->UserObj->Id, 'Untake' ) );
+}
+
+# }}}
+
+# {{{ sub Steal 
+
+=head2 Steal
+
+A convenience method to change the owner of the current ticket to the
+current user. Even if it's owned by another user.
+
+=cut
+
+sub Steal {
+    my $self = shift;
+
+    if ( $self->IsOwner( $self->CurrentUser ) ) {
+        return ( 0, $self->loc("You already own this ticket") );
+    }
+    else {
+        return ( $self->SetOwner( $self->CurrentUser->Id, 'Steal' ) );
+
+    }
+
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with status
+
+# {{{ sub ValidateStatus 
+
+=head2 ValidateStatus STATUS
+
+Takes a string. Returns true if that status is a valid status for this ticket.
+Returns false otherwise.
+
+=cut
+
+sub ValidateStatus {
+    my $self   = shift;
+    my $status = shift;
+
+    #Make sure the status passed in is valid
+    unless ( $self->QueueObj->IsValidStatus($status) ) {
+        return (undef);
+    }
+
+    return (1);
+
+}
+
+# }}}
+
+# {{{ sub SetStatus
+
+=head2 SetStatus STATUS
+
+Set this ticket\'s status. STATUS can be one of: new, open, stalled, resolved, rejected or deleted.
+
+Alternatively, you can pass in a list of named parameters (Status => STATUS, Force => FORCE).  If FORCE is true, ignore unresolved dependencies and force a status change.
+
+=begin testing
+
+my $tt = RT::Ticket->new($RT::SystemUser);
+my ($id, $tid, $msg)= $tt->Create(Queue => 'general',
+            Subject => 'test');
+ok($id, $msg);
+ok($tt->Status eq 'new', "New ticket is created as new");
+
+($id, $msg) = $tt->SetStatus('open');
+ok($id, $msg);
+ok ($msg =~ /open/i, "Status message is correct");
+($id, $msg) = $tt->SetStatus('resolved');
+ok($id, $msg);
+ok ($msg =~ /resolved/i, "Status message is correct");
+($id, $msg) = $tt->SetStatus('resolved');
+ok(!$id,$msg);
+
+
+=end testing
+
+
+=cut
+
+sub SetStatus {
+    my $self   = shift;
+    my %args;
+
+    if (@_ == 1) {
+       $args{Status} = shift;
+    }
+    else {
+       %args = (@_);
+    }
+
+    #Check ACL
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc('Permission Denied') );
+    }
+
+    if (!$args{Force} && ($args{'Status'} eq 'resolved') && $self->HasUnresolvedDependencies) {
+        return (0, $self->loc('That ticket has unresolved dependencies'));
+    }
+
+    my $now = RT::Date->new( $self->CurrentUser );
+    $now->SetToNow();
+
+    #If we're changing the status from new, record that we've started
+    if ( ( $self->Status =~ /new/ ) && ( $args{Status} ne 'new' ) ) {
+
+        #Set the Started time to "now"
+        $self->_Set( Field             => 'Started',
+                     Value             => $now->ISO,
+                     RecordTransaction => 0 );
+    }
+
+    if ( $args{Status} =~ /^(resolved|rejected|dead)$/ ) {
+
+        #When we resolve a ticket, set the 'Resolved' attribute to now.
+        $self->_Set( Field             => 'Resolved',
+                     Value             => $now->ISO,
+                     RecordTransaction => 0 );
+    }
+
+    #Actually update the status
+   my ($val, $msg)= $self->_Set( Field           => 'Status',
+                          Value           => $args{Status},
+                          TimeTaken       => 0,
+                          TransactionType => 'Status'  );
+
+    return($val,$msg);
+}
+
+# }}}
+
+# {{{ sub Kill
+
+=head2 Kill
+
+Takes no arguments. Marks this ticket for garbage collection
+
+=cut
+
+sub Kill {
+    my $self = shift;
+    $RT::Logger->crit("'Kill' is deprecated. use 'Delete' instead.");
+    return $self->Delete;
+}
+
+sub Delete {
+    my $self = shift;
+    return ( $self->SetStatus('deleted') );
+
+    # TODO: garbage collection
+}
+
+# }}}
+
+# {{{ sub Stall
+
+=head2 Stall
+
+Sets this ticket's status to stalled
+
+=cut
+
+sub Stall {
+    my $self = shift;
+    return ( $self->SetStatus('stalled') );
+}
+
+# }}}
+
+# {{{ sub Reject
+
+=head2 Reject
+
+Sets this ticket's status to rejected
+
+=cut
+
+sub Reject {
+    my $self = shift;
+    return ( $self->SetStatus('rejected') );
+}
+
+# }}}
+
+# {{{ sub Open
+
+=head2 Open
+
+Sets this ticket\'s status to Open
+
+=cut
+
+sub Open {
+    my $self = shift;
+    return ( $self->SetStatus('open') );
+}
+
+# }}}
+
+# {{{ sub Resolve
+
+=head2 Resolve
+
+Sets this ticket\'s status to Resolved
+
+=cut
+
+sub Resolve {
+    my $self = shift;
+    return ( $self->SetStatus('resolved') );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with custom fields
+
+
+# {{{ FirstCustomFieldValue
+
+=item FirstCustomFieldValue FIELD
+
+Return the content of the first value of CustomField FIELD for this ticket
+Takes a field id or name
+
+=cut
+
+sub FirstCustomFieldValue {
+    my $self = shift;
+    my $field = shift;
+    my $values = $self->CustomFieldValues($field);
+    if ($values->First) {
+        return $values->First->Content;
+    } else {
+        return undef;
+    }
+
+}
+
+
+
+# {{{ CustomFieldValues
+
+=item CustomFieldValues FIELD
+
+Return a TicketCustomFieldValues object of all values of CustomField FIELD for this ticket.  
+Takes a field id or name.
+
+
+=cut
+
+sub CustomFieldValues {
+    my $self  = shift;
+    my $field = shift;
+
+    my $cf = RT::CustomField->new($self->CurrentUser);
+
+    if ($field =~ /^\d+$/) {
+        $cf->LoadById($field);
+    } else {
+        $cf->LoadByNameAndQueue(Name => $field, Queue => $self->QueueObj->Id);
+    }
+    my $cf_values = RT::TicketCustomFieldValues->new( $self->CurrentUser );
+    $cf_values->LimitToCustomField($cf->id);
+    $cf_values->LimitToTicket($self->Id());
+
+    # @values is a CustomFieldValues object;
+    return ($cf_values);
+}
+
+# }}}
+
+# {{{ AddCustomFieldValue
+
+=item AddCustomFieldValue { Field => FIELD, Value => VALUE }
+
+VALUE can either be a CustomFieldValue object or a string.
+FIELD can be a CustomField object OR a CustomField ID.
+
+
+Adds VALUE as a value of CustomField FIELD.  If this is a single-value custom field,
+deletes the old value. 
+If VALUE isn't a valid value for the custom field, returns 
+(0, 'Error message' ) otherwise, returns (1, 'Success Message')
+
+=cut
+
+sub AddCustomFieldValue {
+    my $self = shift;
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+    $self->_AddCustomFieldValue(@_);
+}
+
+sub _AddCustomFieldValue {
+    my $self = shift;
+    my %args = (
+        Field => undef,
+        Value => undef,
+       RecordTransaction => 1,
+        @_
+    );
+
+    my $cf = RT::CustomField->new( $self->CurrentUser );
+    if ( UNIVERSAL::isa( $args{'Field'}, "RT::CustomField" ) ) {
+        $cf->Load( $args{'Field'}->id );
+    }
+    else {
+        $cf->Load( $args{'Field'} );
+    }
+
+    unless ( $cf->Id ) {
+        return ( 0, $self->loc("Custom field [_1] not found", $args{'Field'}) );
+    }
+
+    # Load up a TicketCustomFieldValues object for this custom field and this ticket
+    my $values = $cf->ValuesForTicket( $self->id );
+
+    unless ( $cf->ValidateValue( $args{'Value'} ) ) {
+        return ( 0, $self->loc("Invalid value for custom field") );
+    }
+
+    # If the custom field only accepts a single value, delete the existing
+    # value and record a "changed from foo to bar" transaction
+    if ( $cf->SingleValue ) {
+
+        # We need to whack any old values here.  In most cases, the custom field should
+        # only have one value to delete.  In the pathalogical case, this custom field
+        # used to be a multiple and we have many values to whack....
+        my $cf_values = $values->Count;
+
+        if ( $cf_values > 1 ) {
+            my $i = 0;   #We want to delete all but the last one, so we can then
+                 # execute the same code to "change" the value from old to new
+            while ( my $value = $values->Next ) {
+                $i++;
+                if ( $i < $cf_values ) {
+                    my $old_value = $value->Content;
+                    my ($val, $msg) = $cf->DeleteValueForTicket(Ticket => $self->Id, Content => $value->Content);
+                    unless ($val) {
+                        return (0,$msg);
+                    }
+                    my ( $TransactionId, $Msg, $TransactionObj ) =
+                      $self->_NewTransaction(
+                        Type     => 'CustomField',
+                        Field    => $cf->Id,
+                        OldValue => $old_value
+                      );
+                }
+            }
+        }
+
+        my $old_value;
+        if (my $value = $cf->ValuesForTicket( $self->Id )->First) {
+           $old_value = $value->Content();
+           return (1) if $old_value eq $args{'Value'};
+       }
+
+        my ( $new_value_id, $value_msg ) = $cf->AddValueForTicket(
+            Ticket  => $self->Id,
+            Content => $args{'Value'}
+        );
+
+        unless ($new_value_id) {
+            return ( 0,
+                $self->loc("Could not add new custom field value for ticket. [_1] ",
+                  ,$value_msg) );
+        }
+
+        my $new_value = RT::TicketCustomFieldValue->new( $self->CurrentUser );
+        $new_value->Load($new_value_id);
+
+        # now that adding the new value was successful, delete the old one
+       if ($old_value) {
+           my ($val, $msg) = $cf->DeleteValueForTicket(Ticket => $self->Id, Content => $old_value);
+           unless ($val) { 
+                       return (0,$msg);
+           }
+       }
+
+       if ($args{'RecordTransaction'}) {
+        my ( $TransactionId, $Msg, $TransactionObj ) = $self->_NewTransaction(
+            Type     => 'CustomField',
+            Field    => $cf->Id,
+            OldValue => $old_value,
+            NewValue => $new_value->Content
+        );
+       }
+
+        if ( $old_value eq '' ) {
+            return ( 1, $self->loc("[_1] [_2] added", $cf->Name, $new_value->Content) );
+        }
+        elsif ( $new_value->Content eq '' ) {
+            return ( 1, $self->loc("[_1] [_2] deleted", $cf->Name, $old_value) );
+        }
+        else {
+            return ( 1, $self->loc("[_1] [_2] changed to [_3]", $cf->Name, $old_value, $new_value->Content ) );
+        }
+
+    }
+
+    # otherwise, just add a new value and record "new value added"
+    else {
+        my ( $new_value_id ) = $cf->AddValueForTicket(
+            Ticket  => $self->Id,
+            Content => $args{'Value'}
+        );
+
+        unless ($new_value_id) {
+            return ( 0,
+                $self->loc("Could not add new custom field value for ticket. "));
+        }
+    if ( $args{'RecordTransaction'} ) {
+        my ( $TransactionId, $Msg, $TransactionObj ) = $self->_NewTransaction(
+            Type     => 'CustomField',
+            Field    => $cf->Id,
+            NewValue => $args{'Value'}
+        );
+        unless ($TransactionId) {
+            return ( 0,
+                $self->loc( "Couldn't create a transaction: [_1]", $Msg ) );
+        }
+    }
+        return ( 1, $self->loc("[_1] added as a value for [_2]",$args{'Value'}, $cf->Name));
+    }
+
+}
+
+# }}}
+
+# {{{ DeleteCustomFieldValue
+
+=item DeleteCustomFieldValue { Field => FIELD, Value => VALUE }
+
+Deletes VALUE as a value of CustomField FIELD. 
+
+VALUE can be a string, a CustomFieldValue or a TicketCustomFieldValue.
+
+If VALUE isn't a valid value for the custom field, returns 
+(0, 'Error message' ) otherwise, returns (1, 'Success Message')
+
+=cut
+
+sub DeleteCustomFieldValue {
+    my $self = shift;
+    my %args = (
+        Field => undef,
+        Value => undef,
+        @_);
+
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+    my $cf = RT::CustomField->new( $self->CurrentUser );
+    if ( UNIVERSAL::isa( $args{'Field'}, "RT::CustomField" ) ) {
+        $cf->LoadById( $args{'Field'}->id );
+    }
+    else {
+        $cf->LoadById( $args{'Field'} );
+    }
+
+    unless ( $cf->Id ) {
+        return ( 0, $self->loc("Custom field not found") );
+    }
+
+
+     my ($val, $msg) = $cf->DeleteValueForTicket(Ticket => $self->Id, Content => $args{'Value'});
+     unless ($val) { 
+            return (0,$msg);
+     }
+        my ( $TransactionId, $Msg, $TransactionObj ) = $self->_NewTransaction(
+            Type     => 'CustomField',
+            Field    => $cf->Id,
+            OldValue => $args{'Value'}
+        );
+        unless($TransactionId) {
+            return(0, $self->loc("Couldn't create a transaction: [_1]", $Msg));
+        } 
+
+        return($TransactionId, $self->loc("[_1] is no longer a value for custom field [_2]", $args{'Value'}, $cf->Name));
+}
+
+# }}}
+
+# }}}
+
+# {{{ Actions + Routines dealing with transactions
+
+# {{{ sub SetTold and _SetTold
+
+=head2 SetTold ISO  [TIMETAKEN]
+
+Updates the told and records a transaction
+
+=cut
+
+sub SetTold {
+    my $self = shift;
+    my $told;
+    $told = shift if (@_);
+    my $timetaken = shift || 0;
+
+    unless ( $self->CurrentUserHasRight('ModifyTicket') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    my $datetold = new RT::Date( $self->CurrentUser );
+    if ($told) {
+        $datetold->Set( Format => 'iso',
+                        Value  => $told );
+    }
+    else {
+        $datetold->SetToNow();
+    }
+
+    return ( $self->_Set( Field           => 'Told',
+                          Value           => $datetold->ISO,
+                          TimeTaken       => $timetaken,
+                          TransactionType => 'Told' ) );
+}
+
+=head2 _SetTold
+
+Updates the told without a transaction or acl check. Useful when we're sending replies.
+
+=cut
+
+sub _SetTold {
+    my $self = shift;
+
+    my $now = new RT::Date( $self->CurrentUser );
+    $now->SetToNow();
+
+    #use __Set to get no ACLs ;)
+    return ( $self->__Set( Field => 'Told',
+                           Value => $now->ISO ) );
+}
+
+# }}}
+
+# {{{ sub Transactions 
+
+=head2 Transactions
+
+  Returns an RT::Transactions object of all transactions on this ticket
+
+=cut
+
+sub Transactions {
+    my $self = shift;
+
+    use RT::Transactions;
+    my $transactions = RT::Transactions->new( $self->CurrentUser );
+
+    #If the user has no rights, return an empty object
+    if ( $self->CurrentUserHasRight('ShowTicket') ) {
+        my $tickets = $transactions->NewAlias('Tickets');
+        $transactions->Join(
+            ALIAS1 => 'main',
+            FIELD1 => 'Ticket',
+            ALIAS2 => $tickets,
+            FIELD2 => 'id'
+        );
+        $transactions->Limit(
+            ALIAS => $tickets,
+            FIELD => 'EffectiveId',
+            VALUE => $self->id()
+        );
+
+        # if the user may not see comments do not return them
+        unless ( $self->CurrentUserHasRight('ShowTicketComments') ) {
+            $transactions->Limit(
+                FIELD    => 'Type',
+                OPERATOR => '!=',
+                VALUE    => "Comment"
+            );
+        }
+    }
+
+    return ($transactions);
+}
+
+# }}}
+
+# {{{ sub _NewTransaction
+
+sub _NewTransaction {
+    my $self = shift;
+    my %args = (
+        TimeTaken => 0,
+        Type      => undef,
+        OldValue  => undef,
+        NewValue  => undef,
+        Data      => undef,
+        Field     => undef,
+        MIMEObj   => undef,
+        @_
+    );
+
+    require RT::Transaction;
+    my $trans = new RT::Transaction( $self->CurrentUser );
+    my ( $transaction, $msg ) = $trans->Create(
+        Ticket    => $self->Id,
+        TimeTaken => $args{'TimeTaken'},
+        Type      => $args{'Type'},
+        Data      => $args{'Data'},
+        Field     => $args{'Field'},
+        NewValue  => $args{'NewValue'},
+        OldValue  => $args{'OldValue'},
+        MIMEObj   => $args{'MIMEObj'}
+    );
+
+
+    $self->Load($self->Id);
+
+    $RT::Logger->warning($msg) unless $transaction;
+
+    $self->_SetLastUpdated;
+
+    if ( defined $args{'TimeTaken'} ) {
+        $self->_UpdateTimeTaken( $args{'TimeTaken'} );
+    }
+    return ( $transaction, $msg, $trans );
+}
+
+# }}}
+
+# }}}
+
+# {{{ PRIVATE UTILITY METHODS. Mostly needed so Ticket can be a DBIx::Record
+
+# {{{ sub _ClassAccessible
+
+sub _ClassAccessible {
+    {
+        EffectiveId       => { 'read' => 1,  'write' => 1,  'public' => 1 },
+          Queue           => { 'read' => 1,  'write' => 1 },
+          Requestors      => { 'read' => 1,  'write' => 1 },
+          Owner           => { 'read' => 1,  'write' => 1 },
+          Subject         => { 'read' => 1,  'write' => 1 },
+          InitialPriority => { 'read' => 1,  'write' => 1 },
+          FinalPriority   => { 'read' => 1,  'write' => 1 },
+          Priority        => { 'read' => 1,  'write' => 1 },
+          Status          => { 'read' => 1,  'write' => 1 },
+          TimeEstimated      => { 'read' => 1,  'write' => 1 },
+          TimeWorked      => { 'read' => 1,  'write' => 1 },
+          TimeLeft        => { 'read' => 1,  'write' => 1 },
+          Created         => { 'read' => 1,  'auto'  => 1 },
+          Creator         => { 'read' => 1,  'auto'  => 1 },
+          Told            => { 'read' => 1,  'write' => 1 },
+          Resolved        => { 'read' => 1 },
+          Type            => { 'read' => 1 },
+          Starts        => { 'read' => 1, 'write' => 1 },
+          Started       => { 'read' => 1, 'write' => 1 },
+          Due           => { 'read' => 1, 'write' => 1 },
+          Creator       => { 'read' => 1, 'auto'  => 1 },
+          Created       => { 'read' => 1, 'auto'  => 1 },
+          LastUpdatedBy => { 'read' => 1, 'auto'  => 1 },
+          LastUpdated   => { 'read' => 1, 'auto'  => 1 }
+    };
+
+}
+
+# }}}
+
+# {{{ sub _Set
+
+sub _Set {
+    my $self = shift;
+
+    my %args = ( Field             => undef,
+                 Value             => undef,
+                 TimeTaken         => 0,
+                 RecordTransaction => 1,
+                 UpdateTicket      => 1,
+                 CheckACL          => 1,
+                 TransactionType   => 'Set',
+                 @_ );
+
+    if ($args{'CheckACL'}) {
+      unless ( $self->CurrentUserHasRight('ModifyTicket')) {
+          return ( 0, $self->loc("Permission Denied"));
+      }
+   }
+
+    unless ($args{'UpdateTicket'} || $args{'RecordTransaction'}) {
+        $RT::Logger->error("Ticket->_Set called without a mandate to record an update or update the ticket");
+        return(0, $self->loc("Internal Error"));
+    }
+
+    #if the user is trying to modify the record
+
+    #Take care of the old value we really don't want to get in an ACL loop.
+    # so ask the super::_Value
+    my $Old = $self->SUPER::_Value("$args{'Field'}");
+    
+    my ($ret, $msg);
+    if ( $args{'UpdateTicket'}  ) {
+
+        #Set the new value
+        ( $ret, $msg ) = $self->SUPER::_Set( Field => $args{'Field'},
+                                                Value => $args{'Value'} );
+    
+        #If we can't actually set the field to the value, don't record
+        # a transaction. instead, get out of here.
+        if ( $ret == 0 ) { return ( 0, $msg ); }
+    }
+
+    if ( $args{'RecordTransaction'} == 1 ) {
+
+        my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction(
+                                               Type => $args{'TransactionType'},
+                                               Field     => $args{'Field'},
+                                               NewValue  => $args{'Value'},
+                                               OldValue  => $Old,
+                                               TimeTaken => $args{'TimeTaken'},
+        );
+        return ( $Trans, scalar $TransObj->Description );
+    }
+    else {
+        return ( $ret, $msg );
+    }
+}
+
+# }}}
+
+# {{{ sub _Value 
+
+=head2 _Value
+
+Takes the name of a table column.
+Returns its value as a string, if the user passes an ACL check
+
+=cut
+
+sub _Value {
+
+    my $self  = shift;
+    my $field = shift;
+
+    #if the field is public, return it.
+    if ( $self->_Accessible( $field, 'public' ) ) {
+
+        #$RT::Logger->debug("Skipping ACL check for $field\n");
+        return ( $self->SUPER::_Value($field) );
+
+    }
+
+    #If the current user doesn't have ACLs, don't let em at it.  
+
+    unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+        return (undef);
+    }
+    return ( $self->SUPER::_Value($field) );
+
+}
+
+# }}}
+
+# {{{ sub _UpdateTimeTaken
+
+=head2 _UpdateTimeTaken
+
+This routine will increment the timeworked counter. it should
+only be called from _NewTransaction 
+
+=cut
+
+sub _UpdateTimeTaken {
+    my $self    = shift;
+    my $Minutes = shift;
+    my ($Total);
+
+    $Total = $self->SUPER::_Value("TimeWorked");
+    $Total = ( $Total || 0 ) + ( $Minutes || 0 );
+    $self->SUPER::_Set(
+        Field => "TimeWorked",
+        Value => $Total
+    );
+
+    return ($Total);
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with ACCESS CONTROL
+
+# {{{ sub CurrentUserHasRight 
+
+=head2 CurrentUserHasRight
+
+  Takes the textual name of a Ticket scoped right (from RT::ACE) and returns
+1 if the user has that right. It returns 0 if the user doesn't have that right.
+
+=cut
+
+sub CurrentUserHasRight {
+    my $self  = shift;
+    my $right = shift;
+
+    return (
+        $self->HasRight(
+            Principal => $self->CurrentUser->UserObj(),
+            Right     => "$right"
+          )
+    );
+
+}
+
+# }}}
+
+# {{{ sub HasRight 
+
+=head2 HasRight
+
+ Takes a paramhash with the attributes 'Right' and 'Principal'
+  'Right' is a ticket-scoped textual right from RT::ACE 
+  'Principal' is an RT::User object
+
+  Returns 1 if the principal has the right. Returns undef if not.
+
+=cut
+
+sub HasRight {
+    my $self = shift;
+    my %args = (
+        Right     => undef,
+        Principal => undef,
+        @_
+    );
+
+    unless ( ( defined $args{'Principal'} ) and ( ref( $args{'Principal'} ) ) )
+    {
+        $RT::Logger->warning("Principal attrib undefined for Ticket::HasRight");
+    }
+
+    return (
+        $args{'Principal'}->HasRight(
+            Object => $self,
+            Right     => $args{'Right'}
+          )
+    );
+}
+
+# }}}
+
+# }}}
+
+1;
+
+=head1 AUTHOR
+
+Jesse Vincent, jesse@bestpractical.com
+
+=head1 SEE ALSO
+
+RT
+
+=cut
+
diff --git a/rt/lib/RT/Tickets_Overlay.pm b/rt/lib/RT/Tickets_Overlay.pm
new file mode 100644 (file)
index 0000000..d8a1ac8
--- /dev/null
@@ -0,0 +1,2055 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+# Major Changes:
+
+# - Decimated ProcessRestrictions and broke it into multiple
+# functions joined by a LUT
+# - Semi-Generic SQL stuff moved to another file
+
+# Known Issues: FIXME!
+
+# - ClearRestrictions and Reinitialization is messy and unclear.  The
+# only good way to do it is to create a new RT::Tickets object.
+
+=head1 NAME
+
+  RT::Tickets - A collection of Ticket objects
+
+
+=head1 SYNOPSIS
+
+  use RT::Tickets;
+  my $tickets = new RT::Tickets($CurrentUser);
+
+=head1 DESCRIPTION
+
+   A collection of RT::Tickets.
+
+=head1 METHODS
+
+=begin testing
+
+ok (require RT::Tickets);
+
+=end testing
+
+=cut
+use strict;
+no warnings qw(redefine);
+use vars qw(@SORTFIELDS);
+
+
+# Configuration Tables:
+
+# FIELDS is a mapping of searchable Field name, to Type, and other
+# metadata.
+
+my %FIELDS =
+  ( Status         => ['ENUM'],
+    Queue          => ['ENUM' => 'Queue',],
+    Type           => ['ENUM',],
+    Creator        => ['ENUM' => 'User',],
+    LastUpdatedBy   => ['ENUM' => 'User',],
+    Owner          => ['ENUM' => 'User',],
+    EffectiveId            => ['INT',],
+    id             => ['INT',],
+    InitialPriority => ['INT',],
+    FinalPriority   => ['INT',],
+    Priority       => ['INT',],
+    TimeLeft       => ['INT',],
+    TimeWorked     => ['INT',],
+    MemberOf       => ['LINK' => To => 'MemberOf', ],
+    DependsOn      => ['LINK' => To => 'DependsOn',],
+    RefersTo        => ['LINK' => To => 'RefersTo',],
+    HasMember      => ['LINK' => From => 'MemberOf',],
+    DependentOn     => ['LINK' => From => 'DependsOn',],
+    ReferredTo      => ['LINK' => From => 'RefersTo',],
+#   HasDepender            => ['LINK',],
+#   RelatedTo      => ['LINK',],
+    Told           => ['DATE' => 'Told',],
+    Starts         => ['DATE' => 'Starts',],
+    Started        => ['DATE' => 'Started',],
+    Due                    => ['DATE' => 'Due',],
+    Resolved       => ['DATE' => 'Resolved',],
+    LastUpdated            => ['DATE' => 'LastUpdated',],
+    Created        => ['DATE' => 'Created',],
+    Subject        => ['STRING',],
+    Type           => ['STRING',],
+    Content        => ['TRANSFIELD',],
+    ContentType            => ['TRANSFIELD',],
+    Filename        => ['TRANSFIELD',],
+    TransactionDate => ['TRANSDATE',],
+    Requestor       => ['WATCHERFIELD' => 'Requestor',],
+    CC              => ['WATCHERFIELD' => 'Cc',],
+    AdminCC         => ['WATCHERFIELD' => 'AdminCC',],
+    Watcher        => ['WATCHERFIELD'],
+    LinkedTo       => ['LINKFIELD',],
+    CustomFieldValue =>['CUSTOMFIELD',],
+    CF              => ['CUSTOMFIELD',],
+  );
+
+# Mapping of Field Type to Function
+my %dispatch =
+  ( ENUM           => \&_EnumLimit,
+    INT                    => \&_IntLimit,
+    LINK           => \&_LinkLimit,
+    DATE           => \&_DateLimit,
+    STRING         => \&_StringLimit,
+    TRANSFIELD     => \&_TransLimit,
+    TRANSDATE      => \&_TransDateLimit,
+    WATCHERFIELD    => \&_WatcherLimit,
+    LINKFIELD      => \&_LinkFieldLimit,
+    CUSTOMFIELD    => \&_CustomFieldLimit,
+  );
+
+# Default EntryAggregator per type
+my %DefaultEA = (
+                 INT           => 'AND',
+                 ENUM          => { '=' => 'OR',
+                                    '!='=> 'AND'
+                                  },
+                 DATE          => 'AND',
+                 STRING                => { '=' => 'OR',
+                                    '!='=> 'AND',
+                                    'LIKE'=> 'AND',
+                                    'NOT LIKE' => 'AND'
+                                  },
+                 TRANSFIELD    => 'AND',
+                 TRANSDATE     => 'AND',
+                 LINKFIELD     => 'AND',
+                 TARGET                => 'AND',
+                 BASE          => 'AND',
+                 WATCHERFIELD  => { '=' => 'OR',
+                                    '!='=> 'AND',
+                                    'LIKE'=> 'OR',
+                                    'NOT LIKE' => 'AND'
+                                  },
+
+                 CUSTOMFIELD   => 'OR',
+                );
+
+
+# Helper functions for passing the above lexically scoped tables above
+# into Tickets_Overlay_SQL.
+sub FIELDS   { return \%FIELDS   }
+sub dispatch { return \%dispatch }
+
+# Bring in the clowns.
+require RT::Tickets_Overlay_SQL;
+
+# {{{ sub SortFields
+
+@SORTFIELDS = qw(id Status
+                Queue Subject
+         Owner Created Due Starts Started
+         Told
+                Resolved LastUpdated Priority TimeWorked TimeLeft);
+
+=head2 SortFields
+
+Returns the list of fields that lists of tickets can easily be sorted by
+
+=cut
+
+sub SortFields {
+       my $self = shift;
+       return(@SORTFIELDS);
+}
+
+
+# }}}
+
+
+# BEGIN SQL STUFF *********************************
+
+=head1 Limit Helper Routines
+
+These routines are the targets of a dispatch table depending on the
+type of field.  They all share the same signature:
+
+  my ($self,$field,$op,$value,@rest) = @_;
+
+The values in @rest should be suitable for passing directly to
+DBIx::SearchBuilder::Limit.
+
+Essentially they are an expanded/broken out (and much simplified)
+version of what ProcessRestrictions used to do.  They're also much
+more clearly delineated by the TYPE of field being processed.
+
+=head2 _EnumLimit
+
+Handle Fields which are limited to certain values, and potentially
+need to be looked up from another class.
+
+This subroutine actually handles two different kinds of fields.  For
+some the user is responsible for limiting the values.  (i.e. Status,
+Type).
+
+For others, the value specified by the user will be looked by via
+specified class.
+
+Meta Data:
+  name of class to lookup in (Optional)
+
+=cut
+
+sub _EnumLimit {
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  # SQL::Statement changes != to <>.  (Can we remove this now?)
+  $op = "!=" if $op eq "<>";
+
+  die "Invalid Operation: $op for $field"
+    unless $op eq "=" or $op eq "!=";
+
+  my $meta = $FIELDS{$field};
+  if (defined $meta->[1]) {
+    my $class = "RT::" . $meta->[1];
+    my $o = $class->new($sb->CurrentUser);
+    $o->Load( $value );
+    $value = $o->Id;
+  }
+  $sb->_SQLLimit( FIELD => $field,,
+             VALUE => $value,
+             OPERATOR => $op,
+             @rest,
+           );
+}
+
+=head2 _IntLimit
+
+Handle fields where the values are limited to integers.  (For example,
+Priority, TimeWorked.)
+
+Meta Data:
+  None
+
+=cut
+
+sub _IntLimit {
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  die "Invalid Operator $op for $field"
+    unless $op =~ /^(=|!=|>|<|>=|<=)$/;
+
+  $sb->_SQLLimit(
+            FIELD => $field,
+            VALUE => $value,
+            OPERATOR => $op,
+            @rest,
+           );
+}
+
+
+=head2 _LinkLimit
+
+Handle fields which deal with links between tickets.  (MemberOf, DependsOn)
+
+Meta Data:
+  1: Direction (From,To)
+  2: Relationship Type (MemberOf, DependsOn,RefersTo)
+
+=cut
+
+sub _LinkLimit {
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  die "Op must be ="
+    unless $op eq "=";
+
+  my $meta = $FIELDS{$field};
+  die "Incorrect Meta Data for $field"
+    unless (defined $meta->[1] and defined $meta->[2]);
+
+  my $LinkAlias = $sb->NewAlias ('Links');
+
+  $sb->_OpenParen();
+
+  $sb->_SQLLimit(
+            ALIAS => $LinkAlias,
+            FIELD =>   'Type',
+            OPERATOR => '=',
+            VALUE => $meta->[2],
+            @rest,
+           );
+
+  if ($meta->[1] eq "To") {
+    my $matchfield = ( $value  =~ /^(\d+)$/ ? "LocalTarget" : "Target" );
+
+    $sb->_SQLLimit(
+              ALIAS => $LinkAlias,
+              ENTRYAGGREGATOR => 'AND',
+              FIELD =>   $matchfield,
+              OPERATOR => '=',
+              VALUE => $value ,
+             );
+
+    #If we're searching on target, join the base to ticket.id
+    $sb->Join( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'},
+              ALIAS2 => $LinkAlias,     FIELD2 => 'LocalBase');
+
+  } elsif ( $meta->[1] eq "From" ) {
+    my $matchfield = ( $value  =~ /^(\d+)$/ ? "LocalBase" : "Base" );
+
+    $sb->_SQLLimit(
+              ALIAS => $LinkAlias,
+              ENTRYAGGREGATOR => 'AND',
+              FIELD =>   $matchfield,
+              OPERATOR => '=',
+              VALUE => $value ,
+             );
+
+    #If we're searching on base, join the target to ticket.id
+    $sb->Join( ALIAS1 => 'main',     FIELD1 => $sb->{'primary_key'},
+              ALIAS2 => $LinkAlias, FIELD2 => 'LocalTarget');
+
+  } else {
+    die "Invalid link direction '$meta->[1]' for $field\n";
+  }
+
+  $sb->_CloseParen();
+
+}
+
+=head2 _DateLimit
+
+Handle date fields.  (Created, LastTold..)
+
+Meta Data:
+  1: type of relationship.  (Probably not necessary.)
+
+=cut
+
+sub _DateLimit {
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  die "Invalid Date Op: $op"
+     unless $op =~ /^(=|!=|>|<|>=|<=)$/;
+
+  my $meta = $FIELDS{$field};
+  die "Incorrect Meta Data for $field"
+    unless (defined $meta->[1]);
+
+  require Time::ParseDate;
+  use POSIX 'strftime';
+
+  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));
+
+  $sb->_SQLLimit(
+            FIELD => $meta->[1],
+            OPERATOR => $op,
+            VALUE => $value,
+            @rest,
+           );
+}
+
+=head2 _StringLimit
+
+Handle simple fields which are just strings.  (Subject,Type)
+
+Meta Data:
+  None
+
+=cut
+
+sub _StringLimit {
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  # FIXME:
+  # Valid Operators:
+  #  =, !=, LIKE, NOT LIKE
+
+  $sb->_SQLLimit(
+            FIELD => $field,
+            OPERATOR => $op,
+            VALUE => $value,
+            CASESENSITIVE => 0,
+            @rest,
+           );
+}
+
+=head2 _TransDateLimit
+
+Handle fields limiting based on Transaction Date.
+
+The inpupt value must be in a format parseable by Time::ParseDate
+
+Meta Data:
+  None
+
+=cut
+
+sub _TransDateLimit {
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  # See the comments for TransLimit, they apply here too
+
+  $sb->{_sql_transalias} = $sb->NewAlias ('Transactions')
+    unless defined $sb->{_sql_transalias};
+  $sb->{_sql_trattachalias} = $sb->NewAlias ('Attachments')
+    unless defined $sb->{_sql_trattachalias};
+
+  $sb->_OpenParen;
+
+  # Join Transactions To Attachments
+  $sb->Join( ALIAS1 => $sb->{_sql_trattachalias}, FIELD1 => 'TransactionId',
+            ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'id');
+
+  # Join Transactions to Tickets
+  $sb->Join( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'}, # UGH!
+            ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'Ticket');
+
+  my $d = new RT::Date( $sb->CurrentUser );
+  $d->Set($value);
+  $value = $d->ISO;
+
+  #Search for the right field
+  $sb->_SQLLimit(ALIAS => $sb->{_sql_trattachalias},
+                FIELD =>    'Created',
+                OPERATOR => $op,
+                VALUE =>    $value,
+                CASESENSITIVE => 0,
+                @rest
+               );
+
+  $sb->_CloseParen;
+}
+
+=head2 _TransLimit
+
+Limit based on the Content of a transaction or the ContentType.
+
+Meta Data:
+  none
+
+=cut
+
+sub _TransLimit {
+  # Content, ContentType, Filename
+
+  # If only this was this simple.  We've got to do something
+  # complicated here:
+
+            #Basically, we want to make sure that the limits apply to
+            #the same attachment, rather than just another attachment
+            #for the same ticket, no matter how many clauses we lump
+            #on. We put them in TicketAliases so that they get nuked
+            #when we redo the join.
+
+  # In the SQL, we might have
+  #       (( Content = foo ) or ( Content = bar AND Content = baz ))
+  # The AND group should share the same Alias.
+
+  # Actually, maybe it doesn't matter.  We use the same alias and it
+  # works itself out? (er.. different.)
+
+  # Steal more from _ProcessRestrictions
+
+  # FIXME: Maybe look at the previous FooLimit call, and if it was a
+  # TransLimit and EntryAggregator == AND, reuse the Aliases?
+
+  # Or better - store the aliases on a per subclause basis - since
+  # those are going to be the things we want to relate to each other,
+  # anyway.
+
+  # maybe we should not allow certain kinds of aggregation of these
+  # clauses and do a psuedo regex instead? - the problem is getting
+  # them all into the same subclause when you have (A op B op C) - the
+  # way they get parsed in the tree they're in different subclauses.
+
+  my ($sb,$field,$op,$value,@rest) = @_;
+
+  $sb->{_sql_transalias} = $sb->NewAlias ('Transactions')
+    unless defined $sb->{_sql_transalias};
+  $sb->{_sql_trattachalias} = $sb->NewAlias ('Attachments')
+    unless defined $sb->{_sql_trattachalias};
+
+  $sb->_OpenParen;
+
+  # Join Transactions To Attachments
+  $sb->Join( ALIAS1 => $sb->{_sql_trattachalias}, FIELD1 => 'TransactionId',
+            ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'id');
+
+  # Join Transactions to Tickets
+  $sb->Join( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'}, # UGH!
+            ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'Ticket');
+
+  #Search for the right field
+  $sb->_SQLLimit(ALIAS => $sb->{_sql_trattachalias},
+                FIELD =>    $field,
+                OPERATOR => $op,
+                VALUE =>    $value,
+                CASESENSITIVE => 0,
+                @rest
+               );
+
+  $sb->_CloseParen;
+
+}
+
+=head2 _WatcherLimit
+
+Handle watcher limits.  (Requestor, CC, etc..)
+
+Meta Data:
+  1: Field to query on
+
+=cut
+
+sub _WatcherLimit {
+  my ($self,$field,$op,$value,@rest) = @_;
+  my %rest = @rest;
+
+  $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');
+
+
+  #Find user watchers
+#  my $subclause = undef;
+#  my $aggregator = 'OR';
+#  if ($restriction->{'OPERATOR'} =~ /!|NOT/i ){
+#    $subclause = 'AndEmailIsNot';
+#    $aggregator = 'AND';
+#  }
+
+
+  $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,
+                  FIELD => 'Domain',
+                  VALUE => 'RT::Ticket-Role',
+                  ENTRYAGGREGATOR => 'AND');
+
+  $self->Join(ALIAS1 => $groups, FIELD1 => 'Instance',
+             ALIAS2 => 'main',   FIELD2 => 'id');
+  # }}}
+
+  # If we care about which sort of watcher
+  my $meta = $FIELDS{$field};
+  my $type = ( defined $meta->[1] ? $meta->[1] : undef );
+
+  if ( $type ) {
+    $self->_SQLLimit(ALIAS => $groups,
+                    FIELD => 'Type',
+                    VALUE => $type,
+                    ENTRYAGGREGATOR => 'AND');
+  }
+
+  $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;
+
+}
+
+sub _LinkFieldLimit {
+  my $restriction;
+  my $self;
+  my $LinkAlias;
+  my %args;
+  if ($restriction->{'TYPE'}) {
+    $self->SUPER::Limit(ALIAS => $LinkAlias,
+                       ENTRYAGGREGATOR => 'AND',
+                       FIELD =>   'Type',
+                       OPERATOR => '=',
+                       VALUE =>    $restriction->{'TYPE'} );
+  }
+
+   #If we're trying to limit it to things that are target of
+  if ($restriction->{'TARGET'}) {
+    # If the TARGET is an integer that means that we want to look at
+    # the LocalTarget field. otherwise, we want to look at the
+    # "Target" field
+    my ($matchfield);
+    if ($restriction->{'TARGET'} =~/^(\d+)$/) {
+      $matchfield = "LocalTarget";
+    } else {
+      $matchfield = "Target";
+    }
+    $self->SUPER::Limit(ALIAS => $LinkAlias,
+                       ENTRYAGGREGATOR => 'AND',
+                       FIELD =>   $matchfield,
+                       OPERATOR => '=',
+                       VALUE =>    $restriction->{'TARGET'} );
+    #If we're searching on target, join the base to ticket.id
+    $self->Join( ALIAS1 => 'main', FIELD1 => $self->{'primary_key'},
+                ALIAS2 => $LinkAlias,
+                FIELD2 => 'LocalBase');
+  }
+  #If we're trying to limit it to things that are base of
+  elsif ($restriction->{'BASE'}) {
+    # If we're trying to match a numeric link, we want to look at
+    # LocalBase, otherwise we want to look at "Base"
+    my ($matchfield);
+    if ($restriction->{'BASE'} =~/^(\d+)$/) {
+      $matchfield = "LocalBase";
+    } else {
+      $matchfield = "Base";
+    }
+
+    $self->SUPER::Limit(ALIAS => $LinkAlias,
+                       ENTRYAGGREGATOR => 'AND',
+                       FIELD => $matchfield,
+                       OPERATOR => '=',
+                       VALUE =>    $restriction->{'BASE'} );
+    #If we're searching on base, join the target to ticket.id
+    $self->Join( ALIAS1 => 'main', FIELD1 => $self->{'primary_key'},
+                ALIAS2 => $LinkAlias,
+                FIELD2 => 'LocalTarget')
+  }
+}
+
+
+=head2 KeywordLimit
+
+Limit based on Keywords
+
+Meta Data:
+  none
+
+=cut
+
+sub _CustomFieldLimit {
+  my ($self,$_field,$op,$value,@rest) = @_;
+
+  my %rest = @rest;
+  my $field = $rest{SUBKEY} || die "No field specified";
+
+  # For our sanity, we can only limit on one queue at a time
+  my $queue = undef;
+  # Ugh.    This will not do well for things with underscores in them
+
+  use RT::CustomFields;
+  my $CF = RT::CustomFields->new( $self->CurrentUser );
+  #$CF->Load( $cfid} );
+
+  my $q;
+  if ($field =~ /^(.+?)\.{(.+)}$/) {
+    my $q = RT::Queue->new($self->CurrentUser);
+    $q->Load($1);
+    $field = $2;
+    $CF->LimitToQueue( $q->Id );
+    $queue = $q->Id;
+  } else {
+    $CF->LimitToGlobal;
+  }
+  $CF->FindAllRows;
+
+  my $cfid = 0;
+
+  while ( my $CustomField = $CF->Next ) {
+    if ($CustomField->Name eq $field) {
+      $cfid = $CustomField->Id;
+      last;
+    }
+  }
+  die "No custom field named $field found\n"
+    unless $cfid;
+
+#   use RT::CustomFields;
+#   my $CF = RT::CustomField->new( $self->CurrentUser );
+#   $CF->Load( $cfid );
+
+
+  my $null_columns_ok;
+  my $TicketCFs = $self->Join( TYPE   => 'left',
+                              ALIAS1 => 'main',
+                              FIELD1 => 'id',
+                              TABLE2 => 'TicketCustomFieldValues',
+                              FIELD2 => 'Ticket' );
+
+  $self->_OpenParen;
+
+  $self->_SQLLimit( ALIAS      => $TicketCFs,
+                   FIELD      => 'Content',
+                   OPERATOR   => $op,
+                   VALUE      => $value,
+                   QUOTEVALUE => 1,
+                   @rest );
+
+  if (   $op =~ /^IS$/i
+        or ( $op eq '!=' ) ) {
+    $null_columns_ok = 1;
+  }
+
+  #If we're trying to find tickets where the keyword isn't somethng,
+  #also check ones where it _IS_ null
+
+  if ( $op eq '!=' ) {
+    $self->_SQLLimit( ALIAS           => $TicketCFs,
+                     FIELD           => 'Content',
+                     OPERATOR        => 'IS',
+                     VALUE           => 'NULL',
+                     QUOTEVALUE      => 0,
+                     ENTRYAGGREGATOR => 'OR', );
+  }
+
+  $self->_SQLLimit( LEFTJOIN => $TicketCFs,
+                   FIELD    => 'CustomField',
+                   VALUE    => $cfid,
+                   ENTRYAGGREGATOR => 'OR' );
+
+
+
+  $self->_CloseParen;
+
+}
+
+
+# End Helper Functions
+
+# End of SQL Stuff -------------------------------------------------
+
+# {{{ Limit the result set based on content
+
+# {{{ sub Limit
+
+=head2 Limit
+
+Takes a paramhash with the fields FIELD, OPERATOR, VALUE and DESCRIPTION
+Generally best called from LimitFoo methods
+
+=cut
+sub Limit {
+    my $self = shift;
+    my %args = ( FIELD => undef,
+                OPERATOR => '=',
+                VALUE => undef,
+                DESCRIPTION => undef,
+                @_
+              );
+    $args{'DESCRIPTION'} = $self->loc(
+       "[_1] [_2] [_3]", $args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}
+    ) if (!defined $args{'DESCRIPTION'}) ;
+
+    my $index = $self->_NextIndex;
+
+    #make the TicketRestrictions hash the equivalent of whatever we just passed in;
+
+    %{$self->{'TicketRestrictions'}{$index}} = %args;
+
+    $self->{'RecalcTicketLimits'} = 1;
+
+    # If we're looking at the effective id, we don't want to append the other clause
+    # which limits us to tickets where id = effective id
+    if ($args{'FIELD'} eq 'EffectiveId') {
+        $self->{'looking_at_effective_id'} = 1;
+    }
+
+    if ($args{'FIELD'} eq 'Type') {
+        $self->{'looking_at_type'} = 1;
+    }
+
+    return ($index);
+}
+
+# }}}
+
+
+
+
+=head2 FreezeLimits
+
+Returns a frozen string suitable for handing back to ThawLimits.
+
+=cut
+# {{{ sub FreezeLimits
+
+sub FreezeLimits {
+       my $self = shift;
+       require FreezeThaw;
+       return (FreezeThaw::freeze($self->{'TicketRestrictions'},
+                                  $self->{'restriction_index'}
+                                 ));
+}
+
+# }}}
+
+=head2 ThawLimits
+
+Take a frozen Limits string generated by FreezeLimits and make this tickets
+object have that set of limits.
+
+=cut
+# {{{ sub ThawLimits
+
+sub ThawLimits {
+       my $self = shift;
+       my $in = shift;
+       
+       #if we don't have $in, get outta here.
+       return undef unless ($in);
+
+       $self->{'RecalcTicketLimits'} = 1;
+
+       require FreezeThaw;
+       
+       #We don't need to die if the thaw fails.
+       
+       eval {
+               ($self->{'TicketRestrictions'},
+               $self->{'restriction_index'}
+               ) = FreezeThaw::thaw($in);
+       }
+
+}
+
+# }}}
+
+# {{{ Limit by enum or foreign key
+
+# {{{ sub LimitQueue
+
+=head2 LimitQueue
+
+LimitQueue takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of = or !=. (It defaults to =).
+VALUE is a queue id or Name.
+
+
+=cut
+
+sub LimitQueue {
+    my $self = shift;
+    my %args = (VALUE => undef,
+               OPERATOR => '=',
+               @_);
+
+    #TODO  VALUE should also take queue names and queue objects
+    #TODO FIXME why are we canonicalizing to name, not id, robrt?
+    if ($args{VALUE} =~ /^\d+$/) {
+      my $queue = new RT::Queue($self->CurrentUser);
+      $queue->Load($args{'VALUE'});
+      $args{VALUE} = $queue->Name;
+    }
+
+    # What if they pass in an Id?  Check for isNum() and convert to
+    # string.
+
+    #TODO check for a valid queue here
+
+    $self->Limit (FIELD => 'Queue',
+                 VALUE => $args{VALUE},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Queue'), $args{'OPERATOR'}, $args{VALUE},
+                 ),
+                );
+
+}
+# }}}
+
+# {{{ sub LimitStatus
+
+=head2 LimitStatus
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of = or !=.
+VALUE is a status.
+
+=cut
+
+sub LimitStatus {
+    my $self = shift;
+    my %args = ( OPERATOR => '=',
+                  @_);
+    $self->Limit (FIELD => 'Status',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Status'), $args{'OPERATOR'}, $self->loc($args{'VALUE'})
+                 ),
+                );
+}
+
+# }}}
+
+# {{{ sub IgnoreType
+
+=head2 IgnoreType
+
+If called, this search will not automatically limit the set of results found
+to tickets of type "Ticket". Tickets of other types, such as "project" and
+"approval" will be found.
+
+=cut
+
+sub IgnoreType {
+    my $self = shift;
+
+    # Instead of faking a Limit that later gets ignored, fake up the
+    # fact that we're already looking at type, so that the check in
+    # Tickets_Overlay_SQL/FromSQL goes down the right branch
+
+    #  $self->LimitType(VALUE => '__any');
+    $self->{looking_at_type} = 1;
+}
+
+# }}}
+
+# {{{ sub LimitType
+
+=head2 LimitType
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of = or !=, it defaults to "=".
+VALUE is a string to search for in the type of the ticket.
+
+
+
+=cut
+
+sub LimitType {
+    my $self = shift;
+    my %args = (OPERATOR => '=',
+               VALUE => undef,
+               @_);
+    $self->Limit (FIELD => 'Type',
+                  VALUE => $args{'VALUE'},
+                  OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Type'), $args{'OPERATOR'}, $args{'Limit'},
+                 ),
+                 );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Limit by string field
+
+# {{{ sub LimitSubject
+
+=head2 LimitSubject
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of = or !=.
+VALUE is a string to search for in the subject of the ticket.
+
+=cut
+
+sub LimitSubject {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'Subject',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Subject'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Limit based on ticket numerical attributes
+# Things that can be > < = !=
+
+# {{{ sub LimitId
+
+=head2 LimitId
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, >, < or !=.
+VALUE is a ticket Id to search for
+
+=cut
+
+sub LimitId {
+    my $self = shift;
+    my %args = (OPERATOR => '=',
+                @_);
+
+    $self->Limit (FIELD => 'id',
+                  VALUE => $args{'VALUE'},
+                  OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Id'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                 );
+}
+
+# }}}
+
+# {{{ sub LimitPriority
+
+=head2 LimitPriority
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, >, < or !=.
+VALUE is a value to match the ticket\'s priority against
+
+=cut
+
+sub LimitPriority {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'Priority',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Priority'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# {{{ sub LimitInitialPriority
+
+=head2 LimitInitialPriority
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, >, < or !=.
+VALUE is a value to match the ticket\'s initial priority against
+
+
+=cut
+
+sub LimitInitialPriority {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'InitialPriority',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Initial Priority'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# {{{ sub LimitFinalPriority
+
+=head2 LimitFinalPriority
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, >, < or !=.
+VALUE is a value to match the ticket\'s final priority against
+
+=cut
+
+sub LimitFinalPriority {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'FinalPriority',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Final Priority'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# {{{ sub LimitTimeWorked
+
+=head2 LimitTimeWorked
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, >, < or !=.
+VALUE is a value to match the ticket's TimeWorked attribute
+
+=cut
+
+sub LimitTimeWorked {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'TimeWorked',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Time worked'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# {{{ sub LimitTimeLeft
+
+=head2 LimitTimeLeft
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, >, < or !=.
+VALUE is a value to match the ticket's TimeLeft attribute
+
+=cut
+
+sub LimitTimeLeft {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'TimeLeft',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Time left'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# }}}
+
+# {{{ Limiting based on attachment attributes
+
+# {{{ sub LimitContent
+
+=head2 LimitContent
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, LIKE, NOT LIKE or !=.
+VALUE is a string to search for in the body of the ticket
+
+=cut
+sub LimitContent {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'Content',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Ticket content'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+
+# {{{ sub LimitFilename
+
+=head2 LimitFilename
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, LIKE, NOT LIKE or !=.
+VALUE is a string to search for in the body of the ticket
+
+=cut
+sub LimitFilename {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'Filename',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Attachment filename'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+# }}}
+# {{{ sub LimitContentType
+
+=head2 LimitContentType
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of =, LIKE, NOT LIKE or !=.
+VALUE is a content type to search ticket attachments for
+
+=cut
+
+sub LimitContentType {
+    my $self = shift;
+    my %args = (@_);
+    $self->Limit (FIELD => 'ContentType',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Ticket content type'), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+# }}}
+
+# }}}
+
+# {{{ Limiting based on people
+
+# {{{ sub LimitOwner
+
+=head2 LimitOwner
+
+Takes a paramhash with the fields OPERATOR and VALUE.
+OPERATOR is one of = or !=.
+VALUE is a user id.
+
+=cut
+
+sub LimitOwner {
+    my $self = shift;
+    my %args = ( OPERATOR => '=',
+                 @_);
+
+    my $owner = new RT::User($self->CurrentUser);
+    $owner->Load($args{'VALUE'});
+    # FIXME: check for a valid $owner
+    $self->Limit (FIELD => 'Owner',
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc('Owner'), $args{'OPERATOR'}, $owner->Name(),
+                 ),
+                );
+
+}
+
+# }}}
+
+# {{{ Limiting watchers
+
+# {{{ sub LimitWatcher
+
+
+=head2 LimitWatcher
+
+  Takes a paramhash with the fields OPERATOR, TYPE and VALUE.
+  OPERATOR is one of =, LIKE, NOT LIKE or !=.
+  VALUE is a value to match the ticket\'s watcher email addresses against
+  TYPE is the sort of watchers you want to match against. Leave it undef if you want to search all of them
+
+=begin testing
+
+my $t1 = RT::Ticket->new($RT::SystemUser);
+$t1->Create(Queue => 'general', Subject => "LimitWatchers test", Requestors => \['requestor1@example.com']);
+
+=end testing
+
+=cut
+
+sub LimitWatcher {
+    my $self = shift;
+    my %args = ( OPERATOR => '=',
+                VALUE => undef,
+                TYPE => undef,
+               @_);
+
+
+    #build us up a description
+    my ($watcher_type, $desc);
+    if ($args{'TYPE'}) {
+       $watcher_type = $args{'TYPE'};
+    }
+    else {
+       $watcher_type = "Watcher";
+    }
+
+    $self->Limit (FIELD => $watcher_type,
+                 VALUE => $args{'VALUE'},
+                 OPERATOR => $args{'OPERATOR'},
+                 TYPE => $args{'TYPE'},
+                 DESCRIPTION => join(
+                  ' ', $self->loc($watcher_type), $args{'OPERATOR'}, $args{'VALUE'},
+                 ),
+                );
+}
+
+
+sub LimitRequestor {
+    my $self = shift;
+    my %args = (@_);
+  my ($package, $filename, $line) = caller;
+    $RT::Logger->error("Tickets->LimitRequestor is deprecated. please rewrite call at  $package - $filename: $line");
+    $self->LimitWatcher(TYPE => 'Requestor', @_);
+
+}
+
+# }}}
+
+
+# }}}
+
+# }}}
+
+# {{{ Limiting based on links
+
+# {{{ LimitLinkedTo
+
+=head2 LimitLinkedTo
+
+LimitLinkedTo takes a paramhash with two fields: TYPE and TARGET
+TYPE limits the sort of relationship we want to search on
+
+TYPE = { RefersTo, MemberOf, DependsOn }
+
+TARGET is the id or URI of the TARGET of the link
+(TARGET used to be 'TICKET'.  'TICKET' is deprecated, but will be treated as TARGET
+
+=cut
+
+sub LimitLinkedTo {
+    my $self = shift;
+    my %args = (
+               TICKET => undef,
+               TARGET => undef,
+               TYPE => undef,
+                @_);
+
+    $self->Limit(
+                FIELD => 'LinkedTo',
+                BASE => undef,
+                TARGET => ($args{'TARGET'} || $args{'TICKET'}),
+                TYPE => $args{'TYPE'},
+                DESCRIPTION => $self->loc(
+                  "Tickets [_1] by [_2]", $self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})
+                 ),
+               );
+}
+
+
+# }}}
+
+# {{{ LimitLinkedFrom
+
+=head2 LimitLinkedFrom
+
+LimitLinkedFrom takes a paramhash with two fields: TYPE and BASE
+TYPE limits the sort of relationship we want to search on
+
+
+BASE is the id or URI of the BASE of the link
+(BASE used to be 'TICKET'.  'TICKET' is deprecated, but will be treated as BASE
+
+
+=cut
+
+sub LimitLinkedFrom {
+    my $self = shift;
+    my %args = ( BASE => undef,
+                TICKET => undef,
+                TYPE => undef,
+                @_);
+
+
+    $self->Limit( FIELD => 'LinkedTo',
+                 TARGET => undef,
+                 BASE => ($args{'BASE'} || $args{'TICKET'}),
+                 TYPE => $args{'TYPE'},
+                 DESCRIPTION => $self->loc(
+                  "Tickets [_1] [_2]", $self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})
+                 ),
+               );
+}
+
+
+# }}}
+
+# {{{ LimitMemberOf
+sub LimitMemberOf {
+    my $self = shift;
+    my $ticket_id = shift;
+    $self->LimitLinkedTo ( TARGET=> "$ticket_id",
+                          TYPE => 'MemberOf',
+                         );
+
+}
+# }}}
+
+# {{{ LimitHasMember
+sub LimitHasMember {
+    my $self = shift;
+    my $ticket_id =shift;
+    $self->LimitLinkedFrom ( BASE => "$ticket_id",
+                            TYPE => 'HasMember',
+                            );
+
+}
+# }}}
+
+# {{{ LimitDependsOn
+
+sub LimitDependsOn {
+    my $self = shift;
+    my $ticket_id = shift;
+    $self->LimitLinkedTo ( TARGET => "$ticket_id",
+                           TYPE => 'DependsOn',
+                          );
+
+}
+
+# }}}
+
+# {{{ LimitDependedOnBy
+
+sub LimitDependedOnBy {
+    my $self = shift;
+    my $ticket_id = shift;
+    $self->LimitLinkedFrom (  BASE => "$ticket_id",
+                               TYPE => 'DependentOn',
+                            );
+
+}
+
+# }}}
+
+
+# {{{ LimitRefersTo
+
+sub LimitRefersTo {
+    my $self = shift;
+    my $ticket_id = shift;
+    $self->LimitLinkedTo ( TARGET => "$ticket_id",
+                           TYPE => 'RefersTo',
+                          );
+
+}
+
+# }}}
+
+# {{{ LimitReferredToBy
+
+sub LimitReferredToBy {
+    my $self = shift;
+    my $ticket_id = shift;
+    $self->LimitLinkedFrom (  BASE=> "$ticket_id",
+                               TYPE => 'ReferredTo',
+                            );
+
+}
+
+# }}}
+
+# }}}
+
+# {{{ limit based on ticket date attribtes
+
+# {{{ sub LimitDate
+
+=head2 LimitDate (FIELD => 'DateField', OPERATOR => $oper, VALUE => $ISODate)
+
+Takes a paramhash with the fields FIELD OPERATOR and VALUE.
+
+OPERATOR is one of > or <
+VALUE is a date and time in ISO format in GMT
+FIELD is one of Starts, Started, Told, Created, Resolved, LastUpdated
+
+There are also helper functions of the form LimitFIELD that eliminate
+the need to pass in a FIELD argument.
+
+=cut
+
+sub LimitDate {
+    my $self = shift;
+    my %args = (
+                  FIELD => undef,
+                 VALUE => undef,
+                 OPERATOR => undef,
+
+                  @_);
+
+    #Set the description if we didn't get handed it above
+    unless ($args{'DESCRIPTION'} ) {
+       $args{'DESCRIPTION'} = $args{'FIELD'} . " " .$args{'OPERATOR'}. " ". $args{'VALUE'} . " GMT"
+    }
+
+    $self->Limit (%args);
+
+}
+
+# }}}
+
+
+
+
+sub LimitCreated {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'Created', @_);
+}
+sub LimitDue {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'Due', @_);
+
+}
+sub LimitStarts {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'Starts', @_);
+
+}
+sub LimitStarted {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'Started', @_);
+}
+sub LimitResolved {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'Resolved', @_);
+}
+sub LimitTold {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'Told', @_);
+}
+sub LimitLastUpdated {
+    my $self = shift;
+    $self->LimitDate( FIELD => 'LastUpdated', @_);
+}
+#
+# {{{ sub LimitTransactionDate
+
+=head2 LimitTransactionDate (OPERATOR => $oper, VALUE => $ISODate)
+
+Takes a paramhash with the fields FIELD OPERATOR and VALUE.
+
+OPERATOR is one of > or <
+VALUE is a date and time in ISO format in GMT
+
+
+=cut
+
+sub LimitTransactionDate {
+    my $self = shift;
+    my %args = (
+                  FIELD => 'TransactionDate',
+                 VALUE => undef,
+                 OPERATOR => undef,
+
+                  @_);
+
+    #  <20021217042756.GK28744@pallas.fsck.com>
+    #    "Kill It" - Jesse.
+
+    #Set the description if we didn't get handed it above
+    unless ($args{'DESCRIPTION'} ) {
+       $args{'DESCRIPTION'} = $args{'FIELD'} . " " .$args{'OPERATOR'}. " ". $args{'VALUE'} . " GMT"
+    }
+
+    $self->Limit (%args);
+
+}
+
+# }}}
+
+# }}}
+
+# {{{ Limit based on custom fields
+# {{{ sub LimitCustomField
+
+=head2 LimitCustomField
+
+Takes a paramhash of key/value pairs with the following keys:
+
+=over 4
+
+=item KEYWORDSELECT - KeywordSelect id
+
+=item OPERATOR - (for KEYWORD only - KEYWORDSELECT operator is always `=')
+
+=item KEYWORD - Keyword id
+
+=back
+
+=cut
+
+sub LimitCustomField {
+    my $self = shift;
+    my %args = ( VALUE        => undef,
+                 CUSTOMFIELD   => undef,
+                 OPERATOR      => '=',
+                 DESCRIPTION   => undef,
+                 FIELD         => 'CustomFieldValue',
+                 QUOTEVALUE    => 1,
+                 @_ );
+
+    use RT::CustomFields;
+    my $CF = RT::CustomField->new( $self->CurrentUser );
+    $CF->Load( $args{CUSTOMFIELD} );
+
+    #If we are looking to compare with a null value.
+    if ( $args{'OPERATOR'} =~ /^is$/i ) {
+      $args{'DESCRIPTION'} ||= $self->loc("Custom field [_1] has no value.", $CF->Name);
+    }
+    elsif ( $args{'OPERATOR'} =~ /^is not$/i ) {
+      $args{'DESCRIPTION'} ||= $self->loc("Custom field [_1] has a value.", $CF->Name);
+    }
+
+    # if we're not looking to compare with a null value
+    else {
+        $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 );
+      $qo->load( $CF->Queue );
+      $q = $qo->Name;
+    }
+
+    $self->Limit( VALUE => $args{VALUE},
+                 FIELD => "CF.".( $q
+                            ? $q . ".{" . $CF->Name . "}"
+                            : $CF->Name
+                          ),
+                 OPERATOR => $args{OPERATOR},
+                 CUSTOMFIELD => 1,
+               );
+
+
+    $self->{'RecalcTicketLimits'} = 1;
+  #  return ($index);
+}
+
+# }}}
+# }}}
+
+
+# {{{ sub _NextIndex
+
+=head2 _NextIndex
+
+Keep track of the counter for the array of restrictions
+
+=cut
+
+sub _NextIndex {
+    my $self = shift;
+    return ($self->{'restriction_index'}++);
+}
+# }}}
+
+# }}}
+
+# {{{ Core bits to make this a DBIx::SearchBuilder object
+
+# {{{ sub _Init
+sub _Init  {
+    my $self = shift;
+    $self->{'table'} = "Tickets";
+    $self->{'RecalcTicketLimits'} = 1;
+    $self->{'looking_at_effective_id'} = 0;
+    $self->{'looking_at_type'} = 0;
+    $self->{'restriction_index'} =1;
+    $self->{'primary_key'} = "id";
+    delete $self->{'items_array'};
+    delete $self->{'item_map'};
+    $self->SUPER::_Init(@_);
+
+    $self->_InitSQL;
+
+}
+# }}}
+
+# {{{ sub Count
+sub Count {
+  my $self = shift;
+  $self->_ProcessRestrictions() if ($self->{'RecalcTicketLimits'} == 1 );
+  return($self->SUPER::Count());
+}
+# }}}
+
+# {{{ sub CountAll
+sub CountAll {
+  my $self = shift;
+  $self->_ProcessRestrictions() if ($self->{'RecalcTicketLimits'} == 1 );
+  return($self->SUPER::CountAll());
+}
+# }}}
+
+
+# {{{ sub ItemsArrayRef
+
+=head2 ItemsArrayRef
+
+Returns a reference to the set of all items found in this search
+
+=cut
+
+sub ItemsArrayRef {
+    my $self = shift;
+    my @items;
+
+    unless ( $self->{'items_array'} ) {
+
+        my $placeholder = $self->_ItemsCounter;
+        $self->GotoFirstItem();
+        while ( my $item = $self->Next ) {
+            push ( @{ $self->{'items_array'} }, $item );
+        }
+        $self->GotoItem($placeholder);
+    }
+    return ( $self->{'items_array'} );
+}
+# }}}
+
+# {{{ sub Next
+sub Next {
+       my $self = shift;
+       
+       $self->_ProcessRestrictions() if ($self->{'RecalcTicketLimits'} == 1 );
+
+       my $Ticket = $self->SUPER::Next();
+       if ((defined($Ticket)) and (ref($Ticket))) {
+
+           #Make sure we _never_ show deleted tickets
+           #TODO we should be doing this in the where clause.
+           #but you can't do multiple clauses on the same field just yet :/
+
+           if ($Ticket->__Value('Status') eq 'deleted') {
+               return($self->Next());
+           }
+            # Since Ticket could be granted with more rights instead
+            # of being revoked, it's ok if queue rights allow
+            # ShowTicket.  It seems need another query, but we have
+            # rights cache in Principal::HasRight.
+           elsif ($Ticket->QueueObj->CurrentUserHasRight('ShowTicket') ||
+                   $Ticket->CurrentUserHasRight('ShowTicket')) {
+               return($Ticket);
+           }
+
+           #If the user doesn't have the right to show this ticket
+           else {      
+               return($self->Next());
+           }
+       }
+       #if there never was any ticket
+       else {
+               return(undef);
+       }       
+
+}
+# }}}
+
+# }}}
+
+# {{{ Deal with storing and restoring restrictions
+
+# {{{ sub LoadRestrictions
+
+=head2 LoadRestrictions
+
+LoadRestrictions takes a string which can fully populate the TicketRestrictons hash.
+TODO It is not yet implemented
+
+=cut
+
+# }}}
+
+# {{{ sub DescribeRestrictions
+
+=head2 DescribeRestrictions
+
+takes nothing.
+Returns a hash keyed by restriction id.
+Each element of the hash is currently a one element hash that contains DESCRIPTION which
+is a description of the purpose of that TicketRestriction
+
+=cut
+
+sub DescribeRestrictions  {
+    my $self = shift;
+
+    my ($row, %listing);
+
+    foreach $row (keys %{$self->{'TicketRestrictions'}}) {
+       $listing{$row} = $self->{'TicketRestrictions'}{$row}{'DESCRIPTION'};
+    }
+    return (%listing);
+}
+# }}}
+
+# {{{ sub RestrictionValues
+
+=head2 RestrictionValues FIELD
+
+Takes a restriction field and returns a list of values this field is restricted
+to.
+
+=cut
+
+sub RestrictionValues {
+    my $self = shift;
+    my $field = shift;
+    map $self->{'TicketRestrictions'}{$_}{'VALUE'},
+      grep {
+             $self->{'TicketRestrictions'}{$_}{'FIELD'} eq $field
+             && $self->{'TicketRestrictions'}{$_}{'OPERATOR'} eq "="
+           }
+        keys %{$self->{'TicketRestrictions'}};
+}
+
+# }}}
+
+# {{{ sub ClearRestrictions
+
+=head2 ClearRestrictions
+
+Removes all restrictions irretrievably
+
+=cut
+
+sub ClearRestrictions {
+    my $self = shift;
+    delete $self->{'TicketRestrictions'};
+    $self->{'looking_at_effective_id'} = 0;
+    $self->{'looking_at_type'} = 0;
+    $self->{'RecalcTicketLimits'} =1;
+}
+
+# }}}
+
+# {{{ sub DeleteRestriction
+
+=head2 DeleteRestriction
+
+Takes the row Id of a restriction (From DescribeRestrictions' output, for example.
+Removes that restriction from the session's limits.
+
+=cut
+
+
+sub DeleteRestriction {
+    my $self = shift;
+    my $row = shift;
+    delete $self->{'TicketRestrictions'}{$row};
+
+    $self->{'RecalcTicketLimits'} = 1;
+    #make the underlying easysearch object forget all its preconceptions
+}
+
+# }}}
+
+# {{{ sub _RestrictionsToClauses
+
+# Convert a set of oldstyle SB Restrictions to Clauses for RQL
+
+sub _RestrictionsToClauses {
+  my $self = shift;
+
+  my $row;
+  my %clause;
+  foreach $row (keys %{$self->{'TicketRestrictions'}}) {
+    my $restriction = $self->{'TicketRestrictions'}{$row};
+    #use Data::Dumper;
+    #print Dumper($restriction),"\n";
+
+      # We need to reimplement the subclause aggregation that SearchBuilder does.
+      # Default Subclause is ALIAS.FIELD, and default ALIAS is 'main',
+      # Then SB AND's the different Subclauses together.
+
+      # So, we want to group things into Subclauses, convert them to
+      # SQL, and then join them with the appropriate DefaultEA.
+      # Then join each subclause group with AND.
+
+    my $field = $restriction->{'FIELD'};
+    my $realfield = $field;    # CustomFields fake up a fieldname, so
+                                # we need to figure that out
+
+    # One special case
+    # Rewrite LinkedTo meta field to the real field
+    if ($field =~ /LinkedTo/) {
+      $realfield = $field = $restriction->{'TYPE'};
+    }
+
+    # Two special case
+    # CustomFields have a different real field
+    if ($field =~ /^CF\./) {
+      $realfield = "CF"
+    }
+
+    die "I don't know about $field yet"
+      unless (exists $FIELDS{$realfield} or $restriction->{CUSTOMFIELD});
+
+    my $type = $FIELDS{$realfield}->[0];
+    my $op   = $restriction->{'OPERATOR'};
+
+    my $value = ( grep { defined }
+                 map { $restriction->{$_} } qw(VALUE TICKET BASE TARGET))[0];
+
+    # this performs the moral equivalent of defined or/dor/C<//>,
+    # without the short circuiting.You need to use a 'defined or'
+    # type thing instead of just checking for truth values, because
+    # VALUE could be 0.(i.e. "false")
+
+    # You could also use this, but I find it less aesthetic:
+    # (although it does short circuit)
+    #( defined $restriction->{'VALUE'}? $restriction->{VALUE} :
+    # defined $restriction->{'TICKET'} ?
+    # $restriction->{TICKET} :
+    # defined $restriction->{'BASE'} ?
+    # $restriction->{BASE} :
+    # defined $restriction->{'TARGET'} ?
+    # $restriction->{TARGET} )
+
+    my $ea = $DefaultEA{$type};
+    if ( ref $ea ) {
+      die "Invalid operator $op for $field ($type)"
+       unless exists $ea->{$op};
+      $ea = $ea->{$op};
+    }
+    exists $clause{$realfield} or $clause{$realfield} = [];
+    # Escape Quotes
+    $field =~ s!(['"])!\\$1!g;
+    $value =~ s!(['"])!\\$1!g;
+    my $data = [ $ea, $type, $field, $op, $value ];
+
+    # here is where we store extra data, say if it's a keyword or
+    # something.  (I.e. "TYPE SPECIFIC STUFF")
+
+    #print Dumper($data);
+    push @{$clause{$realfield}}, $data;
+  }
+  return \%clause;
+}
+
+# }}}
+
+# {{{ sub _ProcessRestrictions
+
+=head2 _ProcessRestrictions PARAMHASH
+
+# The new _ProcessRestrictions is somewhat dependent on the SQL stuff,
+# but isn't quite generic enough to move into Tickets_Overlay_SQL.
+
+=cut
+
+sub _ProcessRestrictions {
+    my $self = shift;
+    
+    #Blow away ticket aliases since we'll need to regenerate them for
+    #a new search
+    delete $self->{'TicketAliases'};
+    delete $self->{'items_array'};                                                                                                                   
+    my $sql = $self->{_sql_query}; # Violating the _SQL namespace
+    if (!$sql||$self->{'RecalcTicketLimits'}) {
+      #  "Restrictions to Clauses Branch\n";
+      my $clauseRef = eval { $self->_RestrictionsToClauses; };
+      if ($@) {
+       $RT::Logger->error( "RestrictionsToClauses: " . $@ );
+       $self->FromSQL("");
+      } else {
+       $sql = $self->ClausesToSQL($clauseRef);
+       $self->FromSQL($sql);
+      }
+    }
+
+
+    $self->{'RecalcTicketLimits'} = 0;
+
+}
+
+=head2 _BuildItemMap
+
+    # Build up a map of first/last/next/prev items, so that we can display search nav quickly
+
+=cut
+
+sub _BuildItemMap {
+    my $self = shift;
+
+    my $items = $self->ItemsArrayRef;
+    my $prev = 0 ;
+
+    delete $self->{'item_map'};
+    if ($items->[0]) {
+    $self->{'item_map'}->{'first'} = $items->[0]->Id;
+    while (my $item = shift @$items ) {
+        my $id = $item->Id;
+        $self->{'item_map'}->{$id}->{'defined'} = 1;
+        $self->{'item_map'}->{$id}->{prev}  = $prev;
+        $self->{'item_map'}->{$id}->{next}  = $items->[0]->Id if ($items->[0]);
+        $prev = $id;
+    }
+    $self->{'item_map'}->{'last'} = $prev;
+    }
+} 
+
+
+=head2 ItemMap
+
+Returns an a map of all items found by this search. The map is of the form
+
+$ItemMap->{'first'} = first ticketid found
+$ItemMap->{'last'} = last ticketid found
+$ItemMap->{$id}->{prev} = the tikcet id found before $id
+$ItemMap->{$id}->{next} = the tikcet id found after $id
+
+=cut
+
+sub ItemMap {
+    my $self = shift;
+    $self->_BuildItemMap() unless ($self->{'item_map'});
+    return ($self->{'item_map'});
+}
+
+
+
+
+=cut
+
+}
+
+
+
+# }}}
+
+# }}}
+
+=head2 PrepForSerialization
+
+You don't want to serialize a big tickets object, as the {items} hash will be instantly invalid _and_ eat lots of space
+
+=cut
+
+
+sub PrepForSerialization {
+    my $self = shift;
+    delete $self->{'items'};
+    $self->RedoSearch();
+}
+
+1;
+
diff --git a/rt/lib/RT/Tickets_Overlay_SQL.pm b/rt/lib/RT/Tickets_Overlay_SQL.pm
new file mode 100644 (file)
index 0000000..d78a56d
--- /dev/null
@@ -0,0 +1,382 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 warnings;
+
+# Import configuration data from the lexcial scope of __PACKAGE__ (or
+# at least where those two Subroutines are defined.)
+
+my %FIELDS = %{FIELDS()};
+my %dispatch = %{dispatch()};
+
+sub _InitSQL {
+  my $self = shift;
+
+  # How many of these do we actually still use?
+
+  # Private Member Variales (which should get cleaned)
+  $self->{'_sql_linksc'}        = 0;
+  $self->{'_sql_watchersc'}     = 0;
+  $self->{'_sql_keywordsc'}     = 0;
+  $self->{'_sql_subclause'}     = "a";
+  $self->{'_sql_first'}         = 0;
+  $self->{'_sql_opstack'}       = [''];
+  $self->{'_sql_transalias'}    = undef;
+  $self->{'_sql_trattachalias'} = undef;
+  $self->{'_sql_keywordalias'}  = undef;
+  $self->{'_sql_depth'}         = 0;
+  $self->{'_sql_localdepth'}    = 0;
+  $self->{'_sql_query'}         = '';
+  $self->{'_sql_looking_at'}    = {};
+
+}
+
+sub _SQLLimit {
+  # All SQL stuff goes into one SB subclause so we can deal with all
+  # the aggregation
+  my $this = shift;
+  $this->SUPER::Limit(@_,
+                      SUBCLAUSE => 'ticketsql');
+}
+
+# Helpers
+sub _OpenParen {
+  $_[0]->SUPER::_OpenParen( 'ticketsql' );
+}
+sub _CloseParen {
+  $_[0]->SUPER::_CloseParen( 'ticketsql' );
+}
+
+=head1 SQL Functions
+
+=cut
+
+sub _match {
+  # Case insensitive equality
+  my ($y,$x) = @_;
+  return 1 if $x =~ /^$y$/i;
+  #  return 1 if ((lc $x) eq (lc $y)); # Why isnt this equiv?
+  return 0;
+}
+
+=head2 Robert's Simple SQL Parser
+
+Documentation In Progress
+
+The Parser/Tokenizer is a relatively simple state machine that scans through a SQL WHERE clause type string extracting a token at a time (where a token is:
+
+  VALUE -> quoted string or number
+  AGGREGator -> AND or OR
+  KEYWORD -> quoted string or single word
+  OPerator -> =,!=,LIKE,etc..
+  PARENthesis -> open or close.
+
+And that stream of tokens is passed through the "machine" in order to build up a structure that looks like:
+
+       KEY OP VALUE
+  AND  KEY OP VALUE
+  OR   KEY OP VALUE
+
+That also deals with parenthesis for nesting.  (The parentheses are
+just handed off the SearchBuilder)
+
+=cut
+
+use Regexp::Common qw /delimited/;
+
+# States
+use constant VALUE => 1;
+use constant AGGREG => 2;
+use constant OP => 4;
+use constant PAREN => 8;
+use constant KEYWORD => 16;
+my @tokens = qw[VALUE AGGREG OP PAREN KEYWORD];
+
+my $re_aggreg = qr[(?i:AND|OR)];
+my $re_value  = qr[$RE{delimited}{-delim=>qq{\'\"}}|\d+];
+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 _parser {
+  my ($self,$string) = @_;
+  my $want = KEYWORD | PAREN;
+  my $last = undef;
+
+  my $depth = 0;
+
+  my ($ea,$key,$op,$value) = ("","","","");
+
+  while ($string =~ /(
+                      $re_aggreg
+                      |$re_keyword
+                      |$re_value
+                      |$re_op
+                      |$re_paren
+                     )/igx ) {
+    my $val = $1;
+    my $current = 0;
+
+    # Highest priority is last
+    $current = OP      if _match($re_op,$val);
+    $current = VALUE   if _match($re_value,$val);
+    $current = KEYWORD if _match($re_keyword,$val) && ($want & KEYWORD);
+    $current = AGGREG  if _match($re_aggreg,$val);
+    $current = PAREN   if _match($re_paren,$val);
+
+    unless ($current && $want & $current) {
+      # Error
+      # FIXME: I will only print out the highest $want value
+      die "Error near ->$val<- expecting a ", $tokens[((log $want)/(log 2))], " in $string\n";
+    }
+
+    # State Machine:
+
+    # Parens are highest priority
+    if ($current & PAREN) {
+      if ($val eq "(") {
+        $depth++;
+        $self->_OpenParen;
+
+      } else {
+        $depth--;
+        $self->_CloseParen;
+      }
+
+      $want = KEYWORD | PAREN | AGGREG;
+    }
+    elsif ( $current & AGGREG ) {
+      $ea = $val;
+      $want = KEYWORD | PAREN;
+    }
+    elsif ( $current & KEYWORD ) {
+      $key = $val;
+      $want = OP;
+    }
+    elsif ( $current & OP ) {
+      $op = $val;
+      $want = VALUE;
+    }
+    elsif ( $current & VALUE ) {
+      $value = $val;
+
+      # Remove surrounding quotes from $key, $val
+      # (in future, simplify as for($key,$val) { action on $_ })
+      if ($key =~ /$RE{delimited}{-delim=>qq{\'\"}}/) {
+        substr($key,0,1) = "";
+        substr($key,-1,1) = "";
+      }
+      if ($val =~ /$RE{delimited}{-delim=>qq{\'\"}}/) {
+        substr($val,0,1) = "";
+        substr($val,-1,1) = "";
+      }
+      # Unescape escaped characters                                            
+      $key =~ s!\\(.)!$1!g;                                                    
+      $val =~ s!\\(.)!$1!g;     
+      #    print "$ea Key=[$key] op=[$op]  val=[$val]\n";
+
+
+   my $subkey;
+   if ($key =~ /^(.+?)\.(.+)$/) {
+     $key = $1;
+     $subkey = $2;
+   }
+
+      my $class;
+      my ($stdkey) = grep { /^$key$/i } (keys %FIELDS);
+      if ($stdkey && exists $FIELDS{$stdkey}) {
+        $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.
+
+   die "Unknown field: $key" unless $class;
+
+      $self->{_sql_localdepth} = 0;
+      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,
+            );
+
+      $self->{_sql_looking_at}{lc $key} = 1;
+
+      ($ea,$key,$op,$value) = ("","","","");
+
+      $want = PAREN | AGGREG;
+    } else {
+      die "I'm lost";
+    }
+
+    $last = $current;
+  } # while
+
+  die "Incomplete query"
+    unless (($want | PAREN) || ($want | KEYWORD));
+
+  die "Incomplete Query"
+    unless ($last && ($last | PAREN) || ($last || VALUE));
+
+  # This will never happen, because the parser will complain
+  die "Mismatched parentheses"
+    unless $depth == 0;
+
+}
+
+
+=head2 ClausesToSQL
+
+=cut
+
+sub ClausesToSQL {
+  my $self = shift;
+  my $clauses = shift;
+  my @sql;
+
+  for my $f (keys %{$clauses}) {
+    my $sql;
+    my $first = 1;
+
+    # Build SQL from the data hash
+     for my $data ( @{ $clauses->{$f} } ) {
+      $sql .= $data->[0] unless $first; $first=0;
+      $sql .= " '". $data->[2] . "' ";
+      $sql .= $data->[3] . " ";
+      $sql .= "'". $data->[4] . "' ";
+    }
+
+    push @sql, " ( " . $sql . " ) ";
+  }
+
+  return join("AND",@sql);
+}
+
+=head2 FromSQL
+
+Convert a RT-SQL string into a set of SearchBuilder restrictions.
+
+Returns (1, 'Status message') on success and (0, 'Error Message') on
+failure.
+
+=cut
+
+sub FromSQL {
+  my ($self,$query) = @_;
+
+  $self->CleanSlate;
+  $self->_InitSQL();
+  return (1,"No Query") unless $query;
+
+  $self->{_sql_query} = $query;
+  eval { $self->_parser( $query ); };
+  $RT::Logger->error( $@ ) if $@;
+  return(0,$@) if $@;
+
+  # We only want to look at EffectiveId's (mostly) for these searches.
+  unless (exists $self->{_sql_looking_at}{'effectiveid'}) {
+  $self->SUPER::Limit( FIELD           => 'EffectiveId',
+                     ENTRYAGGREGATOR => 'AND',
+                     OPERATOR        => '=',
+                     QUOTEVALUE      => 0,
+                     VALUE           => 'main.id'
+    );    #TODO, we shouldn't be hard #coding the tablename to main.
+    }
+  # FIXME: Need to bring this logic back in
+
+  #      if ($self->_isLimited && (! $self->{'looking_at_effective_id'})) {
+  #         $self->SUPER::Limit( FIELD => 'EffectiveId',
+  #               OPERATOR => '=',
+  #               QUOTEVALUE => 0,
+  #               VALUE => 'main.id');   #TODO, we shouldn't be hard coding the tablename to main.
+  #       }
+  # --- This is hardcoded above.  This comment block can probably go.
+  # Or, we need to reimplement the looking_at_effective_id toggle.
+
+  # Unless we've explicitly asked to look at a specific Type, we need
+  # to limit to it.
+  unless ($self->{looking_at_type}) {
+    $self->SUPER::Limit( FIELD => 'Type',
+                         OPERATOR => '=',
+                         VALUE => 'ticket');
+  }
+
+  # set SB's dirty flag
+  $self->{'must_redo_search'} = 1;
+  $self->{'RecalcTicketLimits'} = 0;                                           
+
+  return (1,"Good Query");
+
+}
+
+
+1;
+
+=pod
+
+=head2 Exceptions
+
+Most of the RT code does not use Exceptions (die/eval) but it is used
+in the TicketSQL code for simplicity and historical reasons.  Lest you
+be worried that the dies will trigger user visible errors, all are
+trapped via evals.
+
+99% of the dies fall in subroutines called via FromSQL and then parse.
+(This includes all of the _FooLimit routines in Tickets_Overlay.pm.)
+The other 1% or so are via _ProcessRestrictions.
+
+All dies are trapped by eval {}s, and will be logged at the 'error'
+log level.  The general failure mode is to not display any tickets.
+
+=head2 General Flow
+
+Legacy Layer:
+
+   Legacy LimitFoo routines build up a RestrictionsHash
+
+   _ProcessRestrictions converts the Restrictions to Clauses
+   ([key,op,val,rest]).
+
+   Clauses are converted to RT-SQL (TicketSQL)
+
+New RT-SQL Layer:
+
+   FromSQL calls the parser
+
+   The parser calls the _FooLimit routines to do DBIx::SearchBuilder
+   limits.
+
+And then the normal SearchBuilder/Ticket routines are used for
+display/navigation.
+
+=cut
+
diff --git a/rt/lib/RT/Transaction_Overlay.pm b/rt/lib/RT/Transaction_Overlay.pm
new file mode 100644 (file)
index 0000000..54bb326
--- /dev/null
@@ -0,0 +1,817 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Transaction - RT\'s transaction object
+
+=head1 SYNOPSIS
+
+  use RT::Transaction;
+
+
+=head1 DESCRIPTION
+
+
+Each RT::Transaction describes an atomic change to a ticket object 
+or an update to an RT::Ticket object.
+It can have arbitrary MIME attachments.
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::Transaction);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use RT::Attachments;
+
+# {{{ sub Create 
+
+=head2 Create
+
+Create a new transaction.
+
+This routine should _never_ be called anything other Than RT::Ticket. It should not be called 
+from client code. Ever. Not ever.  If you do this, we will hunt you down. and break your kneecaps.
+Then the unpleasant stuff will start.
+
+TODO: Document what gets passed to this
+
+=cut
+
+sub Create {
+    my $self = shift;
+    my %args = (
+        id             => undef,
+        TimeTaken      => 0,
+        Ticket         => 0,
+        Type           => 'undefined',
+        Data           => '',
+        Field          => undef,
+        OldValue       => undef,
+        NewValue       => undef,
+        MIMEObj        => undef,
+        ActivateScrips => 1,
+        @_
+    );
+
+    #if we didn't specify a ticket, we need to bail
+    unless ( $args{'Ticket'} ) {
+        return ( 0, $self->loc( "Transaction->Create couldn't, as you didn't specify a ticket id"));
+    }
+
+
+
+    #lets create our transaction
+    my %params = (Ticket    => $args{'Ticket'},
+        Type      => $args{'Type'},
+        Data      => $args{'Data'},
+        Field     => $args{'Field'},
+        OldValue  => $args{'OldValue'},
+        NewValue  => $args{'NewValue'},
+        Created   => $args{'Created'}
+    );
+
+    # Parameters passed in during an import that we probably don't want to touch, otherwise
+    foreach my $attr qw(id Creator Created LastUpdated TimeTaken LastUpdatedBy) {
+        $params{$attr} = $args{$attr} if ($args{$attr});
+    }
+    my $id = $self->SUPER::Create(%params);
+    $self->Load($id);
+    $self->_Attach( $args{'MIMEObj'} )
+      if defined $args{'MIMEObj'};
+
+    #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'
+        );
+
+        #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") );
+}
+
+# }}}
+
+# {{{ sub Delete
+
+sub Delete {
+    my $self = shift;
+    return ( 0,
+        $self->loc('Deleting this object could break referential integrity') );
+}
+
+# }}}
+
+# {{{ Routines dealing with Attachments
+
+# {{{ sub Message 
+
+=head2 Message
+
+  Returns the RT::Attachments Object which contains the "top-level"object
+  attachment for this transaction
+
+=cut
+
+sub Message {
+
+    my $self = shift;
+    
+    if ( !defined( $self->{'message'} ) ) {
+
+        $self->{'message'} = new RT::Attachments( $self->CurrentUser );
+        $self->{'message'}->Limit(
+            FIELD => 'TransactionId',
+            VALUE => $self->Id
+        );
+
+        $self->{'message'}->ChildrenOf(0);
+    }
+    return ( $self->{'message'} );
+}
+
+# }}}
+
+# {{{ sub Content
+
+=head2 Content PARAMHASH
+
+If this transaction has attached mime objects, returns the first text/plain part.
+Otherwise, returns undef.
+
+Takes a paramhash.  If the $args{'Quote'} parameter is set, wraps this message 
+at $args{'Wrap'}.  $args{'Wrap'} defaults to 70.
+
+
+=cut
+
+sub Content {
+    my $self = shift;
+    my %args = (
+        Quote => 0,
+        Wrap  => 70,
+        @_
+    );
+
+    my $content;
+    my $content_obj = $self->ContentObj;
+    if ($content_obj) {
+        $content = $content_obj->Content;
+    }
+
+    # If all else fails, return a message that we couldn't find any content
+    else {
+        $content = $self->loc('This transaction appears to have no content');
+    }
+
+    if ( $args{'Quote'} ) {
+
+        # Remove quoted signature.
+        $content =~ s/\n-- \n(.*)$//s;
+
+        # What's the longest line like?
+        my $max = 0;
+        foreach ( split ( /\n/, $content ) ) {
+            $max = length if ( length > $max );
+        }
+
+        if ( $max > 76 ) {
+            require Text::Wrapper;
+            my $wrapper = new Text::Wrapper(
+                columns    => $args{'Wrap'},
+                body_start => ( $max > 70 * 3 ? '   ' : '' ),
+                par_start  => ''
+            );
+            $content = $wrapper->wrap($content);
+        }
+
+        $content = '['
+          . $self->CreatorObj->Name() . ' - '
+          . $self->CreatedAsString() . "]:\n\n" . $content . "\n\n";
+        $content =~ s/^/> /gm;
+
+    }
+
+    return ($content);
+}
+
+# }}}
+
+# {{{ ContentObj
+
+=head2 ContentObj 
+
+Returns the RT::Attachment object which contains the content for this Transaction
+
+=cut
+
+
+
+sub ContentObj {
+
+    my $self = shift;
+
+    # If we don\'t have any content, return undef now.
+    unless ( $self->Attachments->First ) {
+        return (undef);
+    }
+
+    # Get the set of toplevel attachments to this transaction.
+    my $Attachment = $self->Attachments->First();
+
+    # If it's a message or a plain part, just return the
+    # body.
+    if ( $Attachment->ContentType() =~ '^(text/plain$|message/)' ) {
+        return ($Attachment);
+    }
+
+    # If it's a multipart object, first try returning the first
+    # text/plain part.
+
+    elsif ( $Attachment->ContentType() =~ '^multipart/' ) {
+        my $plain_parts = $Attachment->Children();
+        $plain_parts->ContentType( VALUE => 'text/plain' );
+
+        # If we actully found a part, return its content
+        if ( $plain_parts->First && $plain_parts->First->Content ne '' ) {
+            return ( $plain_parts->First );
+        }
+
+        # If that fails, return the  first text/plain or message/ part
+        # which has some content.
+
+        else {
+            my $all_parts = $Attachment->Children();
+            while ( my $part = $all_parts->Next ) {
+                if (( $part->ContentType() =~ '^(text/plain$|message/)' ) &&  $part->Content()  ) {
+                    return ($part);
+                }
+            }
+        }
+
+    }
+
+    # We found no content. suck
+    return (undef);
+}
+
+# }}}
+
+# {{{ sub Subject
+
+=head2 Subject
+
+If this transaction has attached mime objects, returns the first one's subject
+Otherwise, returns null
+  
+=cut
+
+sub Subject {
+    my $self = shift;
+    if ( $self->Attachments->First ) {
+        return ( $self->Attachments->First->Subject );
+    }
+    else {
+        return (undef);
+    }
+}
+
+# }}}
+
+# {{{ sub Attachments 
+
+=head2 Attachments
+
+  Returns all the RT::Attachment objects which are attached
+to this transaction. Takes an optional parameter, which is
+a ContentType that Attachments should be restricted to.
+
+=cut
+
+sub Attachments {
+    my $self = shift;
+
+    unless ( $self->{'attachments'} ) {
+        $self->{'attachments'} = RT::Attachments->new( $self->CurrentUser );
+
+        #If it's a comment, return an empty object if they don't have the right to see it
+        if ( $self->Type eq 'Comment' ) {
+            unless ( $self->CurrentUserHasRight('ShowTicketComments') ) {
+                return ( $self->{'attachments'} );
+            }
+        }
+
+        #if they ain't got rights to see, return an empty object
+        else {
+            unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+                return ( $self->{'attachments'} );
+            }
+        }
+
+        $self->{'attachments'}->Limit( FIELD => 'TransactionId',
+                                       VALUE => $self->Id );
+
+        # Get the self->{'attachments'} in the order they're put into
+        # the database.  Arguably, we should be returning a tree
+        # of self->{'attachments'}, not a set...but no current app seems to need
+        # it.
+
+        $self->{'attachments'}->OrderBy( ALIAS => 'main',
+                                         FIELD => 'id',
+                                         ORDER => 'asc' );
+
+    }
+    return ( $self->{'attachments'} );
+
+}
+
+# }}}
+
+# {{{ sub _Attach 
+
+=head2 _Attach
+
+A private method used to attach a mime object to this transaction.
+
+=cut
+
+sub _Attach {
+    my $self       = shift;
+    my $MIMEObject = shift;
+
+    if ( !defined($MIMEObject) ) {
+        $RT::Logger->error(
+"$self _Attach: We can't attach a mime object if you don't give us one.\n"
+        );
+        return ( 0, $self->loc("[_1]: no attachment specified", $self) );
+    }
+
+    my $Attachment = new RT::Attachment( $self->CurrentUser );
+    $Attachment->Create(
+        TransactionId => $self->Id,
+        Attachment    => $MIMEObject
+    );
+    return ( $Attachment, $self->loc("Attachment created") );
+
+}
+
+# }}}
+
+# }}}
+
+# {{{ Routines dealing with Transaction Attributes
+
+# {{{ sub Description 
+
+=head2 Description
+
+Returns a text string which describes this transaction
+
+=cut
+
+sub Description {
+    my $self = shift;
+
+    #Check those ACLs
+    #If it's a comment, we need to be extra special careful
+    if ( $self->__Value('Type') eq 'Comment' ) {
+        unless ( $self->CurrentUserHasRight('ShowTicketComments') ) {
+            return ( $self->loc("Permission Denied") );
+        }
+    }
+
+    #if they ain't got rights to see, don't let em
+    else {
+        unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+            return ($self->loc("Permission Denied") );
+        }
+    }
+
+    if ( !defined( $self->Type ) ) {
+        return ( $self->loc("No transaction type specified"));
+    }
+
+    return ( $self->loc("[_1] by [_2]",$self->BriefDescription , $self->CreatorObj->Name ));
+}
+
+# }}}
+
+# {{{ sub BriefDescription 
+
+=head2 BriefDescription
+
+Returns a text string which briefly describes this transaction
+
+=cut
+
+sub BriefDescription {
+    my $self = shift;
+
+
+    #Check those ACLs
+    #If it's a comment, we need to be extra special careful
+    if ( $self->__Value('Type') eq 'Comment' ) {
+        unless ( $self->CurrentUserHasRight('ShowTicketComments') ) {
+            return ( $self->loc("Permission Denied") );
+        }
+    }
+
+    #if they ain't got rights to see, don't let em
+    else {
+        unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+            return ( $self->loc("Permission Denied") );
+        }
+    }
+
+    my $type = $self->Type; #cache this, rather than calling it 30 times
+
+    if ( !defined( $type ) ) {
+        return $self->loc("No transaction type specified");
+    }
+
+    if ( $type eq 'Create' ) {
+        return ($self->loc("Ticket created"));
+    }
+    elsif ( $type =~ /Status/ ) {
+        if ( $self->Field eq 'Status' ) {
+            if ( $self->NewValue eq 'deleted' ) {
+                return ($self->loc("Ticket deleted"));
+            }
+            else {
+                return ( $self->loc("Status changed from [_1] to [_2]", $self->loc($self->OldValue), $self->loc($self->NewValue) ));
+
+            }
+        }
+
+        # Generic:
+       my $no_value = $self->loc("(no value)"); 
+        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");
+    }
+
+    elsif ( $type eq 'CustomField' ) {
+
+        my $field = $self->loc('CustomField');
+
+        if ( $self->Field ) {
+            my $cf = RT::CustomField->new( $self->CurrentUser );
+            $cf->Load( $self->Field );
+            $field = $cf->Name();
+        }
+
+        if ( $self->OldValue eq '' ) {
+            return ( $self->loc("[_1] [_2] added", $field, $self->NewValue) );
+        }
+        elsif ( $self->NewValue eq '' ) {
+            return ( $self->loc("[_1] [_2] deleted", $field, $self->OldValue) );
+
+        }
+        else {
+            return $self->loc("[_1] [_2] changed to [_3]", $field, $self->OldValue, $self->NewValue );
+        }
+    }
+
+    elsif ( $type eq 'Untake' ) {
+        return $self->loc("Untaken");
+    }
+
+    elsif ( $type eq "Take" ) {
+        return $self->loc("Taken");
+    }
+
+    elsif ( $type eq "Force" ) {
+        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" ) {
+        my $Old = RT::User->new( $self->CurrentUser );
+        $Old->Load( $self->OldValue );
+        return $self->loc("Stolen from [_1] ",  $Old->Name);
+    }
+
+    elsif ( $type eq "Give" ) {
+        my $New = RT::User->new( $self->CurrentUser );
+        $New->Load( $self->NewValue );
+        return $self->loc( "Given to [_1]",  $New->Name );
+    }
+
+    elsif ( $type eq 'AddWatcher' ) {
+        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' ) {
+        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' ) {
+        return $self->loc( "Subject changed to [_1]", $self->Data );
+    }
+
+    elsif ( $type eq 'AddLink' ) {
+        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->Field eq 'Queue' ) {
+            my $q1 = new RT::Queue( $self->CurrentUser );
+            $q1->Load( $self->OldValue );
+            my $q2 = new RT::Queue( $self->CurrentUser );
+            $q2->Load( $self->NewValue );
+            return $self->loc("[_1] changed from [_2] to [_3]", $self->Field , $q1->Name , $q2->Name);
+        }
+
+        # 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 );
+    }
+        else {
+            return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, $self->OldValue, $self->NewValue );
+        }
+    }
+    elsif ( $type eq 'PurgeTransaction' ) {
+        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 );
+
+    }
+}
+
+# }}}
+
+# {{{ Utility methods
+
+# {{{ sub IsInbound
+
+=head2 IsInbound
+
+Returns true if the creator of the transaction is a requestor of the ticket.
+Returns false otherwise
+
+=cut
+
+sub IsInbound {
+    my $self = shift;
+    return ( $self->TicketObj->IsRequestor( $self->CreatorObj->PrincipalId ) );
+}
+
+# }}}
+
+# }}}
+
+sub _ClassAccessible {
+    {
+
+        id => { read => 1, type => 'int(11)', default => '' },
+          EffectiveTicket =>
+          { read => 1, write => 1, type => 'int(11)', default => '' },
+          Ticket =>
+          { read => 1, public => 1, type => 'int(11)', default => '' },
+          TimeTaken => { read => 1, type => 'int(11)',      default => '' },
+          Type      => { read => 1, type => 'varchar(20)',  default => '' },
+          Field     => { read => 1, type => 'varchar(40)',  default => '' },
+          OldValue  => { read => 1, type => 'varchar(255)', default => '' },
+          NewValue  => { read => 1, type => 'varchar(255)', default => '' },
+          Data      => { read => 1, type => 'varchar(100)', default => '' },
+          Creator => { read => 1, auto => 1, type => 'int(11)', default => '' },
+          Created =>
+          { read => 1, auto => 1, type => 'datetime', default => '' },
+
+    }
+};
+
+# }}}
+
+# }}}
+
+# {{{ sub _Set
+
+sub _Set {
+    my $self = shift;
+    return ( 0, $self->loc('Transactions are immutable') );
+}
+
+# }}}
+
+# {{{ sub _Value 
+
+=head2 _Value
+
+Takes the name of a table column.
+Returns its value as a string, if the user passes an ACL check
+
+=cut
+
+sub _Value {
+
+    my $self  = shift;
+    my $field = shift;
+
+    #if the field is public, return it.
+    if ( $self->_Accessible( $field, 'public' ) ) {
+        return ( $self->__Value($field) );
+
+    }
+
+    #If it's a comment, we need to be extra special careful
+    if ( $self->__Value('Type') eq 'Comment' ) {
+        unless ( $self->CurrentUserHasRight('ShowTicketComments') ) {
+            return (undef);
+        }
+    }
+
+    #if they ain't got rights to see, don't let em
+    else {
+        unless ( $self->CurrentUserHasRight('ShowTicket') ) {
+            return (undef);
+        }
+    }
+
+    return ( $self->__Value($field) );
+
+}
+
+# }}}
+
+# {{{ sub CurrentUserHasRight
+
+=head2 CurrentUserHasRight RIGHT
+
+Calls $self->CurrentUser->HasQueueRight for the right passed in here.
+passed in here.
+
+=cut
+
+sub CurrentUserHasRight {
+    my $self  = shift;
+    my $right = shift;
+    return (
+        $self->CurrentUser->HasRight(
+            Right     => "$right",
+            Object => $self->TicketObj
+          )
+    );
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/RT/Transactions_Overlay.pm b/rt/lib/RT/Transactions_Overlay.pm
new file mode 100644 (file)
index 0000000..3a7d4c1
--- /dev/null
@@ -0,0 +1,86 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Transactions - a collection of RT Transaction objects
+
+=head1 SYNOPSIS
+
+  use RT::Transactions;
+
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok (require RT::Transactions);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub _Init  
+sub _Init   {
+  my $self = shift;
+  
+  $self->{'table'} = "Transactions";
+  $self->{'primary_key'} = "id";
+  
+  # By default, order by the date of the transaction, rather than ID.
+  $self->OrderBy( ALIAS => 'main',
+                 FIELD => 'Created',
+                 ORDER => 'ASC');
+
+  return ( $self->SUPER::_Init(@_));
+}
+# }}}
+
+=head2 example methods
+
+  Queue RT::Queue or Queue Id
+  Ticket RT::Ticket or Ticket Id
+
+
+LimitDate 
+  
+Type TRANSTYPE
+Field STRING
+OldValue OLDVAL
+NewValue NEWVAL
+Data DATA
+TimeTaken
+Actor USEROBJ/USERID
+ContentMatches STRING
+
+=cut
+
+
+1;
+
diff --git a/rt/lib/RT/URI.pm b/rt/lib/RT/URI.pm
new file mode 100644 (file)
index 0000000..7acc1dc
--- /dev/null
@@ -0,0 +1,244 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::URI;;
+
+use strict;
+use vars qw/@ISA/;
+@ISA = qw(RT::Base);
+
+use RT::URI::base;
+use Carp;
+
+=head1 NAME
+
+RT::URI
+
+=head1 DESCRIPTION
+
+This class provides a base class for URIs, such as those handled
+by RT::Link objects.  
+
+=head1 API
+
+
+
+=cut
+
+
+
+
+=head2 new
+
+Create a new RT::URI object.
+
+=cut
+
+                         
+sub new {
+    my $proto = shift;
+    my $class = ref($proto) || $proto;
+    my $self  = {};
+    bless( $self, $class );
+
+    $self->CurrentUser(@_);
+
+    return ($self);
+}
+
+
+
+# {{{ FromObject
+
+=head2 FromObject <Object>
+
+Given a local object, such as an RT::Ticket or an RT::FM::Article, this routine will return a URI for
+the local object
+
+=cut
+
+sub FromObject {
+    my $self = shift;
+    my $obj = shift;
+
+    return undef unless  $obj->can('URI');
+    return $self->FromURI($obj->URI);
+}
+
+# }}}
+
+# {{{ FromURI
+
+=head2 FromURI <URI>
+
+Returns a local object id for this content.  You are expected to know what sort of object this is the Id 
+of 
+
+=cut
+
+sub FromURI {
+    my $self = shift;
+    my $uri = shift;    
+
+    return undef unless ($uri);
+
+       my $scheme;
+       # Special case: integers passed in as URIs must be ticket ids
+       if ($uri =~ /^(\d+)$/) {
+               $scheme = "fsck.com-rt";
+       } elsif ($uri =~ /^((?:\w|\.|-)+?):/) {
+         $scheme = $1;
+    }
+    else {
+        $RT::Logger->warning("$self Could not determine a URI scheme for $uri");
+               return (undef);
+    }
+     
+    # load up a resolver object for this scheme  
+    $self->_GetResolver($scheme);
+    
+    unless ($self->Resolver->ParseURI($uri)) {
+        $RT::Logger->warning("Resolver ".ref($self->Resolver)." could not parse $uri");
+       return (undef);
+    }
+
+}
+
+# }}}
+
+# {{{ _GetResolver
+
+=private _GetResolver <scheme>
+
+Gets an RT URI resolver for the scheme <scheme>. 
+Falls back to a null resolver. RT::URI::base.
+
+=cut
+
+sub _GetResolver {
+    my $self = shift;
+    my $scheme = shift;
+
+    $scheme =~ s/(\.|-)/_/g;
+    my $resolver;
+
+    
+       eval " 
+            require RT::URI::$scheme;
+            \$resolver = RT::URI::$scheme->new(\$self->CurrentUser);
+       ";
+     
+        if ($resolver) {
+        $self->{'resolver'} = $resolver;
+        } else {
+        $self->{'resolver'} = RT::URI::base->new($self->CurrentUser); 
+        }
+
+}
+
+# }}}
+
+# {{{ Scheme
+
+=head2 Scheme
+
+Returns a local object id for this content.  You are expected to know what sort of object this is the Id 
+of 
+
+=cut
+
+sub Scheme {
+    my $self = shift;
+    return ($self->Resolver->Scheme);
+
+}
+# }}}
+# {{{ URI
+
+=head2 URI
+
+Returns a local object id for this content.  You are expected to know what sort of object this is the Id 
+of 
+
+=cut
+
+sub URI {
+    my $self = shift;
+    return ($self->Resolver->URI);
+
+}
+# }}}
+
+# {{{ Object
+
+=head2 Object
+
+Returns a local object for this content. This will usually be an RT::Ticket or somesuch
+
+=cut
+
+
+sub Object {   
+    my $self = shift;
+    return($self->Resolver->Object);
+
+}
+
+
+# }}}
+
+# {{{ IsLocal
+
+=head2 IsLocal
+
+Returns a local object for this content. This will usually be an RT::Ticket or somesuch
+
+=cut
+
+sub IsLocal {
+    my $self = shift;
+    return $self->Resolver->IsLocal;     
+}
+
+
+# }}}
+
+
+=head Resolver
+
+Returns this URI's URI resolver object
+
+=cut
+
+
+sub Resolver {
+    my $self =shift;
+    return ($self->{'resolver'});
+}
+
+eval "require RT::URI_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI_Vendor.pm});
+eval "require RT::URI_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI_Local.pm});
+
+1;
diff --git a/rt/lib/RT/URI/base.pm b/rt/lib/RT/URI/base.pm
new file mode 100644 (file)
index 0000000..a599f3a
--- /dev/null
@@ -0,0 +1,129 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::URI::base;
+
+use strict;
+use base qw(RT::Base);
+
+=head1 NAME
+
+RT::URI::base
+
+=head1 DESCRIPTION
+
+A baseclass (and fallback) RT::URI handler. Every URI handler needs to 
+handle the API presented here
+
+=cut
+
+
+=head1 API
+
+=head2 new
+
+Create a new URI handler
+
+=cut
+
+sub new {
+    my $proto = shift;
+    my $class = ref($proto) || $proto;
+    my $self  = {};
+    bless( $self, $class );
+    $self->CurrentUser(@_);
+    return ($self);
+}
+
+sub ParseObject  {
+    my $self = shift;
+    my $obj = shift;
+    $self->{'uri'} = "unknown-object:".ref($obj);
+
+
+}
+
+
+
+sub ParseURI { 
+    my $self = shift;
+    my $uri = shift;
+
+    if ($uri =~  /^(.*?):/) { 
+        $self->{'scheme'} = $1;
+    }
+    $self->{'uri'} = $uri;
+   
+    
+}
+
+
+sub Object {
+    my $self = shift;
+    return undef;
+
+}
+
+sub URI {
+    my $self = shift;
+    return($self->{'uri'});
+}
+
+sub Scheme { 
+    my $self = shift;
+    return($self->{'scheme'});
+
+}
+
+sub HREF {
+    my $self = shift;
+    return($self->{'href'} || $self->{'uri'});
+}
+
+sub IsLocal {
+    my $self = shift;
+    return undef;
+}
+
+=head2 AsString
+
+Return a "pretty" string representing the URI object.
+
+This is meant to be used like this:
+
+ % $re = $uri->Resolver;
+ <A HREF="<% $re->HREF %>"><% $re->AsString %></A>
+
+=cut
+
+sub AsString {
+    my $self = shift;
+    return $self->URI;
+}
+
+eval "require RT::URI::base_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/base_Vendor.pm});
+eval "require RT::URI::base_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/base_Local.pm});
+
+1;
diff --git a/rt/lib/RT/URI/fsck_com_rt.pm b/rt/lib/RT/URI/fsck_com_rt.pm
new file mode 100644 (file)
index 0000000..36e8f82
--- /dev/null
@@ -0,0 +1,247 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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::URI::fsck_com_rt;
+
+use RT::Ticket;
+
+use RT::URI::base;
+
+use strict;
+use vars qw(@ISA);
+@ISA = qw/RT::URI::base/;
+
+
+
+
+=head2 LocalURIPrefix 
+
+Returns the prefix for a local ticket URI
+
+=begin testing
+
+use_ok("RT::URI::fsck_com_rt");
+my $uri = RT::URI::fsck_com_rt->new($RT::SystemUser);
+
+ok(ref($uri));
+
+use Data::Dumper;
+
+
+ok (UNIVERSAL::isa($uri,RT::URI::fsck_com_rt), "It's an RT::URI::fsck_com_rt");
+
+ok ($uri->isa('RT::URI::base'), "It's an RT::URI::base");
+ok ($uri->isa('RT::Base'), "It's an RT::Base");
+
+is ($uri->LocalURIPrefix , 'fsck.com-rt://example.com/ticket/');
+
+=end testing
+
+
+
+=cut
+
+sub LocalURIPrefix {
+    my $self = shift;
+    my $prefix = $self->Scheme. "://$RT::Organization/ticket/";
+    return ($prefix);
+}
+
+
+
+
+
+=head2 URIForObject RT::Ticket
+
+Returns the RT URI for a local RT::Ticket object
+
+=begin testing
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+$ticket->Load(1);
+my $uri = RT::URI::fsck_com_rt->new($ticket->CurrentUser);
+is($uri->LocalURIPrefix . "1" , $uri->URIForObject($ticket));
+
+=end testing
+
+=cut
+
+sub URIForObject {
+
+    my $self = shift;
+
+    my $obj = shift;
+    return ($self->LocalURIPrefix. $obj->Id);
+}
+
+
+=head2 ParseObject $TicketObj
+
+When handed an RT::Ticekt object, figure out its URI
+
+
+=cut
+
+
+
+=head2 ParseURI URI
+
+When handed an fsck.com-rt: URI, figures out things like whether its a local ticket
+and what its ID is
+
+=cut
+
+
+sub ParseURI { 
+    my $self = shift;
+    my $uri = shift;
+
+       my $ticket;
+       if ($uri =~ /^(\d+)$/) {
+               $ticket = RT::Ticket->new($self->CurrentUser);
+               $ticket->Load($uri);    
+               $self->{'uri'} = $ticket->URI;
+       }
+       else {
+           $self->{'uri'} = $uri;
+       }
+       #If it's a local URI, load the ticket object and return its URI
+    if ( $self->IsLocal) {
+   
+        my $local_uri_prefix = $self->LocalURIPrefix;
+       if ($self->{'uri'} =~ /^$local_uri_prefix(\d+)$/) {
+               my $id = $1;
+       
+    
+               $ticket = RT::Ticket->new( $self->CurrentUser );
+           $ticket->Load($id);
+
+           #If we couldn't find a ticket, return undef.
+           unless ( defined $ticket->Id ) {
+               return undef;
+           }
+           } else {
+           return undef;
+           }   
+    }
+       $self->{'object'} = $ticket;
+    if ( UNIVERSAL::can( $ticket, 'Id' ) ) {
+        return ( $ticket->Id );
+    }
+    else {
+        return undef;
+    }
+}
+
+=head2 IsLocal 
+
+Returns true if this URI is for a local ticket.
+Returns undef otherwise.
+
+
+
+=cut
+
+sub IsLocal {
+       my $self = shift;
+        my $local_uri_prefix = $self->LocalURIPrefix;
+       if ($self->{'uri'} =~ /^$local_uri_prefix/) {
+               return 1;
+    }
+       else {
+               return undef;
+       }
+}
+
+
+
+=head2 Object
+
+Returns the object for this URI, if it's local. Otherwise returns undef.
+
+=cut
+
+sub Object {
+    my $self = shift;
+    return ($self->{'object'});
+
+}
+
+=head2 Scheme
+
+Return the URI scheme for RT tickets
+
+=cut
+
+
+sub Scheme {
+    my $self = shift;
+       return "fsck.com-rt";
+}
+
+=head2 HREF
+
+If this is a local ticket, return an HTTP url to it.
+Otherwise, return its URI
+
+=cut
+
+
+sub HREF {
+    my $self = shift;
+    if ($self->IsLocal) {
+        return ( $RT::WebURL . "Ticket/Display.html?id=".$self->Object->Id);
+    }   
+    else {
+        return ($self->URI);
+    }
+}
+
+=head2 AsString
+
+Returns either a localized string 'ticket #23' or the full URI if the object is not local
+
+=cut
+
+sub AsString {
+    my $self = shift;
+    if ($self->IsLocal) {
+       return $self->loc("ticket #[_1]", $self->Object->Id);
+
+    }
+    else {
+       return $self->Object->URI;
+    }
+}
+
+eval "require RT::URI::fsck_com_rt_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/fsck_com_rt_Vendor.pm});
+eval "require RT::URI::fsck_com_rt_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/fsck_com_rt_Local.pm});
+
+1;
diff --git a/rt/lib/RT/User_Overlay.pm b/rt/lib/RT/User_Overlay.pm
new file mode 100644 (file)
index 0000000..e828ebd
--- /dev/null
@@ -0,0 +1,1589 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::User - RT User object
+
+=head1 SYNOPSIS
+
+  use RT::User;
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::User);
+
+=end testing
+
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+use vars qw(%_USERS_KEY_CACHE);
+
+%_USERS_KEY_CACHE = ();
+
+use Digest::MD5;
+use RT::Principals;
+use RT::ACE;
+
+
+# {{{ sub _Accessible 
+
+
+sub _ClassAccessible {
+    {
+     
+        id =>
+                {read => 1, type => 'int(11)', default => ''},
+        Name => 
+                {read => 1, write => 1, public => 1, admin => 1, type => 'varchar(120)', default => ''},
+        Password => 
+                { write => 1, type => 'varchar(40)', default => ''},
+        Comments => 
+                {read => 1, write => 1, admin => 1, type => 'blob', default => ''},
+        Signature => 
+                {read => 1, write => 1, type => 'blob', default => ''},
+        EmailAddress => 
+                {read => 1, write => 1, public => 1,  type => 'varchar(120)', default => ''},
+        FreeformContactInfo => 
+                {read => 1, write => 1, type => 'blob', default => ''},
+        Organization => 
+                {read => 1, write => 1, public => 1, admin => 1, type => 'varchar(200)', default => ''},
+        RealName => 
+                {read => 1, write => 1, public => 1, type => 'varchar(120)', default => ''},
+        NickName => 
+                {read => 1, write => 1, public => 1, type => 'varchar(16)', default => ''},
+        Lang => 
+                {read => 1, write => 1, public => 1, type => 'varchar(16)', default => ''},
+        EmailEncoding => 
+                {read => 1, write => 1, public => 1, type => 'varchar(16)', default => ''},
+        WebEncoding => 
+                {read => 1, write => 1, public => 1, type => 'varchar(16)', default => ''},
+        ExternalContactInfoId => 
+                {read => 1, write => 1, public => 1, admin => 1, type => 'varchar(100)', default => ''},
+        ContactInfoSystem => 
+                {read => 1, write => 1, public => 1, admin => 1, type => 'varchar(30)', default => ''},
+        ExternalAuthId => 
+                {read => 1, write => 1, public => 1, admin => 1, type => 'varchar(100)', default => ''},
+        AuthSystem => 
+                {read => 1, write => 1, public => 1, admin => 1,type => 'varchar(30)', default => ''},
+        Gecos => 
+                {read => 1, write => 1, public => 1, admin => 1, type => 'varchar(16)', default => ''},
+
+        PGPKey => {
+                {read => 1, write => 1, public => 1, admin => 1, type => 'text', default => ''},
+        },
+        HomePhone => 
+                {read => 1, write => 1, type => 'varchar(30)', default => ''},
+        WorkPhone => 
+                {read => 1, write => 1, type => 'varchar(30)', default => ''},
+        MobilePhone => 
+                {read => 1, write => 1, type => 'varchar(30)', default => ''},
+        PagerPhone => 
+                {read => 1, write => 1, type => 'varchar(30)', default => ''},
+        Address1 => 
+                {read => 1, write => 1, type => 'varchar(200)', default => ''},
+        Address2 => 
+                {read => 1, write => 1, type => 'varchar(200)', default => ''},
+        City => 
+                {read => 1, write => 1, type => 'varchar(100)', default => ''},
+        State => 
+                {read => 1, write => 1, type => 'varchar(100)', default => ''},
+        Zip => 
+                {read => 1, write => 1, type => 'varchar(16)', default => ''},
+        Country => 
+                {read => 1, write => 1, type => 'varchar(50)', default => ''},
+        Creator => 
+                {read => 1, auto => 1, type => 'int(11)', default => ''},
+        Created => 
+                {read => 1, auto => 1, type => 'datetime', default => ''},
+        LastUpdatedBy => 
+                {read => 1, auto => 1, type => 'int(11)', default => ''},
+        LastUpdated => 
+                {read => 1, auto => 1, type => 'datetime', default => ''},
+
+ }
+};
+
+
+# }}}
+
+# {{{ sub Create 
+
+=head2 Create { PARAMHASH }
+
+
+=begin testing
+
+# Make sure we can create a user
+
+my $u1 = RT::User->new($RT::SystemUser);
+is(ref($u1), 'RT::User');
+my ($id, $msg) = $u1->Create(Name => 'CreateTest1', EmailAddress => 'create-test-1@example.com');
+ok ($id, "Creating user CreateTest1 - " . $msg );
+
+# Make sure we can't create a second user with the same name
+my $u2 = RT::User->new($RT::SystemUser);
+($id, $msg) = $u2->Create(Name => 'CreateTest1', EmailAddress => 'create-test-2@example.com');
+ok (!$id, $msg);
+
+
+# Make sure we can't create a second user with the same EmailAddress address
+my $u3 = RT::User->new($RT::SystemUser);
+($id, $msg) = $u3->Create(Name => 'CreateTest2', EmailAddress => 'create-test-1@example.com');
+ok (!$id, $msg);
+
+# Make sure we can create a user with no EmailAddress address
+my $u4 = RT::User->new($RT::SystemUser);
+($id, $msg) = $u4->Create(Name => 'CreateTest3');
+ok ($id, $msg);
+
+# make sure we can create a second user with no EmailAddress address
+my $u5 = RT::User->new($RT::SystemUser);
+($id, $msg) = $u5->Create(Name => 'CreateTest4');
+ok ($id, $msg);
+
+# make sure we can create a user with a blank EmailAddress address
+my $u6 = RT::User->new($RT::SystemUser);
+($id, $msg) = $u6->Create(Name => 'CreateTest6', EmailAddress => '');
+ok ($id, $msg);
+# make sure we can create a second user with a blankEmailAddress address
+my $u7 = RT::User->new($RT::SystemUser);
+($id, $msg) = $u7->Create(Name => 'CreateTest7', EmailAddress => '');
+ok ($id, $msg);
+
+# Can we change the email address away from from "";
+($id,$msg) = $u7->SetEmailAddress('foo@bar');
+ok ($id, $msg);
+# can we change the address back to "";  
+($id,$msg) = $u7->SetEmailAddress('');
+ok ($id, $msg);
+is ($u7->EmailAddress, '');
+
+
+=end testing
+
+=cut
+
+
+sub Create {
+    my $self = shift;
+    my %args = (
+        Privileged => 0,
+        Disabled => 0,
+        EmailAddress => '',
+        @_    # 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') );
+    }
+
+
+    # Privileged is no longer a column in users
+    my $privileged = $args{'Privileged'};
+    delete $args{'Privileged'};
+
+
+    if ($args{'CryptedPassword'} ) {
+        $args{'Password'} = $args{'CryptedPassword'};
+        delete $args{'CryptedPassword'};
+    }
+    elsif ( !$args{'Password'} ) {
+        $args{'Password'} = '*NO-PASSWORD*';
+    }
+    elsif ( length( $args{'Password'} ) < $RT::MinimumPasswordLength ) {
+        return ( 0, $self->loc("Password too short") );
+    }
+
+    else {
+        $args{'Password'} = $self->_GeneratePassword($args{'Password'});
+    }
+
+    #TODO Specify some sensible defaults.
+
+    unless ( defined( $args{'Name'} ) ) {
+        return ( 0, $self->loc("Must specify 'Name' attribute") );
+    }
+
+    #SANITY CHECK THE NAME AND ABORT IF IT'S TAKEN
+    if ($RT::SystemUser) {   #This only works if RT::SystemUser has been defined
+        my $TempUser = RT::User->new($RT::SystemUser);
+        $TempUser->Load( $args{'Name'} );
+        return ( 0, $self->loc('Name in use') ) if ( $TempUser->Id );
+
+        return ( 0, $self->loc('Email address in use') )
+          unless ( $self->ValidateEmailAddress( $args{'EmailAddress'} ) );
+    }
+    else {
+        $RT::Logger->warning( "$self couldn't check for pre-existing users");
+    }
+
+
+    $RT::Handle->BeginTransaction();
+    # Groups deal with principal ids, rather than user ids.
+    # When creating this user, set up a principal Id for it.
+    my $principal = RT::Principal->new($self->CurrentUser);
+    my $principal_id = $principal->Create(PrincipalType => 'User',
+                                Disabled => $args{'Disabled'},
+                                ObjectId => '0');
+    $principal->__Set(Field => 'ObjectId', Value => $principal_id);
+    # If we couldn't create a principal Id, get the fuck out.
+    unless ($principal_id) {
+        $RT::Handle->Rollback();
+        $RT::Logger->crit("Couldn't create a Principal on new user create. Strange things are afoot at the circle K");
+        return ( 0, $self->loc('Could not create user') );
+    }
+
+    delete $args{'Disabled'};
+
+    $self->SUPER::Create(id => $principal_id , %args);
+    my $id = $self->Id;
+
+    #If the create failed.
+    unless ($id) {
+        $RT::Logger->error("Could not create a new user - " .join('-'. %args));
+
+        return ( 0, $self->loc('Could not create user') );
+    }
+
+
+    #TODO post 2.0
+    #if ($args{'SendWelcomeMessage'}) {
+    #  #TODO: Check if the email exists and looks valid
+    #  #TODO: Send the user a "welcome message" 
+    #}
+
+
+
+    my $aclstash = RT::Group->new($self->CurrentUser);
+    my $stash_id = $aclstash->_CreateACLEquivalenceGroup($principal);
+
+    unless ($stash_id) {
+        $RT::Handle->Rollback();
+        $RT::Logger->crit("Couldn't stash the user in groumembers");
+        return ( 0, $self->loc('Could not create user') );
+    }
+
+    $RT::Handle->Commit;
+
+    #$RT::Logger->debug("Adding the user as a member of everyone"); 
+    my $everyone = RT::Group->new($self->CurrentUser);
+    $everyone->LoadSystemInternalGroup('Everyone');
+    $everyone->AddMember($self->PrincipalId);
+
+    if ($privileged)  {
+        my $priv = RT::Group->new($self->CurrentUser);
+        #$RT::Logger->debug("Making ".$self->Id." a privileged user");
+        $priv->LoadSystemInternalGroup('Privileged');
+        $priv->AddMember($self->PrincipalId);  
+    } else {
+        my $unpriv = RT::Group->new($self->CurrentUser);
+        #$RT::Logger->debug("Making ".$self->Id." an unprivileged user");
+        $unpriv->LoadSystemInternalGroup('Unprivileged');
+        $unpriv->AddMember($self->PrincipalId);  
+    }
+
+
+   #  $RT::Logger->debug("Finished creating the user");
+    return ( $id, $self->loc('User created') );
+}
+
+# }}}
+
+
+
+# {{{ SetPrivileged
+
+=head2 SetPrivileged BOOL
+
+If passed a true value, makes this user a member of the "Privileged"  PseudoGroup.
+Otherwise, makes this user a member of the "Unprivileged" pseudogroup. 
+
+Returns a standard RT tuple of (val, msg);
+
+=begin testing
+
+
+ok(my $user = RT::User->new($RT::SystemUser));
+ok($user->Load('root'), "Loaded user 'root'");
+ok($user->Privileged, "User 'root' is privileged");
+ok(my ($v,$m) = $user->SetPrivileged(0));
+ok ($v ==1, "Set unprivileged suceeded ($m)");
+ok(!$user->Privileged, "User 'root' is no longer privileged");
+ok(my ($v2,$m2) = $user->SetPrivileged(1));
+ok ($v2 ==1, "Set privileged suceeded ($m2");
+ok($user->Privileged, "User 'root' is privileged again");
+
+=end testing
+
+=cut
+
+sub SetPrivileged {
+    my $self = shift;
+    my $val = shift;
+
+    my $priv = RT::Group->new($self->CurrentUser);
+    $priv->LoadSystemInternalGroup('Privileged');
+   
+    unless ($priv->Id) {
+        $RT::Logger->crit("Could not find Privileged pseudogroup");
+        return(0,$self->loc("Failed to find 'Privileged' users pseudogroup."));
+    }
+
+    my $unpriv = RT::Group->new($self->CurrentUser);
+    $unpriv->LoadSystemInternalGroup('Unprivileged');
+    unless ($unpriv->Id) {
+        $RT::Logger->crit("Could not find unprivileged pseudogroup");
+        return(0,$self->loc("Failed to find 'Unprivileged' users pseudogroup"));
+    }
+
+    if ($val) {
+        if ($priv->HasMember($self->PrincipalObj)) {
+            #$RT::Logger->debug("That user is already privileged");
+            return (0,$self->loc("That user is already privileged"));
+        }
+        if ($unpriv->HasMember($self->PrincipalObj)) {
+            $unpriv->DeleteMember($self->PrincipalId);
+        } else {
+        # if we had layered transactions, life would be good
+        # sadly, we have to just go ahead, even if something
+        # bogus happened
+            $RT::Logger->crit("User ".$self->Id." is neither privileged nor ".
+                "unprivileged. something is drastically wrong.");
+        }
+        my ($status, $msg) = $priv->AddMember($self->PrincipalId);  
+        if ($status) {
+            return (1, $self->loc("That user is now privileged"));
+        } else {
+            return (0, $msg);
+        }
+    }
+    else {
+        if ($unpriv->HasMember($self->PrincipalObj)) {
+            #$RT::Logger->debug("That user is already unprivileged");
+            return (0,$self->loc("That user is already unprivileged"));
+        }
+        if ($priv->HasMember($self->PrincipalObj)) {
+            $priv->DeleteMember($self->PrincipalId);
+        } else {
+        # if we had layered transactions, life would be good
+        # sadly, we have to just go ahead, even if something
+        # bogus happened
+            $RT::Logger->crit("User ".$self->Id." is neither privileged nor ".
+                "unprivileged. something is drastically wrong.");
+        }
+        my ($status, $msg) = $unpriv->AddMember($self->PrincipalId);  
+        if ($status) {
+            return (1, $self->loc("That user is now unprivileged"));
+        } else {
+            return (0, $msg);
+        }
+    }
+}
+
+# }}}
+
+# {{{ Privileged
+
+=head2 Privileged
+
+Returns true if this user is privileged. Returns undef otherwise.
+
+=cut
+
+sub Privileged {
+    my $self = shift;
+    my $priv = RT::Group->new($self->CurrentUser);
+    $priv->LoadSystemInternalGroup('Privileged');
+    if ($priv->HasMember($self->PrincipalObj)) {
+        return(1);
+    }
+    else {
+        return(undef);
+    }
+}
+
+# }}}
+
+# {{{ sub _BootstrapCreate 
+
+#create a user without validating _any_ data.
+
+#To be used only on database init.
+# We can't localize here because it's before we _have_ a loc framework
+
+sub _BootstrapCreate {
+    my $self = shift;
+    my %args = (@_);
+
+    $args{'Password'} = '*NO-PASSWORD*';
+
+
+    $RT::Handle->BeginTransaction(); 
+
+    # Groups deal with principal ids, rather than user ids.
+    # When creating this user, set up a principal Id for it.
+    my $principal = RT::Principal->new($self->CurrentUser);
+    my $principal_id = $principal->Create(PrincipalType => 'User', ObjectId => '0');
+    $principal->__Set(Field => 'ObjectId', Value => $principal_id);
+   
+    # If we couldn't create a principal Id, get the fuck out.
+    unless ($principal_id) {
+        $RT::Handle->Rollback();
+        $RT::Logger->crit("Couldn't create a Principal on new user create. Strange things are afoot at the circle K");
+        return ( 0, 'Could not create user' );
+    }
+    $self->SUPER::Create(id => $principal_id, %args);
+    my $id = $self->Id;
+    #If the create failed.
+      unless ($id) {
+      $RT::Handle->Rollback();
+      return ( 0, 'Could not create user' ) ; #never loc this
+    }
+
+    my $aclstash = RT::Group->new($self->CurrentUser);
+    my $stash_id  = $aclstash->_CreateACLEquivalenceGroup($principal);
+
+    unless ($stash_id) {
+        $RT::Handle->Rollback();
+        $RT::Logger->crit("Couldn't stash the user in groupmembers");
+        return ( 0, $self->loc('Could not create user') );
+    }
+
+                                    
+    $RT::Handle->Commit();
+
+    return ( $id, 'User created' );
+}
+
+# }}}
+
+# {{{ sub Delete 
+
+sub Delete {
+    my $self = shift;
+
+    return ( 0, $self->loc('Deleting this object would violate referential integrity') );
+
+}
+
+# }}}
+
+# {{{ sub Load 
+
+=head2 Load
+
+Load a user object from the database. Takes a single argument.
+If the argument is numerical, load by the column 'id'. Otherwise, load by
+the "Name" column which is the user's textual username.
+
+=cut
+
+sub Load {
+    my $self       = shift;
+    my $identifier = shift || return undef;
+
+    #if it's an int, load by id. otherwise, load by name.
+    if ( $identifier !~ /\D/ ) {
+        $self->SUPER::LoadById($identifier);
+    }
+    else {
+        $self->LoadByCol( "Name", $identifier );
+    }
+}
+
+# }}}
+
+# {{{ sub LoadByEmail
+
+=head2 LoadByEmail
+
+Tries to load this user object from the database by the user's email address.
+
+
+=cut
+
+sub LoadByEmail {
+    my $self    = shift;
+    my $address = shift;
+
+    # Never load an empty address as an email address.
+    unless ($address) {
+        return (undef);
+    }
+
+    $address = $self->CanonicalizeEmailAddress($address);
+
+    #$RT::Logger->debug("Trying to load an email address: $address\n");
+    return $self->LoadByCol( "EmailAddress", $address );
+}
+
+# }}}
+
+# {{{ LoadOrCreateByEmail 
+
+=head2 LoadOrCreateByEmail ADDRESS
+
+Attempts to find a user who has the provided email address. If that fails, creates an unprivileged user with
+the provided email address. and loads them.
+
+Returns a tuple of the user's id and a status message.
+0 will be returned in place of the user's id in case of failure.
+
+=cut
+
+sub LoadOrCreateByEmail {
+    my $self = shift;
+    my $email = shift;
+
+        my ($val, $message);
+
+        $self->LoadByEmail($email);
+        $message = $self->loc('User loaded');
+        unless ($self->Id) {
+            ( $val, $message ) = $self->Create(
+                Name => $email,
+                EmailAddress => $email,
+                RealName     => $email,
+                Privileged   => 0,
+                Comments     => 'Autocreated when added as a watcher');
+            unless ($val) {
+                # Deal with the race condition of two account creations at once
+                $self->LoadByEmail($email);
+                unless ($self->Id) {
+                    sleep 5;
+                    $self->LoadByEmail($email);
+                }
+                if ($self->Id) {
+                    $RT::Logger->error("Recovered from creation failure due to race condition");
+                    $message = $self->loc("User loaded");
+                }
+                else {
+                    $RT::Logger->crit("Failed to create user ".$email .": " .$message);
+                }
+            }
+        }
+
+        if ($self->Id) {
+            return($self->Id, $message);
+        }
+        else {
+            return(0, $message);
+        }
+
+
+    }
+
+# }}}
+
+# {{{ sub ValidateEmailAddress
+
+=head2 ValidateEmailAddress ADDRESS
+
+Returns true if the email address entered is not in use by another user or is 
+undef or ''. Returns false if it's in use. 
+
+=cut
+
+sub ValidateEmailAddress {
+    my $self  = shift;
+    my $Value = shift;
+
+    # if the email address is null, it's always valid
+    return (1) if ( !$Value || $Value eq "" );
+
+    my $TempUser = RT::User->new($RT::SystemUser);
+    $TempUser->LoadByEmail($Value);
+
+    if ( $TempUser->id && ( $TempUser->id != $self->id ) )
+    {    # if we found a user with that address
+            # it's invalid to set this user's address to it
+        return (undef);
+    }
+    else {    #it's a valid email address
+        return (1);
+    }
+}
+
+# }}}
+
+# {{{ sub CanonicalizeEmailAddress
+
+
+
+=item CanonicalizeEmailAddress ADDRESS
+
+# CanonicalizeEmailAddress converts email addresses into canonical form.
+# it takes one email address in and returns the proper canonical
+# form. You can dump whatever your proper local config is in here
+
+=cut
+
+sub CanonicalizeEmailAddress {
+    my $self = shift;
+    my $email = shift;
+    # Example: the following rule would treat all email
+    # coming from a subdomain as coming from second level domain
+    # foo.com
+    if ($RT::CanonicalizeEmailAddressMatch && $RT::CanonicalizeEmailAddressReplace ) {
+        $email =~ s/$RT::CanonicalizeEmailAddressMatch/$RT::CanonicalizeEmailAddressReplace/gi;
+    }
+    return ($email);
+}
+
+
+# }}}
+
+
+# {{{ Password related functions
+
+# {{{ sub SetRandomPassword
+
+=head2 SetRandomPassword
+
+Takes no arguments. Returns a status code and a new password or an error message.
+If the status is 1, the second value returned is the new password.
+If the status is anything else, the new value returned is the error code.
+
+=cut
+
+sub SetRandomPassword {
+    my $self = shift;
+
+    unless ( $self->CurrentUserCanModify('Password') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    my $pass = $self->GenerateRandomPassword( 6, 8 );
+
+    # If we have "notify user on 
+
+    my ( $val, $msg ) = $self->SetPassword($pass);
+
+    #If we got an error return the error.
+    return ( 0, $msg ) unless ($val);
+
+    #Otherwise, we changed the password, lets return it.
+    return ( 1, $pass );
+
+}
+
+# }}}
+
+# {{{ sub ResetPassword
+
+=head2 ResetPassword
+
+Returns status, [ERROR or new password].  Resets this user\'s password to
+a randomly generated pronouncable password and emails them, using a 
+global template called "RT_PasswordChange", which can be overridden
+with global templates "RT_PasswordChange_Privileged" or "RT_PasswordChange_NonPrivileged" 
+for privileged and Non-privileged users respectively.
+
+=cut
+
+sub ResetPassword {
+    my $self = shift;
+
+    unless ( $self->CurrentUserCanModify('Password') ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+    my ( $status, $pass ) = $self->SetRandomPassword();
+
+    unless ($status) {
+        return ( 0, "$pass" );
+    }
+
+    my $template = RT::Template->new( $self->CurrentUser );
+
+    if ( $self->IsPrivileged ) {
+        $template->LoadGlobalTemplate('RT_PasswordChange_Privileged');
+    }
+    else {
+        $template->LoadGlobalTemplate('RT_PasswordChange_Privileged');
+    }
+
+    unless ( $template->Id ) {
+        $template->LoadGlobalTemplate('RT_PasswordChange');
+    }
+
+    unless ( $template->Id ) {
+        $RT::Logger->crit( "$self tried to send "
+              . $self->Name
+              . " a password reminder "
+              . "but couldn't find a password change template" );
+    }
+
+    my $notification = RT::Action::SendPasswordEmail->new(
+        TemplateObj => $template,
+        Argument    => $pass
+    );
+
+    $notification->SetTo( $self->EmailAddress );
+
+    my ($ret);
+    $ret = $notification->Prepare();
+    if ($ret) {
+        $ret = $notification->Commit();
+    }
+
+    if ($ret) {
+        return ( 1, $self->loc('New password notification sent') );
+    }
+    else {
+        return ( 0, $self->loc('Notification could not be sent') );
+    }
+
+}
+
+# }}}
+
+# {{{ sub GenerateRandomPassword
+
+=head2 GenerateRandomPassword MIN_LEN and MAX_LEN
+
+Returns a random password between MIN_LEN and MAX_LEN characters long.
+
+=cut
+
+sub GenerateRandomPassword {
+    my $self       = shift;
+    my $min_length = shift;
+    my $max_length = shift;
+
+    #This code derived from mpw.pl, a bit of code with a sordid history
+    # Its notes: 
+
+    # Perl cleaned up a bit by Jesse Vincent 1/14/2001.
+    # Converted to perl from C by Marc Horowitz, 1/20/2000.
+    # Converted to C from Multics PL/I by Bill Sommerfeld, 4/21/86.
+    # Original PL/I version provided by Jerry Saltzer.
+
+    my ( $frequency, $start_freq, $total_sum, $row_sums );
+
+    #When munging characters, we need to know where to start counting letters from
+    my $a = ord('a');
+
+    # frequency of English digraphs (from D Edwards 1/27/66) 
+    $frequency = [
+        [
+            4, 20, 28, 52, 2,  11,  28, 4,  32, 4, 6, 62, 23, 167,
+            2, 14, 0,  83, 76, 127, 7,  25, 8,  1, 9, 1
+        ],    # aa - az
+        [
+            13, 0, 0, 0,  55, 0, 0,  0, 8, 2, 0,  22, 0, 0,
+            11, 0, 0, 15, 4,  2, 13, 0, 0, 0, 15, 0
+        ],    # ba - bz
+        [
+            32, 0, 7, 1,  69, 0,  0,  33, 17, 0, 10, 9, 1, 0,
+            50, 3, 0, 10, 0,  28, 11, 0,  0,  0, 3,  0
+        ],    # ca - cz
+        [
+            40, 16, 9, 5,  65, 18, 3,  9, 56, 0, 1, 4, 15, 6,
+            16, 4,  0, 21, 18, 53, 19, 5, 15, 0, 3, 0
+        ],    # da - dz
+        [
+            84, 20, 55, 125, 51, 40, 19, 16,  50,  1,
+            4,  55, 54, 146, 35, 37, 6,  191, 149, 65,
+            9,  26, 21, 12,  5,  0
+        ],    # ea - ez
+        [
+            19, 3, 5, 1,  19, 21, 1, 3, 30, 2, 0, 11, 1, 0,
+            51, 0, 0, 26, 8,  47, 6, 3, 3,  0, 2, 0
+        ],    # fa - fz
+        [
+            20, 4, 3, 2,  35, 1,  3, 15, 18, 0, 0, 5, 1, 4,
+            21, 1, 1, 20, 9,  21, 9, 0,  5,  0, 1, 0
+        ],    # ga - gz
+        [
+            101, 1, 3, 0, 270, 5,  1, 6, 57, 0, 0, 0, 3, 2,
+            44,  1, 0, 3, 10,  18, 6, 0, 5,  0, 3, 0
+        ],    # ha - hz
+        [
+            40, 7,  51, 23, 25, 9,   11, 3,  0, 0, 2, 38, 25, 202,
+            56, 12, 1,  46, 79, 117, 1,  22, 0, 4, 0, 3
+        ],    # ia - iz
+        [
+            3, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+            4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0
+        ],    # ja - jz
+        [
+            1, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 2,
+            0, 0, 0, 0, 6,  2, 1, 0, 2,  0, 1, 0
+        ],    # ka - kz
+        [
+            44, 2, 5, 12, 62, 7,  5, 2, 42, 1, 1,  53, 2, 2,
+            25, 1, 1, 2,  16, 23, 9, 0, 1,  0, 33, 0
+        ],    # la - lz
+        [
+            52, 14, 1, 0, 64, 0, 0, 3, 37, 0, 0, 0, 7, 1,
+            17, 18, 1, 2, 12, 3, 8, 0, 1,  0, 2, 0
+        ],    # ma - mz
+        [
+            42, 10, 47, 122, 63, 19, 106, 12, 30, 1,
+            6,  6,  9,  7,   54, 7,  1,   7,  44, 124,
+            6,  1,  15, 0,   12, 0
+        ],    # na - nz
+        [
+            7,  12, 14, 17, 5,  95, 3,  5,  14, 0, 0, 19, 41, 134,
+            13, 23, 0,  91, 23, 42, 55, 16, 28, 0, 4, 1
+        ],    # oa - oz
+        [
+            19, 1, 0, 0,  37, 0, 0, 4, 8, 0, 0, 15, 1, 0,
+            27, 9, 0, 33, 14, 7, 6, 0, 0, 0, 0, 0
+        ],    # pa - pz
+        [
+            0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0
+        ],    # qa - qz
+        [
+            83, 8, 16, 23, 169, 4,  8, 8,  77, 1, 10, 5, 26, 16,
+            60, 4, 0,  24, 37,  55, 6, 11, 4,  0, 28, 0
+        ],    # ra - rz
+        [
+            65, 9,  17, 9, 73, 13,  1,  47, 75, 3, 0, 7, 11, 12,
+            56, 17, 6,  9, 48, 116, 35, 1,  28, 0, 4, 0
+        ],    # sa - sz
+        [
+            57, 22, 3,  1, 76, 5, 2, 330, 126, 1,
+            0,  14, 10, 6, 79, 7, 0, 49,  50,  56,
+            21, 2,  27, 0, 24, 0
+        ],    # ta - tz
+        [
+            11, 5,  9, 6,  9,  1,  6, 0, 9, 0, 1, 19, 5, 31,
+            1,  15, 0, 47, 39, 31, 0, 3, 0, 0, 0, 0
+        ],    # ua - uz
+        [
+            7, 0, 0, 0, 72, 0, 0, 0, 28, 0, 0, 0, 0, 0,
+            5, 0, 0, 0, 0,  0, 0, 0, 0,  0, 3, 0
+        ],    # va - vz
+        [
+            36, 1, 1, 0, 38, 0, 0, 33, 36, 0, 0, 4, 1, 8,
+            15, 0, 0, 0, 4,  2, 0, 0,  1,  0, 0, 0
+        ],    # wa - wz
+        [
+            1, 0, 2, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0,
+            1, 5, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0
+        ],    # xa - xz
+        [
+            14, 5, 4, 2, 7,  12, 12, 6, 10, 0, 0, 3, 7, 5,
+            17, 3, 0, 4, 16, 30, 0,  0, 5,  0, 0, 0
+        ],    # ya - yz
+        [
+            1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+        ]
+    ];    # za - zz
+
+    #We need to know the totals for each row 
+    $row_sums = [
+        map {
+            my $sum = 0;
+            map { $sum += $_ } @$_;
+            $sum;
+          } @$frequency
+    ];
+
+    #Frequency with which a given letter starts a word.
+    $start_freq = [
+        1299, 425, 725, 271, 375, 470, 93, 223, 1009, 24,
+        20,   355, 379, 319, 823, 618, 21, 317, 962,  1991,
+        271,  104, 516, 6,   16,  14
+    ];
+
+    $total_sum = 0;
+    map { $total_sum += $_ } @$start_freq;
+
+    my $length = $min_length + int( rand( $max_length - $min_length ) );
+
+    my $char = $self->GenerateRandomNextChar( $total_sum, $start_freq );
+    my @word = ( $char + $a );
+    for ( 2 .. $length ) {
+        $char =
+          $self->_GenerateRandomNextChar( $row_sums->[$char],
+            $frequency->[$char] );
+        push ( @word, $char + $a );
+    }
+
+    #Return the password
+    return pack( "C*", @word );
+
+}
+
+#A private helper function for RandomPassword
+# Takes a row summary and a frequency chart for the next character to be searched
+sub _GenerateRandomNextChar {
+    my $self = shift;
+    my ( $all, $freq ) = @_;
+    my ( $pos, $i );
+
+    for ( $pos = int( rand($all) ), $i = 0 ;
+        $pos >= $freq->[$i] ;
+        $pos -= $freq->[$i], $i++ )
+    {
+    }
+
+    return ($i);
+}
+
+# }}}
+
+# {{{ sub SetPassword
+
+=head2 SetPassword
+
+Takes a string. Checks the string's length and sets this user's password 
+to that string.
+
+=cut
+
+sub SetPassword {
+    my $self     = shift;
+    my $password = shift;
+
+    unless ( $self->CurrentUserCanModify('Password') ) {
+        return ( 0, $self->loc('Permission Denied') );
+    }
+
+    if ( !$password ) {
+        return ( 0, $self->loc("No password set") );
+    }
+    elsif ( length($password) < $RT::MinimumPasswordLength ) {
+        return ( 0, $self->loc("Password too short") );
+    }
+    else {
+        $password = $self->_GeneratePassword($password);
+        return ( $self->SUPER::SetPassword( $password));
+    }
+
+}
+
+=head2 _GeneratePassword PASSWORD
+
+returns an MD5 hash of the password passed in, in base64 encoding.
+
+=cut
+
+sub _GeneratePassword {
+    my $self = shift;
+    my $password = shift;
+
+    my $md5 = Digest::MD5->new();
+    $md5->add($password);
+    return ($md5->b64digest);
+
+}
+
+# }}}
+
+# {{{ sub IsPassword 
+
+=head2 IsPassword
+
+Returns true if the passed in value is this user's password.
+Returns undef otherwise.
+
+=cut
+
+sub IsPassword {
+    my $self  = shift;
+    my $value = shift;
+
+    #TODO there isn't any apparent way to legitimately ACL this
+
+    # RT does not allow null passwords 
+    if ( ( !defined($value) ) or ( $value eq '' ) ) {
+        return (undef);
+    }
+
+   if ( $self->PrincipalObj->Disabled ) {
+        $RT::Logger->info(
+            "Disabled user " . $self->Name . " tried to log in" );
+        return (undef);
+    }
+
+    if ( ($self->__Value('Password') eq '') || 
+         ($self->__Value('Password') eq undef) )  {
+        return(undef);
+     }
+
+    # generate an md5 password 
+    if ($self->_GeneratePassword($value) eq $self->__Value('Password')) {
+        return(1);
+    }
+
+    #  if it's a historical password we say ok.
+
+    if ( $self->__Value('Password') eq crypt( $value, $self->__Value('Password') ) ) {
+        return (1);
+    }
+
+    # no password check has succeeded. get out
+
+    return (undef);
+}
+
+# }}}
+
+# }}}
+
+# {{{ sub SetDisabled
+
+=head2 Sub SetDisabled
+
+Toggles the user's disabled flag.
+If this flag is
+set, all password checks for this user will fail. All ACL checks for this
+user will fail. The user will appear in no user listings.
+
+=cut 
+
+# }}}
+
+sub SetDisabled {
+    my $self = shift;
+    unless ( $self->CurrentUser->HasRight(Right => 'AdminUsers', Object => $RT::System) ) {
+        return (0, $self->loc('Permission Denied'));
+    }
+    return $self->PrincipalObj->SetDisabled(@_);
+}
+
+sub Disabled {
+    my $self = shift;
+    return $self->PrincipalObj->Disabled(@_);
+}
+
+
+# {{{ Principal related routines
+
+=head2 PrincipalObj 
+
+Returns the principal object for this user. returns an empty RT::Principal
+if there's no principal object matching this user. 
+The response is cached. PrincipalObj should never ever change.
+
+=begin testing
+
+ok(my $u = RT::User->new($RT::SystemUser));
+ok($u->Load(1), "Loaded the first user");
+ok($u->PrincipalObj->ObjectId == 1, "user 1 is the first principal");
+ok($u->PrincipalObj->PrincipalType eq 'User' , "Principal 1 is a user, not a group");
+
+=end testing
+
+=cut
+
+
+sub PrincipalObj {
+    my $self = shift;
+    unless ($self->{'PrincipalObj'} && 
+            ($self->{'PrincipalObj'}->ObjectId == $self->Id) &&
+            ($self->{'PrincipalObj'}->PrincipalType eq 'User')) {
+
+            $self->{'PrincipalObj'} = RT::Principal->new($self->CurrentUser);
+            $self->{'PrincipalObj'}->LoadByCols('ObjectId' => $self->Id,
+                                                'PrincipalType' => 'User') ;
+            }
+    return($self->{'PrincipalObj'});
+}
+
+
+=head2 PrincipalId  
+
+Returns this user's PrincipalId
+
+=cut
+
+sub PrincipalId {
+    my $self = shift;
+    return $self->Id;
+}
+
+# }}}
+
+
+
+# {{{ sub HasGroupRight
+
+=head2 HasGroupRight
+
+Takes a paramhash which can contain
+these items:
+    GroupObj => RT::Group or Group => integer
+    Right => 'Right' 
+
+
+Returns 1 if this user has the right specified in the paramhash for the Group
+passed in.
+
+Returns undef if they don't.
+
+=cut
+
+sub HasGroupRight {
+    my $self = shift;
+    my %args = (
+        GroupObj    => undef,
+        Group       => undef,
+        Right       => undef,
+        @_
+    );
+
+
+    if ( defined $args{'Group'} ) {
+        $args{'GroupObj'} = RT::Group->new( $self->CurrentUser );
+        $args{'GroupObj'}->Load( $args{'Group'} );
+    }
+
+    # {{{ Validate and load up the GroupId
+    unless ( ( defined $args{'GroupObj'} ) and ( $args{'GroupObj'}->Id ) ) {
+        return undef;
+    }
+
+    # }}}
+
+
+    # Figure out whether a user has the right we're asking about.
+    my $retval = $self->HasRight(
+        Object => $args{'GroupObj'},
+        Right     => $args{'Right'},
+    );
+
+    return ($retval);
+
+
+}
+
+# }}}
+
+# {{{ sub Rights testing
+
+=head2 Rights testing
+
+
+=begin testing
+
+my $root = RT::User->new($RT::SystemUser);
+$root->Load('root');
+ok($root->Id, "Found the root user");
+my $rootq = RT::Queue->new($root);
+$rootq->Load(1);
+ok($rootq->Id, "Loaded the first queue");
+
+ok ($rootq->CurrentUser->HasRight(Right=> 'CreateTicket', Object => $rootq), "Root can create tickets");
+
+my $new_user = RT::User->new($RT::SystemUser);
+my ($id, $msg) = $new_user->Create(Name => 'ACLTest');
+
+ok ($id, "Created a new user for acl test $msg");
+
+my $q = RT::Queue->new($new_user);
+$q->Load(1);
+ok($q->Id, "Loaded the first queue");
+
+
+ok (!$q->CurrentUser->HasRight(Right => 'CreateTicket', Object => $q), "Some random user doesn't have the right to create tickets");
+ok (my ($gval, $gmsg) = $new_user->PrincipalObj->GrantRight( Right => 'CreateTicket', Object => $q), "Granted the random user the right to create tickets");
+ok ($gval, "Grant succeeded - $gmsg");
+
+
+ok ($q->CurrentUser->HasRight(Right => 'CreateTicket', Object => $q), "The user can create tickets after we grant him the right");
+ok (my ($gval, $gmsg) = $new_user->PrincipalObj->RevokeRight( Right => 'CreateTicket', Object => $q), "revoked the random user the right to create tickets");
+ok ($gval, "Revocation succeeded - $gmsg");
+ok (!$q->CurrentUser->HasRight(Right => 'CreateTicket', Object => $q), "The user can't create tickets anymore");
+
+
+
+
+
+# Create a ticket in the queue
+my $new_tick = RT::Ticket->new($RT::SystemUser);
+my ($tickid, $tickmsg) = $new_tick->Create(Subject=> 'ACL Test', Queue => 'General');
+ok($tickid, "Created ticket: $tickid");
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+# Create a new group
+my $group = RT::Group->new($RT::SystemUser);
+$group->CreateUserDefinedGroup(Name => 'ACLTest');
+ok($group->Id, "Created a new group Ok");
+# Grant a group the right to modify tickets in a queue
+ok(my ($gv,$gm) = $group->PrincipalObj->GrantRight( Object => $q, Right => 'ModifyTicket'),"Granted the group the right to modify tickets");
+ok($gv,"Grant succeeed - $gm");
+# Add the user to the group
+ok( my ($aid, $amsg) = $group->AddMember($new_user->PrincipalId), "Added the member to the group");
+ok ($aid, "Member added to group: $amsg");
+# Make sure the user does have the right to modify tickets in the queue
+ok ($new_user->HasRight( Object => $new_tick, Right => 'ModifyTicket'), "User can modify the ticket with group membership");
+
+
+# Remove the user from the group
+ok( my ($did, $dmsg) = $group->DeleteMember($new_user->PrincipalId), "Deleted the member from the group");
+ok ($did,"Deleted the group member: $dmsg");
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+
+
+my $q_as_system = RT::Queue->new($RT::SystemUser);
+$q_as_system->Load(1);
+ok($q_as_system->Id, "Loaded the first queue");
+
+# Create a ticket in the queue
+my $new_tick2 = RT::Ticket->new($RT::SystemUser);
+my ($tick2id, $tickmsg) = $new_tick2->Create(Subject=> 'ACL Test 2', Queue =>$q_as_system->Id);
+ok($tick2id, "Created ticket: $tick2id");
+ok($new_tick2->QueueObj->id eq $q_as_system->Id, "Created a new ticket in queue 1");
+
+
+# make sure that the user can't do this without subgroup membership
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+
+# Create a subgroup
+my $subgroup = RT::Group->new($RT::SystemUser);
+$subgroup->CreateUserDefinedGroup(Name => 'Subgrouptest');
+ok($subgroup->Id, "Created a new group ".$subgroup->Id."Ok");
+#Add the subgroup as a subgroup of the group
+my ($said, $samsg) =  $group->AddMember($subgroup->PrincipalId);
+ok ($said, "Added the subgroup as a member of the group");
+# Add the user to a subgroup of the group
+
+my ($usaid, $usamsg) =  $subgroup->AddMember($new_user->PrincipalId);
+ok($usaid,"Added the user ".$new_user->Id."to the subgroup");
+# Make sure the user does have the right to modify tickets in the queue
+ok ($new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can modify the ticket with subgroup membership");
+
+#  {{{ Deal with making sure that members of subgroups of a disabled group don't have rights
+
+my ($id, $msg);
+ ($id, $msg) =  $group->SetDisabled(1);
+ ok ($id,$msg);
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket when the group ".$group->Id. " is disabled");
+ ($id, $msg) =  $group->SetDisabled(0);
+ok($id,$msg);
+# Test what happens when we disable the group the user is a member of directly
+
+($id, $msg) =  $subgroup->SetDisabled(1);
+ ok ($id,$msg);
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket when the group ".$subgroup->Id. " is disabled");
+ ($id, $msg) =  $subgroup->SetDisabled(0);
+ ok ($id,$msg);
+ok ($new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can modify the ticket without group membership");
+
+# }}}
+
+
+my ($usrid, $usrmsg) =  $subgroup->DeleteMember($new_user->PrincipalId);
+ok($usrid,"removed the user from the group - $usrmsg");
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+
+#revoke the right to modify tickets in a queue
+ok(($gv,$gm) = $group->PrincipalObj->RevokeRight( Object => $q, Right => 'ModifyTicket'),"Granted the group the right to modify tickets");
+ok($gv,"revoke succeeed - $gm");
+
+# {{{ Test the user's right to modify a ticket as a _queue_ admincc for a right granted at the _queue_ level
+
+# Grant queue admin cc the right to modify ticket in the queue 
+ok(my ($qv,$qm) = $q_as_system->AdminCc->PrincipalObj->GrantRight( Object => $q_as_system, Right => 'ModifyTicket'),"Granted the queue adminccs the right to modify tickets");
+ok($qv, "Granted the right successfully - $qm");
+
+# Add the user as a queue admincc
+ok ((my $add_id, $add_msg) = $q_as_system->AddWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Added the new user as a queue admincc");
+ok ($add_id, "the user is now a queue admincc - $add_msg");
+
+# Make sure the user does have the right to modify tickets in the queue
+ok ($new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can modify the ticket as an admincc");
+# Remove the user from the role  group
+ok ((my $del_id, $del_msg) = $q_as_system->DeleteWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Deleted the new user as a queue admincc");
+
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+
+# }}}
+
+# {{{ Test the user's right to modify a ticket as a _ticket_ admincc with the right granted at the _queue_ level
+
+# Add the user as a ticket admincc
+ok ((my $uadd_id, $uadd_msg) = $new_tick2->AddWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Added the new user as a queue admincc");
+ok ($add_id, "the user is now a queue admincc - $add_msg");
+
+# Make sure the user does have the right to modify tickets in the queue
+ok ($new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can modify the ticket as an admincc");
+
+# Remove the user from the role  group
+ok ((my $del_id, $del_msg) = $new_tick2->DeleteWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Deleted the new user as a queue admincc");
+
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+
+
+# Revoke the right to modify ticket in the queue 
+ok(my ($rqv,$rqm) = $q_as_system->AdminCc->PrincipalObj->RevokeRight( Object => $q_as_system, Right => 'ModifyTicket'),"Revokeed the queue adminccs the right to modify tickets");
+ok($rqv, "Revoked the right successfully - $rqm");
+
+# }}}
+
+
+
+# {{{ Test the user's right to modify a ticket as a _queue_ admincc for a right granted at the _system_ level
+
+# Before we start Make sure the user does not have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can not modify the ticket without it being granted");
+ok (!$new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can not modify tickets in the queue without it being granted");
+
+# Grant queue admin cc the right to modify ticket in the queue 
+ok(my ($qv,$qm) = $q_as_system->AdminCc->PrincipalObj->GrantRight( Object => $RT::System, Right => 'ModifyTicket'),"Granted the queue adminccs the right to modify tickets");
+ok($qv, "Granted the right successfully - $qm");
+
+# Make sure the user can't modify the ticket before they're added as a watcher
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can not modify the ticket without being an admincc");
+ok (!$new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can not modify tickets in the queue without being an admincc");
+
+# Add the user as a queue admincc
+ok ((my $add_id, $add_msg) = $q_as_system->AddWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Added the new user as a queue admincc");
+ok ($add_id, "the user is now a queue admincc - $add_msg");
+
+# Make sure the user does have the right to modify tickets in the queue
+ok ($new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can modify the ticket as an admincc");
+ok ($new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can modify tickets in the queue as an admincc");
+# Remove the user from the role  group
+ok ((my $del_id, $del_msg) = $q_as_system->DeleteWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Deleted the new user as a queue admincc");
+
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket without group membership");
+ok (!$new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can't modify tickets in the queue without group membership");
+
+# }}}
+
+# {{{ Test the user's right to modify a ticket as a _ticket_ admincc with the right granted at the _queue_ level
+
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can not modify the ticket without being an admincc");
+ok (!$new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can not modify tickets in the queue obj without being an admincc");
+
+
+# Add the user as a ticket admincc
+ok ((my $uadd_id, $uadd_msg) = $new_tick2->AddWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Added the new user as a queue admincc");
+ok ($add_id, "the user is now a queue admincc - $add_msg");
+
+# Make sure the user does have the right to modify tickets in the queue
+ok ($new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can modify the ticket as an admincc");
+ok (!$new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can not modify tickets in the queue obj being only a ticket admincc");
+
+# Remove the user from the role  group
+ok ((my $del_id, $del_msg) = $new_tick2->DeleteWatcher(Type => 'AdminCc', PrincipalId => $new_user->PrincipalId)  , "Deleted the new user as a queue admincc");
+
+# Make sure the user doesn't have the right to modify tickets in the queue
+ok (!$new_user->HasRight( Object => $new_tick2, Right => 'ModifyTicket'), "User can't modify the ticket without being an admincc");
+ok (!$new_user->HasRight( Object => $new_tick2->QueueObj, Right => 'ModifyTicket'), "User can not modify tickets in the queue obj without being an admincc");
+
+
+# Revoke the right to modify ticket in the queue 
+ok(my ($rqv,$rqm) = $q_as_system->AdminCc->PrincipalObj->RevokeRight( Object => $RT::System, Right => 'ModifyTicket'),"Revokeed the queue adminccs the right to modify tickets");
+ok($rqv, "Revoked the right successfully - $rqm");
+
+# }}}
+
+
+
+
+# Grant "privileged users" the system right to create users
+# Create a privileged user.
+# have that user create another user
+# Revoke the right for privileged users to create users
+# have the privileged user try to create another user and fail the ACL check
+
+=end testing
+
+=cut
+
+# }}}
+
+
+# {{{ sub HasRight
+
+=head2 sub HasRight
+
+Shim around PrincipalObj->HasRight. See RT::Principal
+
+=cut
+
+sub HasRight {
+
+    my $self = shift;
+    return $self->PrincipalObj->HasRight(@_);
+}
+
+# }}}
+
+# {{{ sub CurrentUserCanModify
+
+=head2 CurrentUserCanModify RIGHT
+
+If the user has rights for this object, either because
+he has 'AdminUsers' or (if he\'s trying to edit himself and the right isn\'t an 
+admin right) 'ModifySelf', return 1. otherwise, return undef.
+
+=cut
+
+sub CurrentUserCanModify {
+    my $self  = shift;
+    my $right = shift;
+
+    if ( $self->CurrentUser->HasRight(Right => 'AdminUsers', Object => $RT::System) ) {
+        return (1);
+    }
+
+    #If the field is marked as an "administrators only" field, 
+    # don\'t let the user touch it.
+    elsif ( $self->_Accessible( $right, 'admin' ) ) {
+        return (undef);
+    }
+
+    #If the current user is trying to modify themselves
+    elsif ( ( $self->id == $self->CurrentUser->id )
+        and ( $self->CurrentUser->HasRight(Right => 'ModifySelf', Object => $RT::System) ) )
+    {
+        return (1);
+    }
+
+    #If we don\'t have a good reason to grant them rights to modify
+    # by now, they lose
+    else {
+        return (undef);
+    }
+
+}
+
+# }}}
+
+# {{{ sub CurrentUserHasRight
+
+=head2 CurrentUserHasRight
+  
+  Takes a single argument. returns 1 if $Self->CurrentUser
+  has the requested right. returns undef otherwise
+
+=cut
+
+sub CurrentUserHasRight {
+    my $self  = shift;
+    my $right = shift;
+
+    return ( $self->CurrentUser->HasRight(Right => $right, Object => $RT::System) );
+}
+
+# }}}
+
+# {{{ sub _Set
+
+sub _Set {
+    my $self = shift;
+
+    my %args = (
+        Field => undef,
+        Value => undef,
+        @_
+    );
+
+    # Nobody is allowed to futz with RT_System or Nobody 
+
+    if ( ($self->Id == $RT::SystemUser->Id )  || 
+         ($self->Id == $RT::Nobody->Id)) {
+        return ( 0, $self->loc("Can not modify system users") );
+    }
+    unless ( $self->CurrentUserCanModify( $args{'Field'} ) ) {
+        return ( 0, $self->loc("Permission Denied") );
+    }
+
+    #Set the new value
+    my ( $ret, $msg ) = $self->SUPER::_Set(
+        Field => $args{'Field'},
+        Value => $args{'Value'}
+    );
+
+    return ( $ret, $msg );
+}
+
+# }}}
+
+# {{{ sub _Value 
+
+=head2 _Value
+
+Takes the name of a table column.
+Returns its value as a string, if the user passes an ACL check
+
+=cut
+
+sub _Value {
+
+    my $self  = shift;
+    my $field = shift;
+
+    #If the current user doesn't have ACLs, don't let em at it.  
+
+    my @PublicFields = qw( Name EmailAddress Organization Disabled
+      RealName NickName Gecos ExternalAuthId
+      AuthSystem ExternalContactInfoId
+      ContactInfoSystem );
+
+    #if the field is public, return it.
+    if ( $self->_Accessible( $field, 'public' ) ) {
+        return ( $self->SUPER::_Value($field) );
+
+    }
+
+    #If the user wants to see their own values, let them
+    # TODO figure ouyt a better way to deal with this
+   elsif ( $self->CurrentUser->Id == $self->Id ) {
+        return ( $self->SUPER::_Value($field) );
+    }
+
+    #If the user has the admin users right, return the field
+    elsif ( $self->CurrentUser->HasRight(Right =>'AdminUsers', Object => $RT::System) ) {
+        return ( $self->SUPER::_Value($field) );
+    }
+    else {
+        return (undef);
+    }
+
+}
+
+# }}}
+
+
+1;
+
+
diff --git a/rt/lib/RT/Users_Overlay.pm b/rt/lib/RT/Users_Overlay.pm
new file mode 100644 (file)
index 0000000..b397c3b
--- /dev/null
@@ -0,0 +1,290 @@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2002 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+=head1 NAME
+
+  RT::Users - Collection of RT::User objects
+
+=head1 SYNOPSIS
+
+  use RT::Users;
+
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::Users);
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+# {{{ sub _Init 
+sub _Init {
+    my $self = shift;
+    $self->{'table'} = 'Users';
+        $self->{'primary_key'} = 'id';
+
+
+
+    my @result =          $self->SUPER::_Init(@_);
+    # By default, order by name
+    $self->OrderBy( ALIAS => 'main',
+                    FIELD => 'Name',
+                    ORDER => 'ASC' );
+
+    $self->{'princalias'} = $self->NewAlias('Principals');
+
+    $self->Join( ALIAS1 => 'main',
+                 FIELD1 => 'id',
+                 ALIAS2 => $self->{'princalias'},
+                 FIELD2 => 'id' );
+
+    $self->Limit( ALIAS    => $self->{'princalias'},
+                  FIELD    => 'PrincipalType',
+                  OPERATOR => '=',
+                  VALUE    => 'User' );
+    return (@result);
+}
+
+# }}}
+
+# {{{ sub _DoSearch 
+
+=head2 _DoSearch
+
+  A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that _Disabled rows never get seen unless
+we're explicitly trying to see them.
+
+=cut
+
+sub _DoSearch {
+    my $self = shift;
+
+    #unless we really want to find disabled rows, make sure we\'re only finding enabled ones.
+    unless ( $self->{'find_disabled_rows'} ) {
+        $self->LimitToEnabled();
+    }
+    return ( $self->SUPER::_DoSearch(@_) );
+
+}
+
+# }}}
+# {{{ sub LimitToEnabled
+
+=head2 LimitToEnabled
+
+Only find items that haven\'t been disabled
+
+=cut
+
+sub LimitToEnabled {
+    my $self = shift;
+
+    $self->Limit( ALIAS    => $self->{'princalias'},
+                  FIELD    => 'Disabled',
+                  VALUE    => '0',
+                  OPERATOR => '=' );
+}
+
+# }}}
+
+# {{{ LimitToEmail
+
+=head2 LimitToEmail
+
+Takes one argument. an email address. limits the returned set to
+that email address
+
+=cut
+
+sub LimitToEmail {
+    my $self = shift;
+    my $addr = shift;
+    $self->Limit( FIELD => 'EmailAddress', VALUE => "$addr" );
+}
+
+# }}}
+
+# {{{ MemberOfGroup
+
+=head2 MemberOfGroup PRINCIPAL_ID
+
+takes one argument, a group's principal id. Limits the returned set
+to members of a given group
+
+=cut
+
+sub MemberOfGroup {
+    my $self  = shift;
+    my $group = shift;
+
+    return $self->loc("No group specified") if ( !defined $group );
+
+    my $groupalias = $self->NewAlias('CachedGroupMembers');
+
+    # Join the principal to the groups table
+    $self->Join( ALIAS1 => $self->{'princalias'},
+                 FIELD1 => 'id',
+                 ALIAS2 => $groupalias,
+                 FIELD2 => 'MemberId' );
+
+    $self->Limit( ALIAS    => "$groupalias",
+                  FIELD    => 'GroupId',
+                  VALUE    => "$group",
+                  OPERATOR => "=" );
+}
+
+# }}}
+
+# {{{ LimitToPrivileged
+
+=head2 LimitToPrivileged
+
+Limits to users who can be made members of ACLs and groups
+
+=cut
+
+sub LimitToPrivileged {
+    my $self = shift;
+
+    my $priv = RT::Group->new( $self->CurrentUser );
+    $priv->LoadSystemInternalGroup('Privileged');
+    unless ( $priv->Id ) {
+        $RT::Logger->crit("Couldn't find a privileged users group");
+    }
+    $self->MemberOfGroup( $priv->PrincipalId );
+}
+
+# }}}
+
+# {{{ WhoHaveRight
+
+=head2 WhoHaveRight { Right => 'name', Object => $rt_object , IncludeSuperusers => undef, IncludeSubgroupMembers => undef, IncludeSystemRights => undef }
+
+=begin testing
+
+ok(my $users = RT::Users->new($RT::SystemUser));
+$users->WhoHaveRight(Object =>$RT::System, Right =>'SuperUser');
+ok($users->Count == 1, "There is one privileged superuser - Found ". $users->Count );
+# TODO: this wants more testing
+
+
+=end testing
+
+
+find all users who the right Right for this group, either individually
+or as members of groups
+
+
+
+
+
+=cut
+
+sub WhoHaveRight {
+    my $self = shift;
+    my %args = ( Right                  => undef,
+                 Object =>              => undef,
+                 IncludeSystemRights    => undef,
+                 IncludeSuperusers      => undef,
+                 IncludeSubgroupMembers => 1,
+                 @_ );
+
+    if (defined $args{'ObjectType'} || defined $args{'ObjectId'}) {
+        $RT::Logger->crit("$self WhoHaveRight called with the Obsolete ObjectId/ObjectType API");
+        return(undef);
+    }
+        my @privgroups;
+        my $Groups = RT::Groups->new($RT::SystemUser);
+        $Groups->WithRight(Right=> $args{'Right'},
+                     Object => $args{'Object'},
+                     IncludeSystemRights => $args{'IncludeSystemRights'},
+                     IncludeSuperusers => $args{'IncludeSuperusers'});
+        while (my $Group = $Groups->Next()) {
+                push @privgroups, $Group->Id();
+        }
+
+        $self->WhoBelongToGroups(Groups => \@privgroups,
+                                 IncludeSubgroupMembers => $args{'IncludeSubgroupMembers'});
+}
+
+# }}}
+
+# {{{ WhoBelongToGroups 
+
+=head2 WhoBelongToGroups { Groups => ARRAYREF, IncludeSubgroupMembers => 1 }
+
+=cut
+
+sub WhoBelongToGroups {
+    my $self = shift;
+    my %args = ( Groups                 => undef,
+                 IncludeSubgroupMembers => 1,
+                 @_ );
+
+    # Unprivileged users can't be granted real system rights. 
+    # is this really the right thing to be saying?
+    $self->LimitToPrivileged();
+
+    my $userprinc  = $self->{'princalias'};
+    my $cgm;
+
+    # The cachedgroupmembers table is used for unrolling group memberships to allow fast lookups 
+    # if we bind to CachedGroupMembers, we'll find all members of groups recursively.
+    # if we don't we'll find only 'direct' members of the group in question
+
+    if ( $args{'IncludeSubgroupMembers'} ) {
+        $cgm = $self->NewAlias('CachedGroupMembers');
+    }
+    else {
+        $cgm = $self->NewAlias('GroupMembers');
+    }
+
+    # {{{ Tie the users we're returning ($userprinc) to the groups that have rights granted to them ($groupprinc)
+    $self->Join( ALIAS1 => $cgm, FIELD1 => 'MemberId',
+                 ALIAS2 => $userprinc, FIELD2 => 'id' );
+    # }}} 
+
+ #   my $and_check_groups = "($cgm.GroupId = NULL";
+    foreach my $groupid (@{$args{'Groups'}}) {
+        $self->Limit(ALIAS => $cgm, FIELD => 'GroupId', VALUE => $groupid, QUOTEVALUE => 0, ENTRYAGGREGATOR=> 'OR')
+
+        #$and_check_groups .= " OR $cgm.GroupId = $groupid";
+    }
+    #$and_check_groups .= ")";
+
+    #$self->_AddSubClause("WhichGroup", $and_check_groups);
+}
+# }}}
+
+
+1;
diff --git a/rt/lib/t/00smoke.t b/rt/lib/t/00smoke.t
new file mode 100644 (file)
index 0000000..4f36bb3
--- /dev/null
@@ -0,0 +1,14 @@
+#!/usr/bin/perl
+
+use Test::More qw(no_plan);
+
+use lib "/opt/rt3/lib";
+use RT;
+ok(RT::LoadConfig);
+ok(RT::Init, "Basic initialization and DB connectivity");
+
+use File::Find;
+File::Find::find({wanted => \&wanted}, '.');
+sub wanted { /^*\.pm\z/s && ok(require $_, "Requiring '$_'"); }
+
+
diff --git a/rt/lib/t/00smoke.t.in b/rt/lib/t/00smoke.t.in
new file mode 100644 (file)
index 0000000..11f0a9c
--- /dev/null
@@ -0,0 +1,14 @@
+#!@PERL@
+
+use Test::More qw(no_plan);
+
+use lib "@RT_LIB_PATH@";
+use RT;
+ok(RT::LoadConfig);
+ok(RT::Init, "Basic initialization and DB connectivity");
+
+use File::Find;
+File::Find::find({wanted => \&wanted}, '.');
+sub wanted { /^*\.pm\z/s && ok(require $_, "Requiring '$_'"); }
+
+
diff --git a/rt/lib/t/01harness.t b/rt/lib/t/01harness.t
new file mode 100644 (file)
index 0000000..98c28d2
--- /dev/null
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+
+use Test::More qw(no_plan);
+
+use lib "/opt/rt3/lib";
+use RT;
+ok(RT::LoadConfig);
+ok(RT::Init, "Basic initialization and DB connectivity");
+
+my $test = shift @ARGV;
+require $test;
+
diff --git a/rt/lib/t/01harness.t.in b/rt/lib/t/01harness.t.in
new file mode 100644 (file)
index 0000000..d132330
--- /dev/null
@@ -0,0 +1,12 @@
+#!@PERL@
+
+use Test::More qw(no_plan);
+
+use lib "@RT_LIB_PATH@";
+use RT;
+ok(RT::LoadConfig);
+ok(RT::Init, "Basic initialization and DB connectivity");
+
+my $test = shift @ARGV;
+require $test;
+
diff --git a/rt/lib/t/02regression.t b/rt/lib/t/02regression.t
new file mode 100644 (file)
index 0000000..62b4e9a
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/perl
+
+use Test::More qw(no_plan);
+
+use lib "/opt/rt3/lib";
+use RT;
+ok(RT::LoadConfig);
+ok(RT::Init, "Basic initialization and DB connectivity");
+
+# Create a new queue
+use_ok(RT::Queue);
+my $q = RT::Queue->new($RT::SystemUser);
+
+$q->Load('regression');
+if ($q->id != 0) {
+        die "Regression tests not starting with a clean DB. Bailing";
+}
+
+my ($id, $msg) = $q->Create( Name => 'Regression',
+            Description => 'A regression test queue',
+            CorrespondAddress => 'correspond@a',
+            CommentAddress => 'comment@a');
+
+isnt($id, 0, "Queue was created sucessfully - $msg");
+
+my $q2 = RT::Queue->new($RT::SystemUser);
+
+ok($q2->Load($id));
+is($q2->id, $id, "Sucessfully loaded the queue again");
+is($q2->Name, 'Regression');
+is($q2->Description, 'A regression test queue');
+is($q2->CorrespondAddress, 'correspond@a');
+is($q2->CommentAddress, 'comment@a');
+
+
+use File::Find;
+File::Find::find({wanted => \&wanted_autogen}, 'lib/t/autogen');
+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";
diff --git a/rt/lib/t/02regression.t.in b/rt/lib/t/02regression.t.in
new file mode 100644 (file)
index 0000000..51cd7e3
--- /dev/null
@@ -0,0 +1,44 @@
+#!@PERL@
+
+use Test::More qw(no_plan);
+
+use lib "@RT_LIB_PATH@";
+use RT;
+ok(RT::LoadConfig);
+ok(RT::Init, "Basic initialization and DB connectivity");
+
+# Create a new queue
+use_ok(RT::Queue);
+my $q = RT::Queue->new($RT::SystemUser);
+
+$q->Load('regression');
+if ($q->id != 0) {
+        die "Regression tests not starting with a clean DB. Bailing";
+}
+
+my ($id, $msg) = $q->Create( Name => 'Regression',
+            Description => 'A regression test queue',
+            CorrespondAddress => 'correspond@a',
+            CommentAddress => 'comment@a');
+
+isnt($id, 0, "Queue was created sucessfully - $msg");
+
+my $q2 = RT::Queue->new($RT::SystemUser);
+
+ok($q2->Load($id));
+is($q2->id, $id, "Sucessfully loaded the queue again");
+is($q2->Name, 'Regression');
+is($q2->Description, 'A regression test queue');
+is($q2->CorrespondAddress, 'correspond@a');
+is($q2->CommentAddress, 'comment@a');
+
+
+use File::Find;
+File::Find::find({wanted => \&wanted_autogen}, 'lib/t/autogen');
+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";
diff --git a/rt/lib/t/03web.pl b/rt/lib/t/03web.pl
new file mode 100644 (file)
index 0000000..4500ff2
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/perl
+
+use strict;
+use WWW::Mechanize;
+use HTTP::Request::Common;
+use HTTP::Cookies;
+use LWP;
+
+my $cookie_jar = HTTP::Cookies->new;
+my $agent = WWW::Mechanize->new();
+
+# give the agent a place to stash the cookies
+
+$agent->cookie_jar($cookie_jar);
+
+
+# get the top page
+my $url = "http://localhost/";
+$agent->get($url);
+
+is ($agent->{'status'}, 200, "Loaded a page");
+
+
+# {{{ test a login
+
+# follow the link marked "Login"
+
+ok($agent->{form}->find_input('user'));
+
+ok($agent->{form}->find_input('pass'));
+ok ($agent->{'content'} =~ /username:/i);
+$agent->field( 'user' => 'root' );
+$agent->field( 'pass' => 'password' );
+# the field isn't named, so we have to click link 0
+$agent->click(0);
+is($agent->{'status'}, 200, "Fetched the page ok");
+ok( $agent->{'content'} =~ /Logout/i, "Found a logout link");
+
+
+use File::Find;
+find ( \&wanted , 'html/');
+
+sub wanted {
+        -f  && /\.html$/ && $_ !~ /Logout.html$/  && test_get($File::Find::name);
+}       
+
+sub test_get {
+        my $file = shift;
+
+
+        $file =~ s#^html/##; 
+        ok ($agent->get("$url/$file", "GET $url/$file"));
+        is ($agent->{'status'}, 200, "Loaded $file");
+        ok( $agent->{'content'} =~ /Logout/i, "Found a logout link on $file ");
+        ok( $agent->{'content'} !~ /Not logged in/i, "Still logged in for  $file");
+        ok( $agent->{'content'} !~ /System error/i, "Didn't get a Mason compilation error on $file");
+        
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/t/03web.pl.in b/rt/lib/t/03web.pl.in
new file mode 100644 (file)
index 0000000..abe446e
--- /dev/null
@@ -0,0 +1,62 @@
+#!@PERL@
+
+use strict;
+use WWW::Mechanize;
+use HTTP::Request::Common;
+use HTTP::Cookies;
+use LWP;
+
+my $cookie_jar = HTTP::Cookies->new;
+my $agent = WWW::Mechanize->new();
+
+# give the agent a place to stash the cookies
+
+$agent->cookie_jar($cookie_jar);
+
+
+# get the top page
+my $url = "http://localhost/";
+$agent->get($url);
+
+is ($agent->{'status'}, 200, "Loaded a page");
+
+
+# {{{ test a login
+
+# follow the link marked "Login"
+
+ok($agent->{form}->find_input('user'));
+
+ok($agent->{form}->find_input('pass'));
+ok ($agent->{'content'} =~ /username:/i);
+$agent->field( 'user' => 'root' );
+$agent->field( 'pass' => 'password' );
+# the field isn't named, so we have to click link 0
+$agent->click(0);
+is($agent->{'status'}, 200, "Fetched the page ok");
+ok( $agent->{'content'} =~ /Logout/i, "Found a logout link");
+
+
+use File::Find;
+find ( \&wanted , 'html/');
+
+sub wanted {
+        -f  && /\.html$/ && $_ !~ /Logout.html$/  && test_get($File::Find::name);
+}       
+
+sub test_get {
+        my $file = shift;
+
+
+        $file =~ s#^html/##; 
+        ok ($agent->get("$url/$file", "GET $url/$file"));
+        is ($agent->{'status'}, 200, "Loaded $file");
+        ok( $agent->{'content'} =~ /Logout/i, "Found a logout link on $file ");
+        ok( $agent->{'content'} !~ /Not logged in/i, "Still logged in for  $file");
+        ok( $agent->{'content'} !~ /System error/i, "Didn't get a Mason compilation error on $file");
+        
+}
+
+# }}}
+
+1;
diff --git a/rt/lib/t/04_send_email.pl b/rt/lib/t/04_send_email.pl
new file mode 100644 (file)
index 0000000..46e3d74
--- /dev/null
@@ -0,0 +1,389 @@
+#!/usr/bin/perl -w
+
+use strict;
+use RT::EmailParser;
+use RT::Tickets;
+use RT::Action::SendEmail;
+
+my @_outgoing_messages;
+my @scrips_fired;
+
+#We're not testing acls here.
+my $everyone = RT::Group->new($RT::SystemUser);
+$everyone->LoadSystemInternalGroup('Everyone');
+$everyone->PrincipalObj->GrantRight(Right =>'SuperUser');
+
+
+is (__PACKAGE__, 'main', "We're operating in the main package");
+
+
+{
+no warnings qw/redefine/;
+sub RT::Action::SendEmail::SendMessage {
+        my $self = shift;
+        my $MIME = shift;
+
+        main::_fired_scrip($self->ScripObj);
+        main::ok(ref($MIME) eq 'MIME::Entity', "hey, look. it's a mime entity");
+}
+
+}
+
+# instrument SendEmail to pass us what it's about to send.
+# create a regular ticket
+
+my $parser = RT::EmailParser->new();
+$parser->ParseMIMEEntityFromScalar('From: root@localhost
+To: rt@example.com
+Subject: This is a test of new ticket creation as an unknown user
+
+Blah!
+Foob!');
+
+                                  
+use Data::Dumper;
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+my ($id,  $tid, $msg ) = $ticket->Create(Requestor => ['root@localhost'], Queue => 'general', Subject => 'I18NTest', MIMEObj => $parser->Entity);
+ok ($id,$msg);
+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->Subject eq 'I18NTest', "failed to create the new ticket from an unprivileged account");
+
+# make sure it fires scrips.
+is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation");
+# make sure it sends an autoreply
+# make sure it sends a notification to adminccs
+
+
+# we need to swap out SendMessage to test the new things we care about;
+&utf8_redef_sendmessage;
+
+# 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";
+
+
+
+$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 $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 =~ /H\x{e5}vard/, "It's signed by havard. yay");
+
+
+# make sure it fires scrips.
+is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation");
+# make sure it sends an autoreply
+
+
+# make sure it sends a notification to adminccs
+
+# If we correspond, does it do the right thing to the outbound messages?
+
+$parser->ParseMIMEEntityFromScalar($content);
+my ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity);
+ok ($id, $msg);
+
+$parser->ParseMIMEEntityFromScalar($content);
+($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity);
+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";
+# be as much like the mail gateway as possible.
+use RT::Interface::Email;
+                                  
+ RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond');
+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 =~ /H\x{e5}vard/, "It's signed by havard. yay");
+
+
+# make sure it fires scrips.
+is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation");
+# make sure it sends an autoreply
+
+
+# make sure it sends a notification to adminccs
+
+
+# If we correspond, does it do the right thing to the outbound messages?
+
+$parser->ParseMIMEEntityFromScalar($content);
+my ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity);
+ok ($id, $msg);
+
+$parser->ParseMIMEEntityFromScalar($content);
+($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity);
+ok ($id, $msg);
+
+
+sub _fired_scrip {
+        my $scrip = shift;
+        push @scrips_fired, $scrip;
+}       
+
+sub utf8_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval ' 
+    sub RT::Action::SendEmail::SendMessage {
+        my $self = shift;
+        my $MIME = shift;
+
+        my $scrip = $self->ScripObj->id;
+        ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name);
+        main::_fired_scrip($self->ScripObj);
+        $MIME->make_singlepart;
+        main::ok( ref($MIME) eq \'MIME::Entity\',
+                  "hey, look. it\'s a mime entity" );
+        main::ok( ref( $MIME->head ) eq \'MIME::Head\',
+                  "its mime header is a mime header. yay" );
+        main::ok( $MIME->head->get(\'Content-Type\') =~ /utf-8/,
+                  "Its content type is utf-8" );
+        my $message_as_string = $MIME->bodyhandle->as_string();
+        use Encode;
+        $message_as_string = Encode::decode_utf8($message_as_string);
+        main::ok(
+            $message_as_string =~ /H\x{e5}vard/,
+"The message\'s content contains havard\'s name. this will fail if it\'s not utf8 out");
+
+    }';
+}
+
+sub iso8859_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval ' 
+    sub RT::Action::SendEmail::SendMessage {
+        my $self = shift;
+        my $MIME = shift;
+
+        my $scrip = $self->ScripObj->id;
+        ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name);
+        main::_fired_scrip($self->ScripObj);
+        $MIME->make_singlepart;
+        main::ok( ref($MIME) eq \'MIME::Entity\',
+                  "hey, look. it\'s a mime entity" );
+        main::ok( ref( $MIME->head ) eq \'MIME::Head\',
+                  "its mime header is a mime header. yay" );
+        main::ok( $MIME->head->get(\'Content-Type\') =~ /iso-8859-1/,
+                  "Its content type is iso-8859-1 - " . $MIME->head->get("Content-Type") );
+        my $message_as_string = $MIME->bodyhandle->as_string();
+        use Encode;
+        $message_as_string = Encode::decode("iso-8859-1",$message_as_string);
+        main::ok(
+            $message_as_string =~ /H\x{e5}vard/, "The message\'s content contains havard\'s name. this will fail if it\'s not utf8 out");
+
+    }';
+}
+
+# {{{ 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";
+
+$parser->ParseMIMEEntityFromScalar($content);
+
+
+# be as much like the mail gateway as possible.
+&umlauts_redef_sendmessage;
+
+RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond');
+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 =~ /causes Error/, "We recorded the content right as text-plain");
+is ($tick->Transactions->First->Attachments->Count , 3 , "Has three attachments, presumably a text-plain, a text-html and a multipart alternative");
+
+sub umlauts_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::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";
+
+$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 $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->Attachments->First->Content =~ /causes Error/, "We recorded the content as containing 'causes error'");
+ok ($tick->Transactions->First->Attachments->First->ContentType =~ /text\/html/, "We recorded the content as text/html");
+ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-html and a multipart alternative");
+
+sub text_html_umlauts_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                use Data::Dumper;
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                ok (is $MIME->parts, 2, "generated correspondence mime entityis composed of three parts");
+                is ($MIME->head->mime_type , "multipart/mixed", "The first part is a multipart mixed". $MIME->head->mime_type);
+                is ($MIME->parts(0)->head->mime_type , "text/plain", "The second part is a plain");
+                is ($MIME->parts(1)->head->mime_type , "text/html", "The third part is an html ");
+                 }';
+}
+
+# }}}
+
+# {{{ test a text-html message with russian characters
+
+my $content =  `cat ./lib/t/data/text-html-in-russian` || die "couldn't find new content";
+
+$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 $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->Attachments->First->ContentType =~ /text\/html/, "We recorded the content right as text-html");
+ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-html and a multipart alternative");
+
+sub text_html_russian_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                use Data::Dumper;
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                ok (is $MIME->parts, 2, "generated correspondence mime entityis composed of three parts");
+                is ($MIME->head->mime_type , "multipart/mixed", "The first part is a multipart mixed". $MIME->head->mime_type);
+                is ($MIME->parts(0)->head->mime_type , "text/plain", "The second part is a plain");
+                is ($MIME->parts(1)->head->mime_type , "text/html", "The third part is an html ");
+                my $content_1251;
+                $content_1251 = $MIME->parts(1)->bodyhandle->as_string();
+                ok ($content_1251 =~ qr{Ó÷eáíûé Öeíòp "ÊÀÄÐÛ ÄÅËÎÂÎÃΠÌÈÐÀ" ïpèãëaøaeò ía òpeíèíã:},
+"Content matches drugim in codepage 1251" );
+                 }';
+}
+
+# }}}
+
+# {{{ test a message containing a russian subject and NO content type
+
+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";
+
+$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 $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->Attachments->First->ContentType =~ /text\/plain/, "We recorded the content type right");
+ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-plain");
+is ($tick->Subject, "\x{442}\x{435}\x{441}\x{442} \x{442}\x{435}\x{441}\x{442}", "Recorded the subject right");
+sub text_plain_russian_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                is ($MIME->head->mime_type , "text/plain", "The only part is text/plain ");
+                 my $subject  = $MIME->head->get("subject");
+                chomp($subject);
+                #is( $subject ,      /^=\?KOI8-R\?B\?W2V4YW1wbGUuY39tICM3XSDUxdPUINTF09Q=\?=/ , "The $subject is encoded correctly");
+               };
+                 ';
+}
+
+shift @RT::EmailInputEncodings;
+$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";
+ok ($content, "Loaded nested-rfc-822 to test");
+
+$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 $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);
+is ($tick->Subject, "[Jonas Liljegren] Re: [Para] Niv\x{e5}er?");
+ok ($tick->Transactions->First->Attachments->First->ContentType =~ /multipart\/mixed/, "We recorded the content type right");
+is ($tick->Transactions->First->Attachments->Count , 5 , "Has one attachment, presumably a text-plain and a message RFC 822 and another plain");
+sub text_plain_nested_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                is ($MIME->head->mime_type , "multipart/mixed", "It is a mixed multipart");
+                 my $subject  =  $MIME->head->get("subject");
+                 $subject  = MIME::Base64::decode_base64( $subject);
+                chomp($subject);
+               # TODO, why does this test fail
+                #ok($subject =~ qr{Niv\x{e5}er}, "The subject matches the word - $subject");
+               1;
+                 }';
+}
+
+# }}}
+
+
+
+
+# Don't taint the environment
+$everyone->PrincipalObj->RevokeRight(Right =>'SuperUser');
+1;
diff --git a/rt/lib/t/04_send_email.pl.in b/rt/lib/t/04_send_email.pl.in
new file mode 100644 (file)
index 0000000..e171cdc
--- /dev/null
@@ -0,0 +1,389 @@
+#!@PERL@ -w
+
+use strict;
+use RT::EmailParser;
+use RT::Tickets;
+use RT::Action::SendEmail;
+
+my @_outgoing_messages;
+my @scrips_fired;
+
+#We're not testing acls here.
+my $everyone = RT::Group->new($RT::SystemUser);
+$everyone->LoadSystemInternalGroup('Everyone');
+$everyone->PrincipalObj->GrantRight(Right =>'SuperUser');
+
+
+is (__PACKAGE__, 'main', "We're operating in the main package");
+
+
+{
+no warnings qw/redefine/;
+sub RT::Action::SendEmail::SendMessage {
+        my $self = shift;
+        my $MIME = shift;
+
+        main::_fired_scrip($self->ScripObj);
+        main::ok(ref($MIME) eq 'MIME::Entity', "hey, look. it's a mime entity");
+}
+
+}
+
+# instrument SendEmail to pass us what it's about to send.
+# create a regular ticket
+
+my $parser = RT::EmailParser->new();
+$parser->ParseMIMEEntityFromScalar('From: root@localhost
+To: rt@example.com
+Subject: This is a test of new ticket creation as an unknown user
+
+Blah!
+Foob!');
+
+                                  
+use Data::Dumper;
+
+my $ticket = RT::Ticket->new($RT::SystemUser);
+my ($id,  $tid, $msg ) = $ticket->Create(Requestor => ['root@localhost'], Queue => 'general', Subject => 'I18NTest', MIMEObj => $parser->Entity);
+ok ($id,$msg);
+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->Subject eq 'I18NTest', "failed to create the new ticket from an unprivileged account");
+
+# make sure it fires scrips.
+is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation");
+# make sure it sends an autoreply
+# make sure it sends a notification to adminccs
+
+
+# we need to swap out SendMessage to test the new things we care about;
+&utf8_redef_sendmessage;
+
+# 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";
+
+
+
+$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 $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 =~ /H\x{e5}vard/, "It's signed by havard. yay");
+
+
+# make sure it fires scrips.
+is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation");
+# make sure it sends an autoreply
+
+
+# make sure it sends a notification to adminccs
+
+# If we correspond, does it do the right thing to the outbound messages?
+
+$parser->ParseMIMEEntityFromScalar($content);
+my ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity);
+ok ($id, $msg);
+
+$parser->ParseMIMEEntityFromScalar($content);
+($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity);
+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";
+# be as much like the mail gateway as possible.
+use RT::Interface::Email;
+                                  
+ RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond');
+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 =~ /H\x{e5}vard/, "It's signed by havard. yay");
+
+
+# make sure it fires scrips.
+is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation");
+# make sure it sends an autoreply
+
+
+# make sure it sends a notification to adminccs
+
+
+# If we correspond, does it do the right thing to the outbound messages?
+
+$parser->ParseMIMEEntityFromScalar($content);
+my ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity);
+ok ($id, $msg);
+
+$parser->ParseMIMEEntityFromScalar($content);
+($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity);
+ok ($id, $msg);
+
+
+sub _fired_scrip {
+        my $scrip = shift;
+        push @scrips_fired, $scrip;
+}       
+
+sub utf8_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval ' 
+    sub RT::Action::SendEmail::SendMessage {
+        my $self = shift;
+        my $MIME = shift;
+
+        my $scrip = $self->ScripObj->id;
+        ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name);
+        main::_fired_scrip($self->ScripObj);
+        $MIME->make_singlepart;
+        main::ok( ref($MIME) eq \'MIME::Entity\',
+                  "hey, look. it\'s a mime entity" );
+        main::ok( ref( $MIME->head ) eq \'MIME::Head\',
+                  "its mime header is a mime header. yay" );
+        main::ok( $MIME->head->get(\'Content-Type\') =~ /utf-8/,
+                  "Its content type is utf-8" );
+        my $message_as_string = $MIME->bodyhandle->as_string();
+        use Encode;
+        $message_as_string = Encode::decode_utf8($message_as_string);
+        main::ok(
+            $message_as_string =~ /H\x{e5}vard/,
+"The message\'s content contains havard\'s name. this will fail if it\'s not utf8 out");
+
+    }';
+}
+
+sub iso8859_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval ' 
+    sub RT::Action::SendEmail::SendMessage {
+        my $self = shift;
+        my $MIME = shift;
+
+        my $scrip = $self->ScripObj->id;
+        ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name);
+        main::_fired_scrip($self->ScripObj);
+        $MIME->make_singlepart;
+        main::ok( ref($MIME) eq \'MIME::Entity\',
+                  "hey, look. it\'s a mime entity" );
+        main::ok( ref( $MIME->head ) eq \'MIME::Head\',
+                  "its mime header is a mime header. yay" );
+        main::ok( $MIME->head->get(\'Content-Type\') =~ /iso-8859-1/,
+                  "Its content type is iso-8859-1 - " . $MIME->head->get("Content-Type") );
+        my $message_as_string = $MIME->bodyhandle->as_string();
+        use Encode;
+        $message_as_string = Encode::decode("iso-8859-1",$message_as_string);
+        main::ok(
+            $message_as_string =~ /H\x{e5}vard/, "The message\'s content contains havard\'s name. this will fail if it\'s not utf8 out");
+
+    }';
+}
+
+# {{{ 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";
+
+$parser->ParseMIMEEntityFromScalar($content);
+
+
+# be as much like the mail gateway as possible.
+&umlauts_redef_sendmessage;
+
+RT::Interface::Email::Gateway(message => $content, queue => 1, action => 'correspond');
+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 =~ /causes Error/, "We recorded the content right as text-plain");
+is ($tick->Transactions->First->Attachments->Count , 3 , "Has three attachments, presumably a text-plain, a text-html and a multipart alternative");
+
+sub umlauts_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::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";
+
+$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 $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->Attachments->First->Content =~ /causes Error/, "We recorded the content as containing 'causes error'");
+ok ($tick->Transactions->First->Attachments->First->ContentType =~ /text\/html/, "We recorded the content as text/html");
+ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-html and a multipart alternative");
+
+sub text_html_umlauts_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                use Data::Dumper;
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                ok (is $MIME->parts, 2, "generated correspondence mime entityis composed of three parts");
+                is ($MIME->head->mime_type , "multipart/mixed", "The first part is a multipart mixed". $MIME->head->mime_type);
+                is ($MIME->parts(0)->head->mime_type , "text/plain", "The second part is a plain");
+                is ($MIME->parts(1)->head->mime_type , "text/html", "The third part is an html ");
+                 }';
+}
+
+# }}}
+
+# {{{ test a text-html message with russian characters
+
+my $content =  `cat ./lib/t/data/text-html-in-russian` || die "couldn't find new content";
+
+$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 $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->Attachments->First->ContentType =~ /text\/html/, "We recorded the content right as text-html");
+ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-html and a multipart alternative");
+
+sub text_html_russian_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                use Data::Dumper;
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                ok (is $MIME->parts, 2, "generated correspondence mime entityis composed of three parts");
+                is ($MIME->head->mime_type , "multipart/mixed", "The first part is a multipart mixed". $MIME->head->mime_type);
+                is ($MIME->parts(0)->head->mime_type , "text/plain", "The second part is a plain");
+                is ($MIME->parts(1)->head->mime_type , "text/html", "The third part is an html ");
+                my $content_1251;
+                $content_1251 = $MIME->parts(1)->bodyhandle->as_string();
+                ok ($content_1251 =~ qr{Ó÷eáíûé Öeíòp "ÊÀÄÐÛ ÄÅËÎÂÎÃΠÌÈÐÀ" ïpèãëaøaeò ía òpeíèíã:},
+"Content matches drugim in codepage 1251" );
+                 }';
+}
+
+# }}}
+
+# {{{ test a message containing a russian subject and NO content type
+
+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";
+
+$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 $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->Attachments->First->ContentType =~ /text\/plain/, "We recorded the content type right");
+ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-plain");
+is ($tick->Subject, "\x{442}\x{435}\x{441}\x{442} \x{442}\x{435}\x{441}\x{442}", "Recorded the subject right");
+sub text_plain_russian_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                is ($MIME->head->mime_type , "text/plain", "The only part is text/plain ");
+                 my $subject  = $MIME->head->get("subject");
+                chomp($subject);
+                #is( $subject ,      /^=\?KOI8-R\?B\?W2V4YW1wbGUuY39tICM3XSDUxdPUINTF09Q=\?=/ , "The $subject is encoded correctly");
+               };
+                 ';
+}
+
+shift @RT::EmailInputEncodings;
+$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";
+ok ($content, "Loaded nested-rfc-822 to test");
+
+$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 $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);
+is ($tick->Subject, "[Jonas Liljegren] Re: [Para] Niv\x{e5}er?");
+ok ($tick->Transactions->First->Attachments->First->ContentType =~ /multipart\/mixed/, "We recorded the content type right");
+is ($tick->Transactions->First->Attachments->Count , 5 , "Has one attachment, presumably a text-plain and a message RFC 822 and another plain");
+sub text_plain_nested_redef_sendmessage {
+    no warnings qw/redefine/;
+    eval 'sub RT::Action::SendEmail::SendMessage { 
+                my $self = shift; 
+                my $MIME = shift; 
+                return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" );
+                is ($MIME->head->mime_type , "multipart/mixed", "It is a mixed multipart");
+                 my $subject  =  $MIME->head->get("subject");
+                 $subject  = MIME::Base64::decode_base64( $subject);
+                chomp($subject);
+               # TODO, why does this test fail
+                #ok($subject =~ qr{Niv\x{e5}er}, "The subject matches the word - $subject");
+               1;
+                 }';
+}
+
+# }}}
+
+
+
+
+# Don't taint the environment
+$everyone->PrincipalObj->RevokeRight(Right =>'SuperUser');
+1;
diff --git a/rt/lib/t/data/8859-15-message-series/dir b/rt/lib/t/data/8859-15-message-series/dir
new file mode 100644 (file)
index 0000000..b9f8ec3
--- /dev/null
@@ -0,0 +1,356 @@
+Return-Path: <rt-users-admin@lists.fsck.com>
+Delivered-To: j@pallas.eruditorum.org
+Received: from pallas.eruditorum.org (localhost [127.0.0.1])
+       by pallas.eruditorum.org (Postfix) with ESMTP
+       id 72E3A111B3; Mon, 26 May 2003 14:50:14 -0400 (EDT)
+Delivered-To: rt-users@pallas.eruditorum.org
+Received: from mail-in-02.arcor-online.net (mail-in-02.arcor-online.net [151.189.21.42])
+       by pallas.eruditorum.org (Postfix) with ESMTP id 15E761118D
+       for <rt-users@lists.fsck.com>; Mon, 26 May 2003 14:49:56 -0400 (EDT)
+Received: from otdial-212-144-012-186.arcor-ip.net (otdial-212-144-011-024.arcor-ip.net [212.144.11.24])
+       by mail-in-02.arcor-online.net (Postfix) with ESMTP
+       id 745EE15E87; Mon, 26 May 2003 20:53:15 +0200 (CEST)
+From: Dirk Pape <pape-rt@inf.fu-berlin.de>
+To: Jesse Vincent <jesse@bestpractical.com>,
+       rt-users <rt-users@lists.fsck.com>
+Subject: Re: [rt-users] [rt-announce] Development Snapshot 3.0.2++
+Message-ID: <2147483647.1053982235@otdial-212-144-011-024.arcor-ip.net>
+In-Reply-To: <2147483647.1053974498@[10.0.255.35]>
+References: <20030523202405.GF23719@fsck.com>
+ <2147483647.1053974498@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="==========2147500486=========="
+Sender: rt-users-admin@lists.fsck.com
+Errors-To: rt-users-admin@lists.fsck.com
+X-BeenThere: rt-users@lists.fsck.com
+X-Mailman-Version: 2.0.12
+Precedence: bulk
+List-Help: <mailto:rt-users-request@lists.fsck.com?subject=help>
+List-Post: <mailto:rt-users@lists.fsck.com>
+List-Subscribe: <http://lists.fsck.com/mailman/listinfo/rt-users>,
+       <mailto:rt-users-request@lists.fsck.com?subject=subscribe>
+List-Id: For users of RT: Request Tracker <rt-users.lists.fsck.com>
+List-Unsubscribe: <http://lists.fsck.com/mailman/listinfo/rt-users>,
+       <mailto:rt-users-request@lists.fsck.com?subject=unsubscribe>
+List-Archive: <http://lists.fsck.com/pipermail/rt-users/>
+Date: Mon, 26 May 2003 20:50:36 +0200
+X-Spam-Status: No, hits=-2.5 required=5.0
+       tests=AWL,IN_REP_TO,KNOWN_MAILING_LIST,QUOTED_EMAIL_TEXT,
+             REFERENCES,REPLY_WITH_QUOTES
+       autolearn=ham version=2.55
+X-Spam-Level: 
+X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp)
+
+--==========2147500486==========
+Content-Type: text/plain; charset=us-ascii; format=flowed
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+
+Hello,
+
+here is the digest I forgot to attach. And I also forgot to say, that these 
+were the only messages after a restart of apache.
+
+The messages in the digest are the copies which I - for testing purpose - 
+allways queue into a mailbox just befor it is queued via rt-mailgate into 
+the rt-system.
+
+--Am Montag, 26. Mai 2003 18:41 Uhr +0200 schrieb Dirk Pape 
+<pape-rt@inf.fu-berlin.de>:
+
+> I attach a digest with mails I send one after another to the rt-system
+> and they get queued into one queue, each as a new ticket.
+
+
+
+
+--==========2147500486==========
+Content-Type: multipart/digest; boundary="==========2147489407=========="
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 27591 invoked by uid 9804); 26 May 2003 18:10:50 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:10:46 +0200
+Received: (Qmail 27575 invoked from network); 26 May 2003 18:10:46 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:10:46 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKYe-0000Yi-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:10:44 +0200
+Received: (qmail 27557 invoked by uid 9804); 26 May 2003 18:10:44 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:10:40 +0200
+Received: (Qmail 27540 invoked from network); 26 May 2003 18:10:40 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:10:40 +0200
+Date: Mon, 26 May 2003 18:11:00 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972660@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [27578] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 27754 invoked by uid 9804); 26 May 2003 18:11:24 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:20 +0200
+Received: (Qmail 27704 invoked from network); 26 May 2003 18:11:19 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:19 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKZA-0000Yy-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:11:16 +0200
+Received: (qmail 27690 invoked by uid 9804); 26 May 2003 18:11:16 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:13 +0200
+Received: (Qmail 27677 invoked from network); 26 May 2003 18:11:13 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:13 +0200
+Date: Mon, 26 May 2003 18:11:32 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972692@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [27711] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 27971 invoked by uid 9804); 26 May 2003 18:12:02 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:52 +0200
+Received: (Qmail 27908 invoked from network); 26 May 2003 18:11:52 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:52 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKZj-0000ZC-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:11:51 +0200
+Received: (qmail 27848 invoked by uid 9804); 26 May 2003 18:11:50 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:46 +0200
+Received: (Qmail 27809 invoked from network); 26 May 2003 18:11:45 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:45 +0200
+Date: Mon, 26 May 2003 18:12:05 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972725@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [27911] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 28283 invoked by uid 9804); 26 May 2003 18:12:39 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:12:36 +0200
+Received: (Qmail 28256 invoked from network); 26 May 2003 18:12:35 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:12:35 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKaQ-0000ZQ-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:12:34 +0200
+Received: (qmail 28236 invoked by uid 9804); 26 May 2003 18:12:34 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:12:30 +0200
+Received: (Qmail 28224 invoked from network); 26 May 2003 18:12:30 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:12:30 +0200
+Date: Mon, 26 May 2003 18:12:50 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972770@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [28259] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 28578 invoked by uid 9804); 26 May 2003 18:13:20 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:13:15 +0200
+Received: (Qmail 28534 invoked from network); 26 May 2003 18:13:14 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:13:14 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKb1-0000Ze-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:13:11 +0200
+Received: (qmail 28516 invoked by uid 9804); 26 May 2003 18:13:11 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:13:08 +0200
+Received: (Qmail 28479 invoked from network); 26 May 2003 18:13:07 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:13:07 +0200
+Date: Mon, 26 May 2003 18:13:27 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972807@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [28540] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 29108 invoked by uid 9804); 26 May 2003 18:14:15 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:14:10 +0200
+Received: (Qmail 29066 invoked from network); 26 May 2003 18:14:10 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:14:10 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKbw-0000Zr-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:14:08 +0200
+Received: (qmail 29054 invoked by uid 9804); 26 May 2003 18:14:08 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:14:04 +0200
+Received: (Qmail 29036 invoked from network); 26 May 2003 18:14:04 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:14:04 +0200
+Date: Mon, 26 May 2003 18:14:24 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972864@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [29069] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+--==========2147489407==========
+Content-Type: message/rfc822; name="test _________"
+
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 29551 invoked by uid 9804); 26 May 2003 18:15:16 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:15:12 +0200
+Received: (Qmail 29521 invoked from network); 26 May 2003 18:15:12 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:15:12 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKcx-0000a4-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:15:11 +0200
+Received: (qmail 29511 invoked by uid 9804); 26 May 2003 18:15:10 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:15:07 +0200
+Received: (Qmail 29465 invoked from network); 26 May 2003 18:15:06 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:15:06 +0200
+Date: Mon, 26 May 2003 18:15:26 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972926@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [29524] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
+
+--==========2147489407==========--
+
+--==========2147500486==========--
+
+_______________________________________________
+rt-users mailing list
+rt-users@lists.fsck.com
+http://lists.fsck.com/mailman/listinfo/rt-users
+
+Have you read the FAQ? The RT FAQ Manager lives at http://fsck.com/rtfm
+
diff --git a/rt/lib/t/data/8859-15-message-series/msg1 b/rt/lib/t/data/8859-15-message-series/msg1
new file mode 100644 (file)
index 0000000..cc99c40
--- /dev/null
@@ -0,0 +1,36 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 27591 invoked by uid 9804); 26 May 2003 18:10:50 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:10:46 +0200
+Received: (Qmail 27575 invoked from network); 26 May 2003 18:10:46 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:10:46 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKYe-0000Yi-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:10:44 +0200
+Received: (qmail 27557 invoked by uid 9804); 26 May 2003 18:10:44 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:10:40 +0200
+Received: (Qmail 27540 invoked from network); 26 May 2003 18:10:40 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:10:40 +0200
+Date: Mon, 26 May 2003 18:11:00 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972660@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [27578] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
diff --git a/rt/lib/t/data/8859-15-message-series/msg2 b/rt/lib/t/data/8859-15-message-series/msg2
new file mode 100644 (file)
index 0000000..dc442cf
--- /dev/null
@@ -0,0 +1,36 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 27754 invoked by uid 9804); 26 May 2003 18:11:24 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:20 +0200
+Received: (Qmail 27704 invoked from network); 26 May 2003 18:11:19 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:19 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKZA-0000Yy-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:11:16 +0200
+Received: (qmail 27690 invoked by uid 9804); 26 May 2003 18:11:16 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:13 +0200
+Received: (Qmail 27677 invoked from network); 26 May 2003 18:11:13 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:13 +0200
+Date: Mon, 26 May 2003 18:11:32 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972692@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [27711] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
diff --git a/rt/lib/t/data/8859-15-message-series/msg3 b/rt/lib/t/data/8859-15-message-series/msg3
new file mode 100644 (file)
index 0000000..e23866d
--- /dev/null
@@ -0,0 +1,35 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 27971 invoked by uid 9804); 26 May 2003 18:12:02 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:52 +0200
+Received: (Qmail 27908 invoked from network); 26 May 2003 18:11:52 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:52 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKZj-0000ZC-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:11:51 +0200
+Received: (qmail 27848 invoked by uid 9804); 26 May 2003 18:11:50 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:11:46 +0200
+Received: (Qmail 27809 invoked from network); 26 May 2003 18:11:45 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:11:45 +0200
+Date: Mon, 26 May 2003 18:12:05 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972725@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [27911] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
diff --git a/rt/lib/t/data/8859-15-message-series/msg4 b/rt/lib/t/data/8859-15-message-series/msg4
new file mode 100644 (file)
index 0000000..831695c
--- /dev/null
@@ -0,0 +1,35 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 28283 invoked by uid 9804); 26 May 2003 18:12:39 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:12:36 +0200
+Received: (Qmail 28256 invoked from network); 26 May 2003 18:12:35 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:12:35 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKaQ-0000ZQ-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:12:34 +0200
+Received: (qmail 28236 invoked by uid 9804); 26 May 2003 18:12:34 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:12:30 +0200
+Received: (Qmail 28224 invoked from network); 26 May 2003 18:12:30 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:12:30 +0200
+Date: Mon, 26 May 2003 18:12:50 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972770@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [28259] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
diff --git a/rt/lib/t/data/8859-15-message-series/msg5 b/rt/lib/t/data/8859-15-message-series/msg5
new file mode 100644 (file)
index 0000000..272c93c
--- /dev/null
@@ -0,0 +1,35 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 28578 invoked by uid 9804); 26 May 2003 18:13:20 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:13:15 +0200
+Received: (Qmail 28534 invoked from network); 26 May 2003 18:13:14 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:13:14 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKb1-0000Ze-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:13:11 +0200
+Received: (qmail 28516 invoked by uid 9804); 26 May 2003 18:13:11 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:13:08 +0200
+Received: (Qmail 28479 invoked from network); 26 May 2003 18:13:07 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:13:07 +0200
+Date: Mon, 26 May 2003 18:13:27 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972807@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [28540] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
diff --git a/rt/lib/t/data/8859-15-message-series/msg6 b/rt/lib/t/data/8859-15-message-series/msg6
new file mode 100644 (file)
index 0000000..3ae9d3b
--- /dev/null
@@ -0,0 +1,35 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 29108 invoked by uid 9804); 26 May 2003 18:14:15 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:14:10 +0200
+Received: (Qmail 29066 invoked from network); 26 May 2003 18:14:10 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:14:10 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKbw-0000Zr-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:14:08 +0200
+Received: (qmail 29054 invoked by uid 9804); 26 May 2003 18:14:08 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:14:04 +0200
+Received: (Qmail 29036 invoked from network); 26 May 2003 18:14:04 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:14:04 +0200
+Date: Mon, 26 May 2003 18:14:24 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972864@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [29069] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
diff --git a/rt/lib/t/data/8859-15-message-series/msg7 b/rt/lib/t/data/8859-15-message-series/msg7
new file mode 100644 (file)
index 0000000..6149dd6
--- /dev/null
@@ -0,0 +1,36 @@
+Return-Path: <pape@inf.fu-berlin.de>
+Delivered-To: pape-rtdoublecheck@mi.fu-berlin.de
+Received: (qmail 29551 invoked by uid 9804); 26 May 2003 18:15:16 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:15:12 +0200
+Received: (Qmail 29521 invoked from network); 26 May 2003 18:15:12 +0200
+Received: From es.inf.fu-berlin.de (160.45.110.22)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:15:12 +0200
+Received: from leibniz ([160.45.40.10] helo=math.fu-berlin.de)
+       by es.inf.fu-berlin.de with smtp (Exim 3.35 #1 (Debian))
+       id 19KKcx-0000a4-00
+       for <staff@tec.mi.fu-berlin.de>; Mon, 26 May 2003 18:15:11 +0200
+Received: (qmail 29511 invoked by uid 9804); 26 May 2003 18:15:10 +0200
+Received: from localhost (HELO math.fu-berlin.de) (127.0.0.1)
+  by localhost with SMTP; 26 May 2003 18:15:07 +0200
+Received: (Qmail 29465 invoked from network); 26 May 2003 18:15:06 +0200
+Received: From eremix.inf.fu-berlin.de (HELO eremix) (160.45.113.36)
+  by leibniz.math.fu-berlin.de with SMTP; 26 May 2003 18:15:06 +0200
+Date: Mon, 26 May 2003 18:15:26 +0200
+From: Dirk Pape <pape@inf.fu-berlin.de>
+To: staff@tec.mi.fu-berlin.de
+Subject: =?ISO-8859-15?Q?test_=E4=F6=FC=DF=C4=D6=DC=DF=A4?=
+Message-ID: <2147483647.1053972926@[10.0.255.35]>
+X-Mailer: Mulberry/3.0.3 (Mac OS X)
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Envelope-Sender: pape@inf.fu-berlin.de
+X-Virus-Scanned: by AMaViS 0.3.12pre7-U23 [29524] (NAI-uvscan@math.fu-berlin.de)
+X-Remote-IP: 160.45.110.22
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-15; FORMAT=flowed
+Content-Transfer-Encoding: quoted-printable
+Content-Disposition: inline
+
+test nochmal in anderer Queue
+test =E4=F6=FC=DF=C4=D6=DC=DF=A4
+
diff --git a/rt/lib/t/data/multipart-alternative-with-umlaut b/rt/lib/t/data/multipart-alternative-with-umlaut
new file mode 100644 (file)
index 0000000..1ad4fe3
--- /dev/null
@@ -0,0 +1,62 @@
+Return-Path: <gst@example.com>
+Delivered-To: j@pallas.eruditorum.org
+Received: from vis.example.com (vis.example.com [212.68.68.251])
+       by pallas.eruditorum.org (Postfix) with SMTP id 59236111C3
+       for <jesse@example.com>; Thu, 12 Jun 2003 02:14:44 -0400 (EDT)
+Received: (qmail 29541 invoked by uid 502); 12 Jun 2003 06:14:42 -0000
+Received: from sivd.example.com (HELO example.com) (192.168.42.1)
+  by 192.168.42.42 with SMTP; 12 Jun 2003 06:14:42 -0000
+Received: received from 172.20.72.174 by odie.example.com; Thu, 12 Jun 2003 08:14:27 +0200
+Received: by mailserver.example.com with Internet Mail Service (5.5.2653.19) id <LJSB7T54>; Thu, 12 Jun 2003 08:14:39 +0200
+Message-ID: <50362EC956CBD411A339009027F6257E013DD495@mailserver.example.com>
+Date: Thu, 12 Jun 2003 08:14:39 +0200
+From: "Stever, Gregor" <gst@example.com>
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+To: "'jesse@example.com'" <jesse@example.com>
+Subject: RE: [rt-users] HTML-encoded mails with umlaute
+Date: Thu, 12 Jun 2003 08:14:39 +0200
+Content-Type: multipart/alternative;
+       boundary="----_=_NextPart_001_01C330A9.E7BDD590"
+X-Spam-Status: No, hits=0.0 required=5.0
+       tests=AWL,HTML_50_60,HTML_MESSAGE,INVALID_DATE
+       version=2.55
+X-Spam-Level: 
+X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp)
+
+------_=_NextPart_001_01C330A9.E7BDD590
+Content-Type: text/plain;
+       charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+
+Hello,
+
+ist this kind of Messages, that causes rt to crash.=20
+
+Mit freundlichen Gr=FC=DFen
+Gregor Stever      ^^causes Error!!
+
+
+------_=_NextPart_001_01C330A9.E7BDD590
+Content-Type: text/html;
+       charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML><HEAD>
+<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; charset=3Diso-8859-=
+1">
+
+
+<META content=3D"MSHTML 6.00.2800.1170" name=3DGENERATOR></HEAD>
+<BODY>
+<DIV><FONT face=3DArial><FONT size=3D2>Hello,<BR><BR>ist this kind of Messa=
+ges, that=20
+causes rt to crash.<BR><BR>Mit freundlichen Gr=FC=DFen<BR>Gregor=20
+Stever&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^^causes Error<SPAN=20
+class=3D975501206-12062003>!!</SPAN></FONT></FONT></DIV></BODY></HTML>
+
+
+------_=_NextPart_001_01C330A9.E7BDD590--
+
+
diff --git a/rt/lib/t/data/nested-mime-sample b/rt/lib/t/data/nested-mime-sample
new file mode 100644 (file)
index 0000000..8b85d94
--- /dev/null
@@ -0,0 +1,396 @@
+Return-Path: <Xxxxxx_Yyyyyyy@some.net>
+Delivered-To: jesse@pallas.eruditorum.org
+Received: by pallas.eruditorum.org (Postfix)
+       id B5D3E1123A; Fri, 12 Jul 2002 11:35:27 -0400 (EDT)
+Delivered-To: rt-2.0-bugs@pallas.eruditorum.org
+Received: from postman.some.net (postman.some.net [193.0.0.199])
+       by pallas.eruditorum.org (Postfix) with SMTP id 2736011234
+       for <rt-2.0-bugs@fsck.com>; Fri, 12 Jul 2002 11:35:27 -0400 (EDT)
+Received: (qmail 11615 invoked by uid 0); 12 Jul 2002 15:35:26 -0000
+Received: from x22.some.net (HELO x22.some.net.some.net) (193.0.1.22)
+  by postman.some.net with SMTP; 12 Jul 2002 15:35:26 -0000
+Date: Fri, 12 Jul 2002 17:35:26 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+To: rt-0.0-bugs@fsck.com
+Subject: Example MIME within MIME within MIME message
+Message-ID: <Pine.LNX.4.44.0207121734250.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-192303556-1026488126=:25020"
+X-Spam-Status: No, hits=4.0 required=7.0
+       tests=DOUBLE_CAPSWORD,MIME_NULL_BLOCK,MIME_MISSING_BOUNDARY
+       version=2.31
+Content-Length: 11478
+
+  This message is in MIME format.  The first part should be readable text,
+  while the remaining parts are likely unreadable without MIME-aware tools.
+  Send mail to mime@docserver.cac.washington.edu for more info.
+
+--12654081-192303556-1026488126=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+MIME is fun at times.
+
+
+-- 
+                             Xxxxxx Yyyyyyy                            SOME
+                   Systems/Network Engineer                             NCC
+                 www.some.net - PGP000C8B1B             Operations/Security
+
+--12654081-192303556-1026488126=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-2102091261-1026488126=:25020"
+Content-ID: <Pine.LNX.4.44.0207121734322.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+  This message is in MIME format.  The first part should be readable text,
+  while the remaining parts are likely unreadable without MIME-aware tools.
+  Send mail to mime@docserver.cac.washington.edu for more info.
+
+--12654081-2102091261-1026488126=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121734320.25020@x22.some.net>
+Content-Description: first outer message (fwd)
+
+Date: Fri, 12 Jul 2002 17:32:37 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: first outer message
+Message-ID: <Pine.LNX.4.44.0207121732180.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-113777422-1026487957=:25020"
+
+
+--12654081-113777422-1026487957=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+first outer message
+
+--12654081-113777422-1026487957=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-387266385-1026487957=:25020"
+Content-ID: <Pine.LNX.4.44.0207121732222.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+--12654081-387266385-1026487957=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121732220.25020@x22.some.net>
+Content-Description: middle message (fwd)
+
+Date: Fri, 12 Jul 2002 17:31:45 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: middle message
+Message-ID: <Pine.LNX.4.44.0207121731190.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-1711788944-1026487905=:25020"
+
+
+--12654081-1711788944-1026487905=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+This is the first middle message
+
+
+--12654081-1711788944-1026487905=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-1221085552-1026487905=:25020"
+Content-ID: <Pine.LNX.4.44.0207121731262.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+--12654081-1221085552-1026487905=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731260.25020@x22.some.net>
+Content-Description: This is the inner-most message (fwd)
+
+Date: Fri, 12 Jul 2002 17:30:31 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: This is the inner-most message
+Message-ID: <Pine.LNX.4.44.0207121730070.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+inner-msg
+
+
+
+--12654081-1221085552-1026487905=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731261.25020@x22.some.net>
+Content-Description: another inner message (need two before pine will do the mime-digest thing) (fwd)
+
+Date: Fri, 12 Jul 2002 17:31:12 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: another inner message (need two before pine will do the mime-digest
+ thing)
+Message-ID: <Pine.LNX.4.44.0207121730480.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+again
+
+
+
+--12654081-1221085552-1026487905=:25020--
+--12654081-1711788944-1026487905=:25020--
+
+--12654081-387266385-1026487957=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121732221.25020@x22.some.net>
+Content-Description: middle message (fwd)
+
+Date: Fri, 12 Jul 2002 17:32:05 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: middle message
+Message-ID: <Pine.LNX.4.44.0207121731470.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-1731270459-1026487925=:25020"
+
+
+--12654081-1731270459-1026487925=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+This is the second middle message
+
+
+--12654081-1731270459-1026487925=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-128832654-1026487925=:25020"
+Content-ID: <Pine.LNX.4.44.0207121731502.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+--12654081-128832654-1026487925=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731500.25020@x22.some.net>
+Content-Description: This is the inner-most message (fwd)
+
+Date: Fri, 12 Jul 2002 17:30:31 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: This is the inner-most message
+Message-ID: <Pine.LNX.4.44.0207121730070.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+inner-msg
+
+
+
+--12654081-128832654-1026487925=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731501.25020@x22.some.net>
+Content-Description: another inner message (need two before pine will do the mime-digest thing) (fwd)
+
+Date: Fri, 12 Jul 2002 17:31:12 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: another inner message (need two before pine will do the mime-digest
+ thing)
+Message-ID: <Pine.LNX.4.44.0207121730480.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+again
+
+
+
+--12654081-128832654-1026487925=:25020--
+--12654081-1731270459-1026487925=:25020--
+
+--12654081-387266385-1026487957=:25020--
+--12654081-113777422-1026487957=:25020--
+
+--12654081-2102091261-1026488126=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121734321.25020@x22.some.net>
+Content-Description: 2nd outer message (fwd)
+
+Date: Fri, 12 Jul 2002 17:32:54 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: 2nd outer message
+Message-ID: <Pine.LNX.4.44.0207121732380.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-1955637437-1026487974=:25020"
+
+
+--12654081-1955637437-1026487974=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+2nd outer message
+
+
+--12654081-1955637437-1026487974=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-362457126-1026487974=:25020"
+Content-ID: <Pine.LNX.4.44.0207121732412.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+--12654081-362457126-1026487974=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121732410.25020@x22.some.net>
+Content-Description: middle message (fwd)
+
+Date: Fri, 12 Jul 2002 17:31:45 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: middle message
+Message-ID: <Pine.LNX.4.44.0207121731190.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-1711788944-1026487905=:25020"
+
+
+--12654081-1711788944-1026487905=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+This is the first middle message
+
+
+--12654081-1711788944-1026487905=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-1221085552-1026487905=:25020"
+Content-ID: <Pine.LNX.4.44.0207121731262.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+--12654081-1221085552-1026487905=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731260.25020@x22.some.net>
+Content-Description: This is the inner-most message (fwd)
+
+Date: Fri, 12 Jul 2002 17:30:31 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: This is the inner-most message
+Message-ID: <Pine.LNX.4.44.0207121730070.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+inner-msg
+
+
+
+--12654081-1221085552-1026487905=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731261.25020@x22.some.net>
+Content-Description: another inner message (need two before pine will do the mime-digest thing) (fwd)
+
+Date: Fri, 12 Jul 2002 17:31:12 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: another inner message (need two before pine will do the mime-digest
+ thing)
+Message-ID: <Pine.LNX.4.44.0207121730480.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+again
+
+
+
+--12654081-1221085552-1026487905=:25020--
+--12654081-1711788944-1026487905=:25020--
+
+--12654081-362457126-1026487974=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121732411.25020@x22.some.net>
+Content-Description: middle message (fwd)
+
+Date: Fri, 12 Jul 2002 17:32:05 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: middle message
+Message-ID: <Pine.LNX.4.44.0207121731470.25020-120000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: MULTIPART/MIXED; BOUNDARY="12654081-1731270459-1026487925=:25020"
+
+
+--12654081-1731270459-1026487925=:25020
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+This is the second middle message
+
+
+--12654081-1731270459-1026487925=:25020
+Content-Type: MULTIPART/Digest; BOUNDARY="12654081-128832654-1026487925=:25020"
+Content-ID: <Pine.LNX.4.44.0207121731502.25020@x22.some.net>
+Content-Description: Digest of 2 messages
+
+--12654081-128832654-1026487925=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731500.25020@x22.some.net>
+Content-Description: This is the inner-most message (fwd)
+
+Date: Fri, 12 Jul 2002 17:30:31 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: This is the inner-most message
+Message-ID: <Pine.LNX.4.44.0207121730070.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+inner-msg
+
+
+
+--12654081-128832654-1026487925=:25020
+Content-Type: MESSAGE/RFC822; CHARSET=US-ASCII
+Content-ID: <Pine.LNX.4.44.0207121731501.25020@x22.some.net>
+Content-Description: another inner message (need two before pine will do the mime-digest thing) (fwd)
+
+Date: Fri, 12 Jul 2002 17:31:12 +0200 (CEST)
+From: Xxxxxx Yyyyyyy <Xxxxxx_Yyyyyyy@some.net>
+X-X-Sender: bc@x22.some.net
+To: Xxxxxx_Yyyyyyy@some.net
+Subject: another inner message (need two before pine will do the mime-digest
+ thing)
+Message-ID: <Pine.LNX.4.44.0207121730480.25020-100000@x22.some.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+
+
+
+again
+
+
+
+--12654081-128832654-1026487925=:25020--
+--12654081-1731270459-1026487925=:25020--
+
+--12654081-362457126-1026487974=:25020--
+--12654081-1955637437-1026487974=:25020--
+
+--12654081-2102091261-1026488126=:25020--
+--12654081-192303556-1026488126=:25020--
+
diff --git a/rt/lib/t/data/nested-rfc-822 b/rt/lib/t/data/nested-rfc-822
new file mode 100644 (file)
index 0000000..d4f118d
--- /dev/null
@@ -0,0 +1,253 @@
+Return-Path: <jonas@astral.example.com>
+Delivered-To: j@pallas.eruditorum.org
+Received: from example.com (example.com [213.88.137.35])
+       by pallas.eruditorum.org (Postfix) with ESMTP id 869591115E
+       for <jesse@bestpractical.com>; Sun, 29 Jun 2003 18:04:04 -0400 (EDT)
+Received: from jonas by example.com with local (Exim 4.20)
+       id 19WkLK-0004Vr-0I
+       for jesse@bestpractical.com; Mon, 30 Jun 2003 00:08:18 +0200
+Resent-To: jesse@bestpractical.com
+Resent-From: Jonas Liljegren <jonas@example.com>
+Resent-Date: Mon, 30 Jun 2003 00:08:17 +0200
+Received: from mail by example.com with spam-scanned (Exim 4.20)
+       id 19Wayz-00068j-KO
+       for jonas@astral.example.com; Sun, 29 Jun 2003 14:08:42 +0200
+Received: from jonas by example.com with local (Exim 4.20)
+       id 19Wayz-00068g-FY
+       for red@example.com; Sun, 29 Jun 2003 14:08:37 +0200
+To: Redaktionen <red@example.com>
+Subject: [Jonas Liljegren] Re: [Para] =?iso-8859-1?q?Niv=E5er=3F?=
+From: Jonas Liljegren <jonas@example.com>
+Date: Sun, 29 Jun 2003 14:08:37 +0200
+Message-ID: <87d6gxt7ay.fsf@example.com>
+User-Agent: Gnus/5.1002 (Gnus v5.10.2) Emacs/21.2 (gnu/linux)
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="=-=-="
+Sender: Jonas Liljegren <jonas@astral.example.com>
+Resent-Message-Id: <E19WkLK-0004Vr-0I@example.com>
+Resent-Sender: Jonas Liljegren <jonas@astral.example.com>
+Resent-Date: Mon, 30 Jun 2003 00:08:18 +0200
+X-Spam-Status: No, hits=-5.7 required=5.0
+       tests=AWL,BAYES_10,EMAIL_ATTRIBUTION,MAILTO_WITH_SUBJ,
+             QUOTED_EMAIL_TEXT,USER_AGENT_GNUS_UA
+       version=2.55
+X-Spam-Level: 
+X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp)
+
+--=-=-=
+Content-Type: text/plain; charset=iso-8859-1
+Content-Transfer-Encoding: quoted-printable
+
+Material f=F6r att uppdatera texten om niv=E5er.
+
+Denna text b=F6r dessutom ligga som ett uppslagsord och inte d=E4r den ligg=
+er nu.
+
+
+--=-=-=
+Content-Type: message/rfc822
+Content-Disposition: inline
+
+Return-path: <list-bounces@example.com>
+Received: from mail by example.com with spam-scanned (Exim 4.20)
+       id 19WFzq-0005i1-WE
+       for jonas@example.com; Sat, 28 Jun 2003 15:44:13 +0200
+Received: from localhost
+       ([127.0.0.1] helo=example.com ident=list)
+       by example.com with esmtp (Exim 4.20)
+       id 19WFzp-0005hf-Tz; Sat, 28 Jun 2003 15:44:05 +0200
+Received: from mail by example.com with spam-scanned (Exim 4.20)
+       id 19WFzh-0005hR-Bu
+       for list@example.com; Sat, 28 Jun 2003 15:44:03 +0200
+Received: from jonas by example.com with local (Exim 4.20)
+       id 19WFzh-0005hO-AO
+       for list@example.com; Sat, 28 Jun 2003 15:43:57 +0200
+To: list@example.com
+Subject: Re: [Para] =?iso-8859-1?q?Niv=E5er=3F?=
+References: <002701c33d62$170fb2e0$a33740d5@TELIA.COM>
+       <002301c33d66$bf6483e0$d97864d5@remotel2tu76c8>
+       <64753.217.210.4.156.1056801224.squirrel@example.com>
+From: Jonas Liljegren <jonas@example.com>
+Date: Sat, 28 Jun 2003 15:43:57 +0200
+In-Reply-To: <64753.217.210.4.156.1056801224.squirrel@example.com> (Jakob
+       Carlsson's message of "Sat, 28 Jun 2003 13:53:44 +0200 (CEST)")
+Message-ID: <877k76uxk2.fsf@example.com>
+User-Agent: Gnus/5.1002 (Gnus v5.10.2) Emacs/21.2 (gnu/linux)
+X-BeenThere: list@example.com
+X-Mailman-Version: 2.1.2
+Precedence: list
+List-Id: &#214;ppen lista f&#246;r alla medlemmar  <list.example.com>
+List-Unsubscribe: <http://example.com/cgi-bin/mailman/listinfo/list>,
+       <mailto:list-request@example.com?subject=unsubscribe>
+List-Archive: <http://example.com/pipermail/list>
+List-Post: <mailto:list@example.com>
+List-Help: <mailto:list-request@example.com?subject=help>
+List-Subscribe: <http://example.com/cgi-bin/mailman/listinfo/list>,
+       <mailto:list-request@example.com?subject=subscribe>
+Sender: list-bounces@example.com
+Errors-To: list-bounces@example.com
+X-Spam-Status: No, hits=-7.0 required=5.0
+       tests=BAYES_00,EMAIL_ATTRIBUTION,IN_REP_TO,QUOTED_EMAIL_TEXT,
+             REFERENCES,REPLY_WITH_QUOTES,USER_AGENT_GNUS_UA
+       version=2.55
+X-Spam-Level: 
+X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-1
+Content-Transfer-Encoding: quoted-printable
+
+"Jakob Carlsson" <esrange@example.com> writes:
+
+>> Om du g=E5r in p=E5 Hemsidan och sen p=E5 Torget.
+>> D=E4r ser du att det st=E5r ditt anv=E4ndarnamn och
+>> bredvid det Niv=E5 5.
+>> Klicka p=E5 niv=E5 5 s=E5 kommer du in p=E5 en sida som
+>>  f=F6rklarar allt om niv=E5systemet.
+>
+> Bra svar. Men jag k=E4nner f=F6r att ge en kort f=F6rklaring av niv=E5-sy=
+stemet.
+
+Jag skulle kunna l=E4gga en massa tid p=E5 at skriva samma sak om och om
+igen.  Fliker in h=E4r f=F6r att s=E4ga detta =E4nnu en g=E5ng...:
+
+ * Det =E4r jag som hittat p=E5 det h=E4r med niv=E5system
+
+ * Det =E4r en stor skillnad p=E5 hur det =E4r t=E4nkt att vara och hur det=
+ =E4r
+   nu.  Jag har stora planer och en massa id=E9er jag vill genomf=F6ra.
+
+ * Niv=E5systemet =E4r en =E5terkoppling f=F6r vad man gjort f=F6r webbplat=
+sen.
+   Som ett tack g=F6r hj=E4lpen.
+
+ * Systemet finns som en inspiration f=F6r de som d=E5 k=E4nner f=F6r att g=
+=F6ra
+   mer.  Men jag vill inte att det ska ge en negativ influens f=F6r de
+   som inte gillar niv=E5er.  Var och en ska kunna v=E4lja att ignorera
+   niv=E5n.  Speciellt b=F6r de f=F6rst=E5 att det inte har att g=F6ra med
+   graden av andlig utveckling, esoteriska kunskaper eller n=E5got
+   s=E5dant.
+
+ * Inspirationen till niv=E5erna kommer fr=E5n spel, hemliga ordenssystem,
+   kosmska hiearkier, skr=E5v=E4sen, akademier, politisk administration,
+   osv.  Det =E4r ett element av rollspel. En lek.
+
+ * Olika niv=E5er motsvarar olika roller p=E5 webbplatsen.  Webbplatsen
+   webbmaster och ansvbariga har en viss niv=E5, bes=F6kare och g=E4ster har
+   en annan niv=E5.
+
+ * Alla datorsystem har administrat=F6rssystem f=F6r dem som sk=F6ter
+   systemet.  Jag har valt att arrangera dessa funktioner i en skala.
+   Niv=E5n anger hur mycket av systemet du har r=E4tt att administrera.
+
+ * Att ha ett niv=E5system f=F6r access g=F6r att man kan g=F6ra som p=E5 f=
+ilm;
+   att l=E5ta de med h=F6gre access komma =E5t mer information.  De med
+   riktigt h=F6g niv=E5 kan n=E5 topphemlig information.  P=E5 denna webbpl=
+ats
+   kan varje anv=E4ndae v=E4lja att h=E5lla vissa personliga uppgifter.  Har
+   du h=F6g niv=E5 har du rollen som anv=E4ndaradministrat=F6r och har
+   tillg=E5ng till dessa uppgifter.  Just nu =E4r vi tre personer med
+   denna niv=E5n.
+
+ * Niv=E5systemet =E4r ett m=E5tt p=E5 p=E5litlighet.  Vi ger dig h=F6gre n=
+iv=E5 n=E4r
+   vi litar p=E5 att du inte kommer att f=F6rst=F6ra f=F6r oss.  F=F6r ju h=
+=F6gre
+   niv=E5, desto l=E4ttare kan du sabbotera inneh=E5llet.
+
+ * P=E5 en h=F6gre niv=E5 beh=F6vs det inte bara att vi litar p=E5 att du v=
+ill
+   v=E4l.  Du m=E5ste =E4ven ha ett gott omd=F6me, teknisk f=F6rst=E5else,
+   intresse och logiskt t=E4nkande.  Utan detta =E4r det l=E4tt h=E4nt att =
+du
+   f=F6rst=F6r saker av misstag.
+
+ * Vi vill uppmuntra medlemmarna att g=F6ra det som =E4r bra f=F6r
+   webbplatsen.  Tilldelandet av h=F6gre niv=E5 ska uppmuntra till att
+   g=F6ra det som =E4r bra.
+
+ * F=F6r att minska missbruk av e-postadresser visar vi e-postadresser
+   bara f=F6r de med lite h=F6gre niv=E5.  P=E5 s=E5 vis vill vi undvika att
+   n=E5gon g=E5r med som medlem bara f=F6r att samla e-postadresser f=F6r a=
+tt
+   sedan g=F6ra reklamutskick.
+
+ * Idag n=E5r du olika niv=E5er p=E5 detta vis:
+
+   0. Kom in p=E5 webbplatsen som g=E4st
+
+   1. V=E4lj anv=E4ndarnamn och ange e-postadress
+
+   2. Logga in med det l=F6senord som skickats till dig
+
+   3. Skrivit en presentation
+
+   5. Presentationen har godk=E4nts
+
+   6. Du har svarat p=E5 ett f=E5tal fr=E5gor om dina intressen
+
+   7. Du har svarat p=E5 en massa fr=E5gor om intressen och beskrivit dem
+      detaljerat
+
+  10. N=E5gon v=E4ktare tycker du f=F6rtj=E4nar h=F6gre niv=E5 f=F6r att du=
+ =E4r s=E5
+      trevlig och engagerad i webbplatsen.
+
+  11. Du har gjort ett antal kopplingar mellan =E4mnen och =F6verv=E4gande
+      delan av dem har godk=E4nts av en v=E4ktare, och du accepterar att
+      b=F6rja som l=E4rling i v=E4ktarakademin (jobbet som
+      systemadministrat=F6r)
+
+  12-39. D=E5 och d=E5 tittar jag p=E5 vad du gjort i form av skrivande av
+      texter och arbetande med uppslagsverkets =E4mnen, och justerar din
+      niv=E5 i f=F6rh=E5llande till m=E4ngd och kvalit=E9 p=E5 arbetet
+
+  40. Du har full=E4ndat ett helt =E4mnesomr=E5de.  En m=E4ngd sammanl=E4nk=
+ade
+      =E4mnen med bra textinneh=E5ll.
+
+  41. F=F6rtroende att arbeta med adminstration av medlemsregistret.
+
+  42. Delaktig i utvecklandet av webbplatsens prgrammering.
+
+
+ * Allts=E5.  Automatik tar dig till niv=E5 7.
+
+ * Men som sagt.  Jag har en massa andra planer d=E4r mycket mer kopplas
+   till niv=E5er och d=E4r det finns systemautomatik f=F6r hela v=E4gen till
+   niv=E5 40.
+
+ * 41 och 42 ligger utanf=F6r niv=E5systemet i =F6vrigt.  Den som har de
+   niv=E5erna har inte n=F6dv=E4ndigtvis tagit sig till niv=E5 40 innan. De
+   motsvaras av anv=E4ndaradministrat=F6r och systemadministrat=F6r och
+   niv=E5n speglar maktbefogenheterna snarare =E4n vad man i =F6vrigt gjort
+   f=F6r webbplatsen.
+
+ * Alla texter. Allt inneh=E5ll =E4r =F6ppet f=F6r alla. =C4ven f=F6r bes=
+=F6kare som
+   inte loggar in.  Du kan till och med g=E5 in p=E5
+   administrationssidorna utan att logga in.  Vi g=F6mmer inte inneh=E5ll.
+   Det vi g=F6r =E4r att hindra dig fr=E5n att =E4ndra inneh=E5llet.  Vi d=
+=F6ljer
+   dock en del information om andra medlemmar i syfte att f=E5 s=E5 m=E5nga
+   som m=F6jligt att sj=E4lv skriva in sig och skriva en presentation.
+
+--=20
+/ Jonas  -  http://jonas.example.com/myself/en/index.html
+
+_______________________________________________
+List mailing list
+List@example.com
+http://example.com/cgi-bin/mailman/listinfo/list
+
+
+--=-=-=
+
+
+
+-- 
+/ Jonas  -  http://jonas.example.com/myself/en/index.html
+
+--=-=-=--
+
diff --git a/rt/lib/t/data/new-ticket-from-iso-8859-1 b/rt/lib/t/data/new-ticket-from-iso-8859-1
new file mode 100644 (file)
index 0000000..299392d
--- /dev/null
@@ -0,0 +1,31 @@
+Return-Path: <hw@nordkapp.net>
+Delivered-To: j@pallas.eruditorum.org
+Received: from sm1.nordkapp.net (sm1.nordkapp.net [62.70.54.150])
+       by pallas.eruditorum.org (Postfix) with ESMTP id 48F4E11112
+       for <jesse@bestpractical.com>; Mon,  2 Jun 2003 14:58:37 -0400 (EDT)
+Received: (qmail 3612 invoked by uid 1009); 2 Jun 2003 18:58:36 -0000
+Received: from unknown (HELO office.nordkapp.net) (213.161.186.83)
+  by 0 with SMTP; 2 Jun 2003 18:58:36 -0000
+Message-Id: <5.2.1.1.0.20030602205708.0314c5f8@mail.nordkapp.net>
+X-Sender: hw@nordkapp.net@mail.nordkapp.net
+X-Mailer: QUALCOMM Windows Eudora Version 5.2.1
+Date: Mon, 02 Jun 2003 20:58:30 +0200
+To: Jesse Vincent <jesse@bestpractical.com>
+From: Wilhelmsen Håvard <hw@nordkapp.net>
+Subject: Re: rt-3.0.3pre1
+In-Reply-To: <20030602185607.GN10811@fsck.com>
+References: <5.2.1.1.0.20030602204834.031406d8@mail.nordkapp.net>
+ <5.2.1.1.0.20030530194214.0371c988@mail.nordkapp.net>
+ <5.2.1.1.0.20030530194214.0371c988@mail.nordkapp.net>
+ <5.2.1.1.0.20030602204834.031406d8@mail.nordkapp.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset="iso-8859-1"; format=flowed
+Content-Transfer-Encoding: 8bit
+X-Spam-Status: No, hits=-1.9 required=5.0
+       tests=AWL,EMAIL_ATTRIBUTION,IN_REP_TO,QUOTED_EMAIL_TEXT,
+             REFERENCES,REPLY_WITH_QUOTES
+       autolearn=ham version=2.55
+X-Spam-Level: 
+X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp)
+
+Håvard
diff --git a/rt/lib/t/data/new-ticket-from-iso-8859-1-full b/rt/lib/t/data/new-ticket-from-iso-8859-1-full
new file mode 100644 (file)
index 0000000..493ca15
--- /dev/null
@@ -0,0 +1,38 @@
+X-Mailer: QUALCOMM Windows Eudora Version 5.2.1
+To: Jesse Vincent <jesse@bestpractical.com>
+From: Wilhelmsen Håvard <hw@nordkapp.net>
+Subject: Re: rt-3.0.3pre1
+X-Spam-Status: No, hits=-1.9 required=5.0
+       tests=AWL,EMAIL_ATTRIBUTION,IN_REP_TO,QUOTED_EMAIL_TEXT,
+             REFERENCES,REPLY_WITH_QUOTES
+       autolearn=ham version=2.55
+X-Spam-Level: 
+X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp)
+
+At 14:56 02.06.2003 -0400, you wrote:
+>> This patch didn't help us out.
+>> We still got problems with auto responding e-mails sent from the system
+>> when a new ticket is created.
+>> The same problem appears when one of the staff replays to an new ticket.
+>> All Norwegian letters is converted to strange letters like Ã¸
+>>
+>> We would love if this bug could be fixed. On our mail server we are 
+>running
+>> perl 5.6.1 since we are using debian stabel packet lists.
+>
+>I'd love it too. I just can't find it. Can you send me
+>(jesse@bestpractical.com) a couple of email messages containing
+>characters that break your RT?
+
+Hello again,
+
+Thanks for your fast replay!
+
+I don't know how this looks at your end but it is letters like: ø æ å
+If your want to make this in html it will be &oslash; &aring; and &aerlig;
+
+
+-- 
+Håvard 
+
+
diff --git a/rt/lib/t/data/russian-subject-no-content-type b/rt/lib/t/data/russian-subject-no-content-type
new file mode 100644 (file)
index 0000000..03d95b8
--- /dev/null
@@ -0,0 +1,42 @@
+Return-Path: <mitya@fling-wing.example.com>
+X-Real-To: <mitya@second.example.com>
+Received: from [194.87.5.31] (HELO sinbin.example.com)
+  by cgp.second.example.com (CommuniGate Pro SMTP 4.0.5/D)
+  with ESMTP-TLS id 69661026 for mitya@second.example.com; Wed, 18 Jun 2003 11:14:49 +0400
+Received: (from daemon@localhost)
+       by sinbin.example.com (8.12.8/8.11.6) id h5I7EfOj096595
+       for mitya@second.example.com; Wed, 18 Jun 2003 11:14:41 +0400 (MSD)
+       (envelope-from mitya@fling-wing.example.com)
+Received: from example.com by sinbin.example.com with ESMTP id h5I7Ee8K096580;
+       (8.12.9/D) Wed, 18 Jun 2003 11:14:40 +0400 (MSD)
+X-Real-To: <mitya@second.example.com>
+Received: from [194.87.0.31] (HELO mail.example.com)
+  by example.com (CommuniGate Pro SMTP 4.1b7/D)
+  with ESMTP id 76217696 for mitya@example.com; Wed, 18 Jun 2003 11:14:40 +0400
+Received: by mail.example.com (CommuniGate Pro PIPE 4.1b7/D)
+  with PIPE id 63920083; Wed, 18 Jun 2003 11:14:40 +0400
+Received: from [194.87.5.69] (HELO fling-wing.example.com)
+  by mail.example.com (CommuniGate Pro SMTP 4.1b7/D)
+  with ESMTP-TLS id 63920055 for mitya@example.com; Wed, 18 Jun 2003 11:14:38 +0400
+Received: from fling-wing.example.com (localhost [127.0.0.1])
+       by fling-wing.example.com (8.12.9/8.12.6) with ESMTP id h5I7Ec5R000153
+       for <mitya@example.com>; Wed, 18 Jun 2003 11:14:38 +0400 (MSD)
+       (envelope-from mitya@fling-wing.example.com)
+Received: (from mitya@localhost)
+       by fling-wing.example.com (8.12.9/8.12.6/Submit) id h5I7Ec0J000152
+       for mitya@example.com; Wed, 18 Jun 2003 11:14:38 +0400 (MSD)
+Date: Wed, 18 Jun 2003 11:14:38 +0400 (MSD)
+From: "Dmitry S. Sivachenko" <mitya@fling-wing.example.com>
+Message-Id: <200306180714.h5I7Ec0J000152@fling-wing.example.com>
+To: mitya@example.com
+Subject: ÔÅÓÔ ÔÅÓÔ
+X-Spam-Checker-Version: SpamAssassin 2.60-cvs-mail.demos (1.193-2003-06-13-exp)
+X-Spam-Level: +
+X-Spam-Status: No, hits=1.0 required=5.0 tests=SUBJ_ILLEGAL_CHARS autolearn=no
+       version=2.60-cvs-mail.demos
+X-Spam-Report: * SUBJ_ILLEGAL_CHARS  1.0 (Subject contains too many raw illegal characters)
+       
+Content-Length: 6
+
+ôåóô
+
diff --git a/rt/lib/t/data/text-html-in-russian b/rt/lib/t/data/text-html-in-russian
new file mode 100644 (file)
index 0000000..b965b1b
--- /dev/null
@@ -0,0 +1,87 @@
+From rickt@other-example.com  Tue Jun 17 20:39:13 2003
+Return-Path: <rickt@other-example.com>
+X-Original-To: info
+Delivered-To: mitya@vh.example.com
+Received: from example.com (mx.example.com [194.87.0.32])
+       by vh.example.com (Postfix) with ESMTP id 8D77B16E6BD
+       for <info>; Tue, 17 Jun 2003 20:39:05 +0400 (MSD)
+Received: from hotline@example.com
+  by example.com (CommuniGate Pro GROUP 4.1b7/D)
+  with GROUP id 76033026; Tue, 17 Jun 2003 20:38:00 +0400
+Received: by example.com (CommuniGate Pro PIPE 4.1b7/D)
+  with PIPE id 76033052; Tue, 17 Jun 2003 20:38:00 +0400
+Received: from [217.132.49.75] (HELO compuserve.com)
+  by example.com (CommuniGate Pro SMTP 4.1b7/D)
+  with SMTP id 76032971 for info@example.com; Tue, 17 Jun 2003 20:37:41 +0400
+Date: Wed, 18 Jun 2003 01:41:01 +0000
+From: Ó÷åáíûé Öåíòð <rickt@other-example.com>
+Subject: Ïðèãëàøàåì ðóêîâîäèòåëÿ, íà÷àëüíèêîâ ïîäðàçäåëåíèé íà òðåíèíã                                                         YXLWLJ3LPT9UHuLyGTzyuKQc06eIZ96Y6RVTCZFt
+To: Info <info@example.com>
+References: <0ID97EGL951H1907@example.com>
+In-Reply-To: <0ID97EGL951H1907@example.com>
+Message-ID: <HDE46LIK8GGJJ72I@other-example.com>
+MIME-Version: 1.0
+Content-Type: text/html; charset=Windows-1251
+Content-Transfer-Encoding: 8bit
+X-Spam-Flag: YES
+X-Spam-Checker-Version: SpamAssassin 2.60-cvs-jumbo.demos (1.190-2003-06-01-exp)
+X-Spam-Level: ++++++++++++++
+X-Spam-Status: Yes, hits=14.9 required=5.0 tests=BAYES_99,DATE_IN_FUTURE_06_12
+       FROM_ILLEGAL_CHARS,HTML_10_20,HTML_FONTCOLOR_UNKNOWN,HTML_FONT_BIG
+       MIME_HTML_ONLY,RCVD_IN_NJABL,SUBJ_HAS_SPACES,SUBJ_HAS_UNIQ_ID
+       SUBJ_ILLEGAL_CHARS autolearn=no version=2.60-cvs-jumbo.demos
+X-Spam-Report: 14.9 points, 5.0 required;
+       *  2.3 -- Subject contains lots of white space
+       *  1.0 -- BODY: HTML font color is unknown to us
+       *  0.3 -- BODY: FONT Size +2 and up or 3 and up
+                 [score: 1.0000]
+       *  2.8 -- BODY: Bayesian classifier spam probability is 99 to 100%
+       *  1.0 -- BODY: Message is 10% to 20% HTML
+       *  1.0 -- From contains too many raw illegal characters
+       *  1.0 -- Subject contains a unique ID
+       *  1.0 -- Subject contains too many raw illegal characters
+       *  1.2 -- Date: is 6 to 12 hours after Received: date
+                 [217.132.49.75 listed in dnsbl.njabl.org]
+       *  1.2 -- RBL: Received via a relay in dnsbl.njabl.org
+       *  2.0 -- Message only has text/html MIME parts
+Status: RO
+Content-Length: 2743
+Lines: 36
+
+<html><body><basefont face="times new roman, times, serif" size="2">
+<center>Ó÷eáíûé Öeíòp "ÊÀÄÐÛ ÄÅËÎÂÎÃΠÌÈÐÀ" ïpèãëaøaeò ía òpeíèíã:<br>
+<font size="5"><b>ÌÎÒÈÂÀÖÈß ÊÀÊ ÈÍÑÒÐÓÌÅÍÒ ÓÏÐÀÂËÅÍÈß ÏÅÐÑÎÍÀËÎÌ</b></font><br>
+<font color="red"><b>19 èþíÿ 2003 ã.</b></font><br>
+<b><i>Òpeíèíã ïpeäíaçía÷eí äëÿ âûcøeão è cpeäíeão óïpaâëeí÷ecêoão ïepcoíaëa.</i></b><br></center><br>
+<p align="justify"><b>Òpeíep: Áopìoòoâ Ïaâeë.</b> Ïpaêòè÷ecêèé ïcèõoëoã, oïûò paáoòû áoëee 10 ëeò â oáëacòè ïcèõoëoãèè è áèçíec-òpeíèíãoâ. Àâòop pÿäa ïóáëèêaöèé è ìeòoäè÷ecêèõ ïocoáèé paçëè÷íûõ íaïpaâëeíèé ïcèõoëoãèè, â òoì ÷ècëe: \93Òeõíoëoãèÿ äeëoâoão oáùeíèÿ\94\93Òeõíèêè è ïpèeìû ýôôeêòèâíûõ ïepeãoâopoâ\94\93Ñòpaòeãèè ôopìèpoâaíèÿ êopïopaòèâíoão èìèäæa\94 è äp. Çaêoí÷èë ËÃÓ ôaêóëüòeò coöèaëüíoé ïcèõoëoãèè, Ðoccèécêóþ Àêaäeìèþ ãocóäapcòâeííoé cëóæáû ïpè Ïpeçèäeíòe ÐÔ, êópcû MBA.<br><br>
+<b><u>Öeëè òpeíèíãa:</u></b><br>
+1. Îcâoèòü ïpèeìû óïpaâëeíèÿ ìoòèâaöèeé;<br>
+2. Ïoëó÷èòü ïpaêòè÷ecêèe íaâûêè ìoòèâaöèè ïepcoíaëa ê paáoòe;<br>
+3. Îcâoèòü ocíoâíûe íaâûêè êoìaíäooápaçoâaíèÿ;<br>
+4. Îâëaäeòü ïpaêòè÷ecêèìè ìeòoäaìè coçäaíèÿ è ócèëeíèÿ paáo÷eé ìoòèâaöèè, êoìaíäooápaçoâaíèÿ.<br><br>
+<b><u>Çaäa÷è òpeíèíãa:</u></b><br>
+&nbsp;- Îcâoèòü ìeòoäû ïoáóæäeíèÿ äpóãèõ ëþäeé ê âûïoëíeíèþ oïpeäeëeííoé äeÿòeëüíocòè;<br>
+&nbsp;- Íaó÷èòücÿ íaïpaâëÿòü ïoáóæäeíèÿ coòpóäíèêoâ â cooòâeòcòâèe c çaäa÷aìè opãaíèçaöèè.<br><br>
+<b><u>Ñoäepæaíèe ïpoãpaììû:</u></b><br>
+<b>I. Ìaòepèaëüíûe è íeìaòepèaëüíûe ôopìû ìoòèâaöèè:</b><br>
+1. Ìecòo è poëü ìoòèâaöèè â óïpaâëeíèè ïepcoíaëoì;<br>
+2. Ïpaêòèêa óïpaâëeíèÿ opãaíèçaöèÿìè.<br>
+<b>II. Ïpaêòè÷ecêoe ïpèìeíeíèe ìoòèâaöèè â óïpaâëeíèè ïepcoíaëoì:</b><br>
+1. Àíòèìoòèâèpóþùèe pacïopÿæeíèÿ;<br>
+2. Ìoòèâaöèÿ è oöeíêa äeÿòeëüíocòè (poëü aòòecòaöèè coòpóäíèêoâ);<br>
+3. Ìoòèâaöèÿ è ïpaêòèêa íaêaçaíèé.<br><br>
+<b><u> çaâepøeíèè ïpoãpaììû ó÷acòíèêè cìoãóò:</u></b><br>
+1. Îpèeíòèpoâaòü coòpóäíèêoâ ía äocòèæeíèe oïpeäeëeííoão peçóëüòaòa;<br>
+2. Îâëaäeòü íeoáõoäèìûìè íaâûêaìè óïpaâëeíèÿ ìoòèâaöèeé ïepcoíaëa;<br>
+3. Ïpèìeíÿòü ïoëó÷eííûe çíaíèÿ â ïpaêòèêe óïpaâëeíèÿ ïepcoíaëoì;<br>
+4. Îïpeäeëÿòü èíäèâèäóaëüíûe ocoáeííocòè (ïpeäïo÷òeíèÿ) ìoòèâaöèè coòpóäíèêoâ â opãaíèçaöèè.<br>
+<i> õoäe òpeíèíãa ècïoëüçóeòcÿ paáo÷èé è cïpaâo÷íûé ìaòepèaë ïo ìoòèâaöèè è còèìóëèpoâaíèþ ïepcoíaëa poccèécêèõ êoìïaíèé. Ïo oêoí÷aíèè âûäaeòcÿ cepòèôèêaò.</i><br><br>
+<center>Ïpoäoëæèòeëüíocòü: 1 äeíü, 8 ÷acoâ (äâa ïepepûâa, oáeä)<br>
+<b>Ñòoèìocòü ó÷acòèÿ: 4 700 póáëeé áeç ÍÄÑ.</b><br>
+921-5862, 928-4156, 928-4200, 928-5321</center><br>
+<font size=1>  Åcëè èíôopìaöèÿ ïoäoáíoão poäa Âac íe èíòepecóeò è ïo äpóãèì âoïpocaì - ïèøèòe:  <a href="mailto:motiv@mailje.nl">seminar</a></font>
+<br><font size="1" color="#ffffff">3ZkRPb60QBbiHef1IRVl</font>
+</body></html>
+
+
+
diff --git a/rt/lib/t/data/text-html-with-umlaut b/rt/lib/t/data/text-html-with-umlaut
new file mode 100644 (file)
index 0000000..90e5d3f
--- /dev/null
@@ -0,0 +1,35 @@
+Return-Path: <gst@example.com>
+Delivered-To: j@pallas.eruditorum.org
+Received: from vis.example.com (vis.example.com [212.68.68.251])
+       by pallas.eruditorum.org (Postfix) with SMTP id 59236111C3
+       for <jesse@example.com>; Thu, 12 Jun 2003 02:14:44 -0400 (EDT)
+Received: (qmail 29541 invoked by uid 502); 12 Jun 2003 06:14:42 -0000
+Received: from sivd.example.com (HELO example.com) (192.168.42.1)
+  by 192.168.42.42 with SMTP; 12 Jun 2003 06:14:42 -0000
+Received: received from 172.20.72.174 by odie.example.com; Thu, 12 Jun 2003 08:14:27 +0200
+Received: by mailserver.example.com with Internet Mail Service (5.5.2653.19) id <LJSB7T54>; Thu, 12 Jun 2003 08:14:39 +0200
+Message-ID: <50362EC956CBD411A339009027F6257E013DD495@mailserver.example.com>
+Date: Thu, 12 Jun 2003 08:14:39 +0200
+From: "Stever, Gregor" <gst@example.com>
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+To: "'jesse@example.com'" <jesse@example.com>
+Subject: An example of mail containing text-html with an umlaut in the content
+Date: Thu, 12 Jun 2003 08:14:39 +0200
+Content-Type: text/html;
+       charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML><HEAD>
+<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; charset=3Diso-8859-=
+1">
+
+
+<META content=3D"MSHTML 6.00.2800.1170" name=3DGENERATOR></HEAD>
+<BODY>
+<DIV><FONT face=3DArial><FONT size=3D2>Hello,<BR><BR>ist this kind of Messa=
+ges, that=20
+causes rt to crash.<BR><BR>Mit freundlichen Gr=FC=DFen<BR>Gregor=20
+Stever&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^^causes Error<SPAN=20
+class=3D975501206-12062003>!!</SPAN></FONT></FONT></DIV></BODY></HTML>
diff --git a/rt/lib/t/regression/00placeholder b/rt/lib/t/regression/00placeholder
new file mode 100644 (file)
index 0000000..0afc604
--- /dev/null
@@ -0,0 +1 @@
+1;
diff --git a/rt/lib/t/regression/mime_tests b/rt/lib/t/regression/mime_tests
new file mode 100644 (file)
index 0000000..26e4dbf
--- /dev/null
@@ -0,0 +1,19 @@
+use RT::Ticket;
+use RT::Queue;
+
+use MIME::Parser;
+use File::Temp;
+use RT::EmailParser;
+
+open (HANDLE, "data/nested-mime-sample");
+my $parser = RT::EmailParser->new()
+ $parser->ParseMIMEEntityFromFileHandle(\*HANDLE);
+my $entity = $parser->Entity;
+
+my $q = RT::Queue->new($RT::SystemUser);
+$q->Load('general');
+ok ($q->Id, "Queue is loaded");
+my $Ticket = RT::Ticket->new($RT::SystemUser);
+my ($tid, $ttid, $msg) =$Ticket->Create( Queue => $q->Id, Subject => "Nested mime test", MIMEObj => $entity);
+ok ($tid, $msg);
+ok($Ticket->Id);
diff --git a/rt/m4/rt_enable_layout.m4 b/rt/m4/rt_enable_layout.m4
new file mode 100644 (file)
index 0000000..cadec1c
--- /dev/null
@@ -0,0 +1,36 @@
+dnl
+dnl @synopsis RT_ENABLE_LAYOUT()
+dnl
+dnl Enable a specific directory layout for the installation to use.
+dnl This configures a command-line parameter that can be specified
+dnl at ./configure invocation.
+dnl
+dnl The use of this feature in this way is a little hackish, but
+dnl better than a heap of options for every directory.
+dnl
+dnl This code is heavily borrowed *cough* from the Apache 2 code.
+dnl
+
+AC_DEFUN([RT_ENABLE_LAYOUT],[
+AC_ARG_ENABLE(layout,
+             AC_HELP_STRING([--enable-layout=LAYOUT],
+                            [Use a specific directory layout (Default: RT3)]),
+             LAYOUT=$enableval)
+
+if test "x$LAYOUT" = "x"; then
+       LAYOUT="RT3"
+fi
+RT_LAYOUT($srcdir/config.layout, $LAYOUT)
+AC_MSG_CHECKING(for chosen layout)
+if test "x$rt_layout_name" = "xno"; then
+       if test "x$LAYOUT" = "xno"; then
+               AC_MSG_RESULT(none)
+       else
+               AC_MSG_RESULT($LAYOUT)
+       fi
+       AC_MSG_ERROR([a valid layout must be specified (or the default used)])
+else
+       AC_SUBST(rt_layout_name)
+       AC_MSG_RESULT($rt_layout_name)
+fi
+])
diff --git a/rt/m4/rt_expand_var.m4 b/rt/m4/rt_expand_var.m4
new file mode 100644 (file)
index 0000000..cec884a
--- /dev/null
@@ -0,0 +1,18 @@
+dnl
+dnl @synopsis  RT_EXPAND_VAR(baz, $fraz)
+dnl
+dnl Iteratively expands the second parameter, until successive iterations
+dnl yield no change. The result is then assigned to the first parameter.
+dnl
+dnl This code is heavily borrowed from the Apache 2 codebase.
+dnl
+
+AC_DEFUN([RT_EXPAND_VAR],[
+       ap_last=''
+       ap_cur='$2'
+       while test "x${ap_cur}" != "x${ap_last}"; do
+               ap_last="${ap_cur}"
+               ap_cur=`eval "echo ${ap_cur}"`
+       done
+       $1="${ap_cur}"
+])
diff --git a/rt/m4/rt_layout.m4 b/rt/m4/rt_layout.m4
new file mode 100644 (file)
index 0000000..393b321
--- /dev/null
@@ -0,0 +1,74 @@
+dnl
+dnl @synopsis RT_LAYOUT(configlayout, layoutname)
+dnl
+dnl This macro reads an Apache-style layout file (specified as the
+dnl configlayout parameter), and searches for a specific layout
+dnl (named using the layoutname parameter).
+dnl
+dnl The entries for a given layout are then inserted into the
+dnl environment such that they become available as substitution
+dnl variables. In addition, the rt_layout_name variable is set
+dnl (but not exported) if the layout is valid.
+dnl
+dnl This code is heavily borrowed *cough* from the Apache 2 codebase.
+dnl
+
+AC_DEFUN([RT_LAYOUT],[
+       if test ! -f $srcdir/config.layout; then
+               AC_MSG_WARN([Layout file $srcdir/config.layout not found])
+               rt_layout_name=no
+       else
+               pldconf=./config.pld
+               $PERL  -0777 -p -e "\$layout = '$2';"  -e '
+               s/.*<Layout\s+$layout>//gims; 
+               s/\<\/Layout\>.*//s; 
+               s/^#.*$//m;
+               s/^\s+//gim;
+               s/\s+$/\n/gim;
+               s/\+$/\/rt3/gim;
+               # m4 will not let us just use $1, we need @S|@1
+               s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/@S|@1=@S|@2/gim;
+               s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\@S|@@S|@1" = "xNONE" || test "x\@S|@@S|@1" = "x") && @S|@1=@S|@2/gim;
+                ' < $1 > $pldconf
+
+               if test -s $pldconf; then
+                       rt_layout_name=$2
+                       . $pldconf
+                       changequote({,})
+                       for var in prefix exec_prefix bindir sbindir \
+                                sysconfdir mandir libdir datadir htmldir \
+                                localstatedir logfiledir masonstatedir \
+                                sessionstatedir customdir custometcdir customhtmldir \
+                                customlexdir customlibdir manualdir; do
+                               eval "val=\"\$$var\""
+                               val=`echo $val | sed -e 's:\(.\)/*$:\1:'`
+                               val=`echo $val | 
+                                       sed -e 's:[\$]\([a-z_]*\):${\1}:g'`
+                               eval "$var='$val'"
+                       done
+                       changequote([,])
+               else
+                       rt_layout_name=no
+               fi
+               #rm $pldconf
+       fi
+       RT_SUBST_EXPANDED_ARG(prefix)
+       RT_SUBST_EXPANDED_ARG(exec_prefix)
+       RT_SUBST_EXPANDED_ARG(bindir)
+       RT_SUBST_EXPANDED_ARG(sbindir)
+       RT_SUBST_EXPANDED_ARG(sysconfdir)
+       RT_SUBST_EXPANDED_ARG(mandir)
+       RT_SUBST_EXPANDED_ARG(libdir)
+       RT_SUBST_EXPANDED_ARG(datadir)
+       RT_SUBST_EXPANDED_ARG(htmldir)
+       RT_SUBST_EXPANDED_ARG(manualdir)
+       RT_SUBST_EXPANDED_ARG(localstatedir)
+       RT_SUBST_EXPANDED_ARG(logfiledir)
+       RT_SUBST_EXPANDED_ARG(masonstatedir)
+       RT_SUBST_EXPANDED_ARG(sessionstatedir)
+       RT_SUBST_EXPANDED_ARG(customdir)
+       RT_SUBST_EXPANDED_ARG(custometcdir)
+       RT_SUBST_EXPANDED_ARG(customhtmldir)
+       RT_SUBST_EXPANDED_ARG(customlexdir)
+       RT_SUBST_EXPANDED_ARG(customlibdir)
+])dnl
diff --git a/rt/m4/rt_subst_expanded_arg.m4 b/rt/m4/rt_subst_expanded_arg.m4
new file mode 100644 (file)
index 0000000..02002b0
--- /dev/null
@@ -0,0 +1,14 @@
+dnl
+dnl @synopsis  RT_SUBST_EXPANDED_ARG(var)
+dnl
+dnl Export (via AC_SUBST) a given variable, along with an expanded
+dnl version of the variable (same name, but with exp_ prefix).
+dnl
+dnl This code is heavily borrowed *cough* from the Apache 2 source.
+dnl
+
+AC_DEFUN([RT_SUBST_EXPANDED_ARG],[
+       RT_EXPAND_VAR(exp_$1, [$]$1)
+       AC_SUBST($1)
+       AC_SUBST(exp_$1)
+])
diff --git a/rt/sbin/extract-message-catalog b/rt/sbin/extract-message-catalog
new file mode 100644 (file)
index 0000000..af7b2c7
--- /dev/null
@@ -0,0 +1,246 @@
+#!/usr/bin/perl -w 
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+# Portions Copyright 2002 Autrijus Tang <autrijus@autrijus.org>
+
+use strict;
+
+use File::Find;
+use File::Copy;
+use Regexp::Common;
+use Carp;
+
+use vars qw($DEBUG $FILECAT);
+
+$DEBUG = 1;
+
+@ARGV = <lib/RT/I18N/*.po> unless @ARGV;
+
+$FILECAT = {};
+
+# extract all strings and stuff them into $FILECAT
+File::Find::find( { wanted => \&extract_strings_from_code, follow => 0 }, '.' );
+
+# ensure proper escaping and [_1] => %1 transformation
+foreach my $str ( sort keys %{$FILECAT} ) {
+    my $entry = $FILECAT->{$str};
+    my $oldstr = $str;
+
+    $str =~ s/\\/\\\\/g;
+    $str =~ s/\"/\\"/g;
+    $str =~ s/((?<!~)(?:~~)*)\[_(\d+)\]/$1%$2/g;
+    $str =~ s/((?<!~)(?:~~)*)\[([A-Za-z#*]\w*),([^\]]+)\]/"$1%$2(".escape($3).")"/eg;
+    $str =~ s/~([\[\]])/$1/g;
+
+    delete $FILECAT->{$oldstr};
+    $FILECAT->{$str} = $entry;
+}
+
+# update all language dictionaries
+foreach my $dict (@ARGV) {
+    $dict = "lib/RT/I18N/$dict.po" unless -f $dict or $dict =~ m!/!;
+
+    my $lang = $dict;
+    $lang =~ s|.*/||;
+    $lang =~ s|\.po$||;
+
+    update($lang, $dict);
+}
+
+
+# {{{ pull strings out of the code.
+
+sub extract_strings_from_code {
+    my $file = $_;
+
+    local $/;
+    return if ( -d $_ );
+    return if ( $File::Find::dir =~ 'lib/blib|lib/t/autogen|var|m4|local' );
+    return if ( /\.po$|\.bak$|~|,D|,B$|extract-message-catalog$/ );
+    return if ( /^[\.#]/ );
+    return if ( -f "$_.in" );
+
+    print "Looking at $File::Find::name\n";
+    my $filename = $File::Find::name;
+    $filename =~ s'^\./'';
+    $filename =~ s'\.in$'';
+
+    unless (open _, $file) {
+        print "Cannot open $file for reading ($!), skipping.\n";
+        return;
+    }
+
+    $_ = <_>;
+
+    # Mason filter: <&|/l>...</&>
+    my $line = 1;
+    while (m!\G.*?<&\|/l(.*?)&>(.*?)</&>!sg) {
+        my ( $vars, $str ) = ( $1, $2 );
+        $line += ( () = ( $& =~ /\n/g ) );    # cryptocontext!
+        $str =~ s/\\'/\'/g;
+        #print "STR IS $str\n";
+        push @{ $FILECAT->{$str} }, [ $filename, $line, $vars ];
+    }
+
+    # Localization function: loc(...)
+    $line = 1;
+    pos($_) = 0;
+    while (m/\G.*?\bloc$RE{balanced}{-parens=>'()'}{-keep}/sg) {
+        my $match = $1;
+        $line += ( () = ( $& =~ /\n/g ) );    # cryptocontext!
+
+        my ( $vars, $str );
+        if ( $match =~
+                /\(\s*($RE{delimited}{-delim=>q{'"}}{-keep})(.*?)\s*\)$/ ) {
+
+            $str = substr( $1, 1, -1 );       # $str comes before $vars now
+            $vars = $9;
+        }
+        else {
+            next;
+        }
+
+        $vars =~ s/[\n\r]//g;
+        $str  =~ s/\\'/\'/g;
+
+        push @{ $FILECAT->{$str} }, [ $filename, $line, $vars ];
+    }
+
+    # Comment-based mark: "..." # loc
+    $line = 1;
+    pos($_) = 0;
+    while (m/\G.*?($RE{delimited}{-delim=>q{'"}}{-keep})[\}\)\],]*\s*\#\s*loc\s*$/smg) {
+       my $str = substr($1, 1, -1);
+       $line += ( () = ( $& =~ /\n/g ) );    # cryptocontext!
+       $str  =~ s/\\'/\'/g;
+       push @{ $FILECAT->{$str} }, [ $filename, $line, '' ];
+    }
+
+    # Comment-based pair mark: "..." => "..." # loc_pair
+    $line = 1;
+    pos($_) = 0;
+    while (m/\G.*?(\w+)\s*=>\s*($RE{delimited}{-delim=>q{'"}}{-keep})[\}\)\],]*\s*\#\s*loc_pair\s*$/smg) {
+       my $key = $1;
+       my $val = substr($2, 1, -1);
+       $line += ( () = ( $& =~ /\n/g ) );    # cryptocontext!
+       $key  =~ s/\\'/\'/g;
+       $val  =~ s/\\'/\'/g;
+       push @{ $FILECAT->{$key} }, [ $filename, $line, '' ];
+       push @{ $FILECAT->{$val} }, [ $filename, $line, '' ];
+    }
+
+    close (_);
+}
+# }}} extract from strings
+
+sub update {
+    my $lang = shift;
+    my $file = shift;
+    my ( %Lexicon, %Header);
+    my $out = '';
+
+    unless (!-e $file or -w $file) {
+       warn "Can't write to $lang, skipping...\n";
+       return;
+    }
+
+    print "Updating $lang...\n";
+
+    my @lines;
+    @lines = (<LEXICON>) if open (LEXICON, $file);
+    @lines = grep { !/^(#(:|\.)\s*|$)/ } @lines;
+    while (@lines) {
+        my $msghdr = "";
+        $msghdr .= shift @lines while ( $lines[0] && $lines[0] !~ /^msgid/ );
+        my $msgid  = shift @lines;
+        my $msgstr = "";
+        $msgstr .= shift @lines while ( $lines[0] && $lines[0] =~ /^(msgstr|")/ );
+
+        last unless $msgid;
+
+        chomp $msgid;
+        chomp $msgstr;
+        $msgid  =~ s/^msgid "(.*)"$/$1/    or warn $msgid;
+        $msgstr =~ s/^msgstr "(.*)"$/$1/ms or warn $msgstr;
+
+        $Lexicon{$msgid} = $msgstr;
+        $Header{$msgid}  = $msghdr;
+    }
+
+    my $is_english = ( $lang =~ /^en(?:[^A-Za-z]|$)/ );
+
+    foreach my $str ( sort keys %{$FILECAT} ) {
+        $Lexicon{$str} ||= '';;
+    }
+    foreach ( sort keys %Lexicon ) {
+        my $f = join ( ' ', sort map $_->[0].":".$_->[1], @{ $FILECAT->{$_} } );
+        my $nospace = $_;
+        $nospace =~ s/ +$//;
+
+        if ( !$Lexicon{$_} and $Lexicon{$nospace} ) {
+            $Lexicon{$_} =
+              $Lexicon{$nospace} . ( ' ' x ( length($_) - length($nospace) ) );
+        }
+
+        next if !length( $Lexicon{$_} ) and $is_english;
+
+        my %seen;
+        $out .= $Header{$_} if exists $Header{$_};
+        if ( $f && $f !~ /^\s+$/ ) {
+
+            $out .= "#: $f\n";
+        }
+        elsif ($_) {
+            $out .= "#: NOT FOUND IN SOURCE\n";
+        }
+        foreach my $entry ( grep { $_->[2] } @{ $FILECAT->{$_} } ) {
+            my ( $file, $line, $var ) = @{$entry};
+            $var =~ s/^\s*,\s*//;
+            $var =~ s/\s*$//;
+            $out .= "#. ($var)\n" unless $seen{$var}++;
+        }
+        $out .= "msgid \"$_\"\nmsgstr \"$Lexicon{$_}\"\n\n";
+    }
+
+    open PO, ">$file" or die $!;
+    print PO $out;
+    close PO;
+
+    return 1;
+}
+
+sub escape {
+    my $text = shift;
+    $text =~ s/\b_(\d+)/%$1/;
+    return $text;
+}
+
+__END__
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
diff --git a/rt/sbin/extract_pod_tests b/rt/sbin/extract_pod_tests
new file mode 100644 (file)
index 0000000..ed01c7d
--- /dev/null
@@ -0,0 +1,129 @@
+#!/usr/bin/perl
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 vars qw($VERSION);
+$VERSION = '0.06';
+
+use Pod::Tests;
+use Symbol;
+
+=pod
+
+=head1 NAME
+
+extract_pod_tests -  RT-specific variant of pod2tests
+
+=head1 SYNOPSIS
+
+  pod2test [-Mmodule] [input [output]]
+
+=head1 DESCRIPTION
+
+B<pod2test> is a front-end for Test::Inline.  It generates the 
+"Bodies" of MakeMaker style .t testing files from embedded tests and 
+code examples.
+
+If output is not specified, the resulting .t file will go to STDOUT.
+Otherwise, it will go to the given output file.  If input is not
+given, it will draw from STDIN.
+
+If the given file contains no tests or code examples, no output will
+be given and no output file will be created.
+
+=cut
+
+my($infile, $outfile) = @ARGV;
+my($infh,$outfh);
+
+
+if( defined $infile ) {
+    $infh = gensym;
+    open($infh, $infile) or 
+      die "Can't open the POD file $infile: $!";
+}
+else {
+    $infh = \*STDIN;
+}
+
+unless ($outfile) {
+     ( my $test = $infile ) =~ s/\.(pm|pod)$//;
+            $test =~ s/^lib\W//;
+            $test =~ s/\W/-/;
+            $test =~ s/\//__/g;
+
+        $outfile = "lib/t/autogen/autogen-$test.t";
+}
+
+
+my $p = Pod::Tests->new;
+$p->parse_fh($infh);
+
+# XXX Hack to put the filename into the #line directive
+$p->{file} = $infile || '';
+
+my @tests    = $p->build_tests($p->tests);
+my @examples = $p->build_examples($p->examples);
+
+exit unless @tests or @examples;
+
+
+if( defined $outfile) {
+    $outfh = gensym;
+    open($outfh, ">$outfile") or
+      die "Can't open the test file $outfile: $!";
+}
+else {
+    $outfh = \*STDOUT;
+}
+
+
+
+foreach my $test (@tests, @examples) {
+    print $outfh "$test\n";
+}
+
+print $outfh "1;\n";
+
+=pod
+
+=head1 BUGS and CAVEATS
+
+This is a very simple rough cut.  It only does very rudimentary tests
+on the examples.
+
+=head1 AUTHOR
+
+
+
+Based on pod2tests by Michael G Schwern <schwern@pobox.com>
+
+=head1 SEE ALSO
+
+L<Test::Inline>
+
+=cut
+
+1;
diff --git a/rt/sbin/factory b/rt/sbin/factory
new file mode 100644 (file)
index 0000000..8abb192
--- /dev/null
@@ -0,0 +1,427 @@
+#!/usr/bin/perl
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 DBI;
+
+my $database  = shift;
+my $namespace = shift;
+
+my $CollectionBaseclass = 'RT::SearchBuilder';
+my $RecordBaseclass     = 'RT::Record';
+
+my $driver   = 'mysql';
+my $hostname = 'localhost';
+my $user     = 'root';
+my $password = '';
+
+
+my $LicenseBlock = << '.';
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+.
+
+my $Attribution = << '.';
+# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)
+# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.  
+# 
+# !! DO NOT EDIT THIS FILE !!
+#
+
+use strict;
+.
+
+my $dsn = "DBI:$driver:database=$database;host=$hostname";
+
+my $dbh = DBI->connect( $dsn, $user, $password );
+
+#get all tables out of database
+my @tables = $dbh->tables();
+
+my ( %tablemap, $typemap, %modulemap );
+
+foreach my $table (@tables) {
+    next if ($table eq 'sessions');
+    $tablemap{$table}  = $table;
+    $modulemap{$table} = $table;
+    if ( $table =~ /^(.*)s$/ ) {
+        $tablemap{$1}  = $table;
+        $modulemap{$1} = $1;
+    }
+}
+$tablemap{'CreatedBy'} = 'User';
+$tablemap{'UpdatedBy'} = 'User';
+
+$typemap{'id'}            = 'ro';
+$typemap{'Creator'}       = 'auto';
+$typemap{'Created'}       = 'auto';
+$typemap{'Updated'}       = 'auto';
+$typemap{'UpdatedBy'}     = 'auto';
+$typemap{'LastUpdated'}   = 'auto';
+$typemap{'LastUpdatedBy'} = 'auto';
+
+foreach my $table (@tables) {
+    next if ($table eq 'sessions');
+    my $tablesingle = $table;
+    $tablesingle =~ s/s$//;
+    my $tableplural = $tablesingle . "s";
+
+    if ( $tablesingle eq 'ACL' ) {
+        $tablesingle = "ACE";
+        $tableplural = "ACL";
+    }
+
+    my %requirements;
+
+    my $CollectionClassName = $namespace . "::" . $tableplural;
+    my $RecordClassName     = $namespace . "::" . $tablesingle;
+
+    my $path = $namespace;
+    $path =~ s/::/\//g;
+
+    my $RecordClassPath     = $path . "/" . $tablesingle . ".pm";
+    my $CollectionClassPath = $path . "/" . $tableplural . ".pm";
+
+    #create a collection class
+    my $CreateInParams;
+    my $CreateOutParams;
+    my $ClassAccessible = "";
+    my $FieldsPod       = "";
+    my $CreatePod       = "";
+    my %fields;
+    my $sth = $dbh->prepare("DESCRIBE $table");
+    $sth->execute;
+
+    while ( my $row = $sth->fetchrow_hashref() ) {
+        my $field   = $row->{'Field'};
+        my $type    = $row->{'Type'};
+        my $default = $row->{'Default'};
+        $fields{$field} = 1;
+
+        #generate the 'accessible' datastructure
+
+        if ( $typemap{$field} eq 'auto' ) {
+            $ClassAccessible .= "        $field => 
+               {read => 1, auto => 1,";
+        }
+        elsif ( $typemap{$field} eq 'ro' ) {
+            $ClassAccessible .= "        $field =>
+               {read => 1,";
+        }
+        else {
+            $ClassAccessible .= "        $field => 
+               {read => 1, write => 1,";
+
+        }
+
+        $ClassAccessible .= " type => '$type', default => '$default'},\n";
+
+        #generate pod for the accessible fields
+        $FieldsPod .= "
+=head2 $field
+
+Returns the current value of $field. 
+(In the database, $field is stored as $type.)
+
+";
+
+        unless ( $typemap{$field} eq 'auto' || $typemap{$field} eq 'ro' ) {
+            $FieldsPod .= "
+
+=head2 Set$field VALUE
+
+
+Set $field to VALUE. 
+Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
+(In the database, $field will be stored as a $type.)
+
+";
+        }
+
+        $FieldsPod .= "
+=cut
+
+";
+
+        if ( $modulemap{$field} ) {
+            $FieldsPod .= "
+=head2 ${field}Obj
+
+Returns the $modulemap{$field} Object which has the id returned by $field
+
+
+=cut
+
+sub ${field}Obj {
+       my \$self = shift;
+       my \$$field =  ${namespace}::$modulemap{$field}->new(\$self->CurrentUser);
+       \$$field->Load(\$self->__Value('$field'));
+       return(\$$field);
+}
+";
+            $requirements{ $tablemap{$field} } =
+              "use ${namespace}::$modulemap{$field};";
+
+        }
+
+        unless ( $typemap{$field} eq 'auto' || $field eq 'id' ) {
+
+            #generate create statement
+            $CreateInParams .= "                $field => '$default',\n";
+            $CreateOutParams .=
+              "                         $field => \$args{'$field'},\n";
+
+            #gerenate pod for the create statement     
+            $CreatePod .= "  $type '$field'";
+            $CreatePod .= " defaults to '$default'" if ($default);
+            $CreatePod .= ".\n";
+
+        }
+
+    }
+
+    $Create = "
+sub Create {
+    my \$self = shift;
+    my \%args = ( 
+$CreateInParams
+                 \@_);
+    \$self->SUPER::Create(
+$CreateOutParams);
+
+}
+";
+    $CreatePod .= "\n=cut\n\n";
+
+    my $CollectionClass = $LicenseBlock . $Attribution .
+
+      "
+
+=head1 NAME
+
+  $CollectionClassName -- Class Description
+=head1 SYNOPSIS
+
+  use $CollectionClassName
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=cut
+
+package $CollectionClassName;
+
+use $CollectionBaseclass;
+use $RecordClassName;
+
+use vars qw( \@ISA );
+\@ISA= qw($CollectionBaseclass);
+
+
+sub _Init {
+    my \$self = shift;
+    \$self->{'table'} = '$table';
+    \$self->{'primary_key'} = 'id';
+
+";
+
+    if ( $fields{'SortOrder'} ) {
+
+        $CollectionClass .= "
+
+  # By default, order by name
+  \$self->OrderBy( ALIAS => 'main',
+                  FIELD => 'SortOrder',
+                  ORDER => 'ASC');
+";
+    }
+    $CollectionClass .= "
+    return ( \$self->SUPER::_Init(\@_) );
+}
+
+
+=head2 NewItem
+
+Returns an empty new $RecordClassName item
+
+=cut
+
+sub NewItem {
+    my \$self = shift;
+    return($RecordClassName->new(\$self->CurrentUser));
+}
+" . MagicImport($CollectionClassName);
+
+    my $RecordClassHeader = $Attribution . "
+
+=head1 NAME
+
+$RecordClassName
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=cut
+
+package $RecordClassName;
+use $RecordBaseclass; 
+";
+
+    foreach my $key ( keys %requirements ) {
+        $RecordClassHeader .= $requirements{$key} . "\n";
+    }
+    $RecordClassHeader .= "
+
+use vars qw( \@ISA );
+\@ISA= qw( $RecordBaseclass );
+
+sub _Init {
+  my \$self = shift; 
+
+  \$self->Table('$table');
+  \$self->SUPER::_Init(\@_);
+}
+
+";
+
+    my $RecordClass = $LicenseBlock .  $RecordClassHeader . "
+
+$RecordInit
+
+=head2 Create PARAMHASH
+
+Create takes a hash of values and creates a row in the database:
+
+$CreatePod
+
+$Create
+
+$FieldsPod
+
+sub _ClassAccessible {
+    {
+     
+$ClassAccessible
+ }
+};
+
+" . MagicImport($RecordClassName);
+
+    print "About to make $RecordClassPath, $CollectionClassPath\n";
+    `mkdir -p $path`;
+
+    open( RECORD, ">$RecordClassPath" );
+    print RECORD $RecordClass;
+    close(RECORD);
+
+    open( COL, ">$CollectionClassPath" );
+    print COL $CollectionClass;
+    close($COL);
+
+}
+
+sub MagicImport {
+    my $class = shift;
+
+    #if (exists \$warnings::{unimport})  {
+    #        no warnings qw(redefine);
+
+    my $path = $class;
+    $path =~ s#::#/#gi;
+
+
+    my $content = "
+        eval \"require @{[$class]}_Overlay\";
+        if (\$@ && \$@ !~ qr{^Can't locate ".$path."_Overlay.pm}) {
+            die \$@;
+        };
+
+        eval \"require @{[$class]}_Vendor\";
+        if (\$@ && \$@ !~ qr{^Can't locate ".$path."_Vendor.pm}) {
+            die \$@;
+        };
+
+        eval \"require @{[$class]}_Local\";
+        if (\$@ && \$@ !~ qr{^Can't locate ".$path."_Local.pm}) {
+            die \$@;
+        };
+
+
+
+
+=head1 SEE ALSO
+
+This class allows \"overlay\" methods to be placed
+into the following files _Overlay is for a System overlay by the original author,
+_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.  
+
+These overlay files can contain new subs or subs to replace existing subs in this module.
+
+If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+
+   no warnings qw(redefine);
+
+so that perl does not kick and scream when you redefine a subroutine or variable in your overlay.
+
+@{[$class]}_Overlay, @{[$class]}_Vendor, @{[$class]}_Local
+
+=cut
+
+
+1;
+";
+
+    return $content;
+}
+
+# }}}
+
diff --git a/rt/sbin/license_tag b/rt/sbin/license_tag
new file mode 100644 (file)
index 0000000..33da2e0
--- /dev/null
@@ -0,0 +1,196 @@
+#!/usr/bin/perl
+
+
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+my $LICENSE  = <<EOL;
+
+Copyright (c) 1996-2003 Jesse Vincent <jesse\@bestpractical.com>
+
+(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.
+
+
+EOL
+
+use File::Find;
+
+my @MAKE = qw(Makefile);
+
+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 ('README');
+
+
+sub tag_mason {
+        my $pm = $_;
+        next unless (-f $pm);
+        next if ($pm =~ /images/);
+        open(FILE,"<$pm") || die "Failed to open $pm";
+        my $file = (join "", <FILE>); 
+        close (FILE);
+        my $pmlic = $LICENSE;
+        $pmlic =~ s/^/%# /mg;
+
+
+        print "$pm - ";
+        if ($file =~ /^%# BEGIN LICENSE BLOCK/ms) {
+                print "has license section";
+             $file =~ s/^%# BEGIN LICENSE BLOCK(.*?)%# END LICENSE BLOCK/%# BEGIN LICENSE BLOCK\n$pmlic%# END LICENSE BLOCK/ms;
+             
+
+        } else {
+                print "no license section";
+             $file ="%# BEGIN LICENSE BLOCK\n$pmlic%# END LICENSE BLOCK\n". $file;
+        }
+        $file =~ s/%# END LICENSE BLOCK(\n+)/%# END LICENSE BLOCK\n/mg;
+        print "\n";
+        
+        
+
+
+        open (FILE, ">$pm") || die "couldn't write new file";
+        print FILE $file;
+        close FILE;
+
+}
+
+
+sub tag_makefile {
+        my $pm = shift;
+        open(FILE,"<$pm") || die "Failed to open $pm";
+        my $file = (join "", <FILE>); 
+        close (FILE);
+        my $pmlic = $LICENSE;
+        $pmlic =~ s/^/# /mg;
+
+
+        print "$pm - ";
+        if ($file =~ /^# BEGIN LICENSE BLOCK/ms) {
+                print "has license section";
+             $file =~ s/^# BEGIN LICENSE BLOCK(.*?)# END LICENSE BLOCK/# BEGIN LICENSE BLOCK\n$pmlic# END LICENSE BLOCK/ms;
+             
+
+        } else {
+                print "no license section";
+             $file ="# BEGIN LICENSE BLOCK\n$pmlic# END LICENSE BLOCK\n". $file;
+        }
+        $file =~ s/# END LICENSE BLOCK(\n+)/# END LICENSE BLOCK\n/mg;
+        print "\n";
+        
+        
+
+
+        open (FILE, ">$pm") || die "couldn't write new file";
+        print FILE $file;
+        close FILE;
+
+}
+
+
+sub tag_pm {
+        my $pm = $_;
+        next unless $pm =~ /\.pm\z/s;
+        open(FILE,"<$pm") || die "Failed to open $pm";
+        my $file = (join "", <FILE>); 
+        close (FILE);
+        my $pmlic = $LICENSE;
+        $pmlic =~ s/^/# /mg;
+
+
+        print "$pm - ";
+        if ($file =~ /^# BEGIN LICENSE BLOCK/ms) {
+                print "has license section";
+             $file =~ s/^# BEGIN LICENSE BLOCK(.*?)# END LICENSE BLOCK/# BEGIN LICENSE BLOCK\n$pmlic# END LICENSE BLOCK/ms;
+             
+
+        } else {
+                print "no license section";
+             $file ="# BEGIN LICENSE BLOCK\n$pmlic# END LICENSE BLOCK\n". $file;
+        }
+        $file =~ s/# END LICENSE BLOCK(\n+)/# END LICENSE BLOCK\n/mg;
+        print "\n";
+        
+        
+
+
+        open (FILE, ">$pm") || die "couldn't write new file $pm";
+        print FILE $file;
+        close FILE;
+
+}
+
+
+sub tag_script {
+        my $pm = $_;
+        return unless (-f $pm);
+        open(FILE,"<$pm") || die "Failed to open $pm";
+        my $file = (join "", <FILE>); 
+        close (FILE);
+        my $pmlic = $LICENSE;
+        $pmlic =~ s/^/# /msg;
+
+        print "$pm - ";
+        if ($file =~ /^# BEGIN LICENSE BLOCK/ms) {
+                print "has license section";
+             $file =~ s/^# BEGIN LICENSE BLOCK(.*?)# END LICENSE BLOCK/# BEGIN LICENSE BLOCK\n$pmlic# END LICENSE BLOCK/ms;
+             
+
+        } else {
+                print "no license section";
+                if ($file =~ /^(#!.*?)\n/) {
+
+            my  $lic ="# BEGIN LICENSE BLOCK\n$pmlic# END LICENSE BLOCK\n";
+                $file =~ s/^(#!.*?)\n/$1\n$lic/; 
+
+                } 
+        }
+        $file =~ s/# END LICENSE BLOCK(\n+)/# END LICENSE BLOCK\n\n/mg;
+        print "\n";
+        
+
+        open (FILE, ">$pm") || die "couldn't write new file";
+        print FILE $file;
+        close FILE;
+
+}
+
diff --git a/rt/sbin/regression_harness b/rt/sbin/regression_harness
new file mode 100644 (file)
index 0000000..fc1e293
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+open (FH,"make regression|");
+
+my $skip_frontmatter = 1;
+while (<FH>) {
+        next if /^ok/;
+       $skip_frontmatter = 0 if (/autogen/);
+        print $_ unless ($skip_frontmatter);
+}
diff --git a/rt/sbin/rt-setup-database b/rt/sbin/rt-setup-database
new file mode 100644 (file)
index 0000000..f84f290
--- /dev/null
@@ -0,0 +1,585 @@
+#!/usr/bin/perl -w
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 vars qw($PROMPT $VERSION $Handle $Nobody $SystemUser $item);
+use vars
+  qw(@Groups @Users @ACL @Queues @ScripActions @ScripConditions @Templates @CustomFields @Scrips);
+
+use lib "/opt/rt3/lib";
+
+#This drags in  RT's config.pm
+# We do it in a begin block because RT::Handle needs to know the type to do its
+# inheritance
+use RT;
+use Carp;
+use RT::User;
+use RT::CurrentUser;
+use RT::Template;
+use RT::ScripAction;
+use RT::ACE;
+use RT::Group;
+use RT::User;
+use RT::Queue;
+use RT::ScripCondition;
+use RT::CustomField;
+use RT::Scrip;
+
+RT::LoadConfig();
+use Term::ReadKey;
+use Getopt::Long;
+
+my %args;
+
+GetOptions(
+    \%args,
+    'prompt-for-dba-password', 'force', 'debug',
+    'action=s',                'dba=s', 'dba-password=s', 'datafile=s',
+    'datadir=s'
+);
+
+$| = 1;    #unbuffer that output.
+
+require RT::Handle;
+my $Handle = RT::Handle->new($RT::DatabaseType);
+$Handle->BuildDSN;
+my $dbh;
+
+if ( $args{'prompt-for-dba-password'} ) {
+    $args{'dba-password'} = get_dba_password();
+    chomp( $args{'dba-password'} );
+}
+
+unless ( $args{'action'} ) {
+    help();
+    die;
+}
+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";
+    create_db();
+
+    $dbh->disconnect;
+    $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
+      || die $DBI::errstr;
+
+    print "Now populating database schema.\n";
+    insert_schema();
+    print "Now inserting database ACLs\n";
+    insert_acl();
+    print "Now inserting RT core system objects\n";
+    insert_initial_data();
+    print "Now inserting RT data\n";
+    insert_data( $RT::EtcPath . "/initialdata" );
+}
+elsif ( $args{'action'} eq 'drop' ) {
+    unless ( $dbh =
+         DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) )
+    {
+        warn $DBI::errstr;
+        warn "Database doesn't appear to exist. Aborting database drop.";
+        exit(0);
+    }
+    drop_db();
+}
+elsif ( $args{'action'} eq 'insert' ) {
+    insert_data( $args{'datafile'} );
+}
+elsif ($args{'action'} eq 'acl') {
+    $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
+      || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
+     insert_acl($args{'datadir'});
+}
+elsif ($args{'action'} eq 'schema') {
+    $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
+      || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
+        insert_schema($args{'datadir'});
+}
+
+else {
+    print STDERR '$0 called with an invalid --action parameter';
+    exit(-1);
+}
+
+# {{{ sub insert_schema
+sub insert_schema {
+        my $base_path = (shift || $RT::EtcPath);
+    my (@schema);
+    print "Creating database schema.\n";
+
+    if ( -f $base_path . "/schema." . $RT::DatabaseType ) {
+       no warnings 'unopened';
+
+        open( SCHEMA, "<" . $base_path . "/schema." . $RT::DatabaseType );
+        open( SCHEMA_LOCAL, "<" . $RT::LocalEtcPath . "/schema." . $RT::DatabaseType );
+
+        my $statement = "";
+        foreach my $line (<SCHEMA>, <SCHEMA_LOCAL>) {
+            $line =~ s/\#.*//g;
+            $statement .= $line;
+            if ( $line =~ /;(\s*)$/ ) {
+                $statement =~ s/;(\s*)$//g;
+                push @schema, $statement;
+                $statement = "";
+            }
+        }
+
+        foreach my $statement (@schema) {
+            print STDERR $statement if $args{'debug'};
+            my $sth = $dbh->prepare($statement) or die $dbh->errstr;
+            unless ( $sth->execute ) {
+                die "Problem with statement:\n $statement\n" . $sth->errstr;
+            }
+        }
+
+    }
+    else {
+        die "Couldn't find schema file for " . $RT::DatabaseType . "\n";
+    }
+    print "schema sucessfully inserted\n";
+
+}
+
+# }}}
+
+# {{{ sub drop_db
+sub drop_db {
+    return if ( $RT::DatabaseType eq 'SQLite' );
+    unless ( $args{'force'} ) {
+        print <<END;
+
+About to drop $RT::DatabaseType database $RT::DatabaseName on $RT::DatabaseHost.
+WARNING: This will erase all data in $RT::DatabaseName.
+
+END
+        exit unless _yesno();
+
+    }
+
+    print "Dropping $RT::DatabaseType database $RT::DatabaseName.\n";
+
+    $dbh->do("Drop DATABASE $RT::DatabaseName") or warn $DBI::errstr;
+}
+
+# }}}
+
+# {{{ sub create_db
+sub create_db {
+    print "Creating $RT::DatabaseType database $RT::DatabaseName.\n";
+    if ( $RT::DatabaseType eq 'SQLite' ) {
+        return;
+    }
+    elsif ( $RT::DatabaseType eq 'Pg' ) {
+        $dbh->do("CREATE DATABASE $RT::DatabaseName WITH ENCODING='UNICODE'");
+        if ($DBI::errstr) {
+            $dbh->do("CREATE DATABASE $RT::DatabaseName") || die $DBI::errstr;
+        }
+    }
+    else {
+        $dbh->do("CREATE DATABASE $RT::DatabaseName") or die $DBI::errstr;
+    }
+}
+
+# }}}
+
+sub get_dba_password {
+    print
+"In order to create a new database and grant RT access to that database,\n";
+    print "this script needs to connect to your "
+      . $RT::DatabaseType
+      . " instance on "
+      . $RT::DatabaseHost . " as "
+      . $args{'dba'} . ".\n";
+    print
+"Please specify that user's database password below. If the user has no database\n";
+    print "password, just press return.\n\n";
+    print "Password: ";
+    ReadMode('noecho');
+    my $password = ReadLine(0);
+    ReadMode('normal');
+    return ($password);
+}
+
+# {{{ sub _yesno
+sub _yesno {
+    print "Proceed [y/N]:";
+    my $x = scalar(<STDIN>);
+    $x =~ /^y/i;
+}
+
+# }}}
+
+# {{{ insert_acls
+sub insert_acl {
+
+        my $base_path = (shift || $RT::EtcPath);
+
+    if ( $RT::DatabaseType =~ /^oracle$/i ) {
+        do $base_path . "/acl.Oracle"
+          || die "Couldn't find ACLS for Oracle\n" . $@;
+    }
+    elsif ( $RT::DatabaseType =~ /^pg$/i ) {
+        do $base_path . "/acl.Pg" || die "Couldn't find ACLS for Pg\n" . $@;
+    }
+    elsif ( $RT::DatabaseType =~ /^mysql$/i ) {
+        do $base_path . "/acl.mysql"
+          || die "Couldn't find ACLS for mysql in " . $RT::EtcPath . "\n" . $@;
+    }
+    elsif ( $RT::DatabaseType =~ /^SQLite$/i ) {
+        return;
+    }
+    else {
+        die "Unknown RT database type";
+    }
+
+    my @acl = acl($dbh);
+    foreach my $statement (@acl) {
+        print STDERR $statement if $args{'debug'};
+        my $sth = $dbh->prepare($statement) or die $dbh->errstr;
+        unless ( $sth->execute ) {
+            die "Problem with statement:\n $statement\n" . $sth->errstr;
+        }
+    }
+}
+
+# }}}
+
+=head2 get_system_dsn
+
+Returns a dsn suitable for database creates and drops
+and user creates and drops
+
+=cut
+
+sub get_system_dsn {
+
+    my $dsn = $Handle->DSN;
+
+    #with mysql, you want to connect sans database to funge things
+    if ( $RT::DatabaseType eq 'mysql' ) {
+        $dsn =~ s/dbname=$RT::DatabaseName//;
+
+        # with postgres, you want to connect to database1
+    }
+    elsif ( $RT::DatabaseType eq 'Pg' ) {
+        $dsn =~ s/dbname=$RT::DatabaseName/dbname=template1/;
+    }
+    return $dsn;
+}
+
+sub insert_initial_data {
+
+    RT::InitLogging();
+
+    #connect to the db, for actual RT work
+    require RT::Handle;
+    $RT::Handle = RT::Handle->new();
+    $RT::Handle->Connect();
+
+    #Put together a current user object so we can create a User object
+    my $CurrentUser = new RT::CurrentUser();
+
+    print "Checking for existing system user...";
+    my $test_user = RT::User->new($CurrentUser);
+    $test_user->Load('RT_System');
+    if ( $test_user->id ) {
+        print "found!\n\nYou appear to have a functional RT database.\n"
+          . "Exiting, so as not to clobber your existing data.\n";
+        exit(-1);
+
+    }
+    else {
+        print "not found.  This appears to be a new installation.\n";
+    }
+
+    print "Creating system user...";
+    my $RT_System = new RT::User($CurrentUser);
+
+    my ( $val, $msg ) = $RT_System->_BootstrapCreate(
+        Name     => 'RT_System',
+        RealName => 'The RT System itself',
+        Comments =>
+'Do not delete or modify this user. It is integral to RT\'s internal database structures',
+        Creator => '1' );
+
+    unless ($val) {
+        print "$msg\n";
+        exit(1);
+    }
+    print "done.\n";
+    $RT::Handle->dbh->disconnect();
+
+}
+
+# load some sort of data into the database
+
+sub insert_data {
+    my $datafile = shift;
+
+    #Connect to the database and get RT::SystemUser and RT::Nobody loaded
+    RT::Init;
+
+    my $CurrentUser = RT::CurrentUser->new();
+    $CurrentUser->LoadByName('RT_System');
+
+    if ( $datafile eq $RT::EtcPath . "/initialdata" ) {
+
+        print "Creating Superuser  ACL...";
+
+        my $superuser_ace = RT::ACE->new($CurrentUser);
+        $superuser_ace->_BootstrapCreate(
+                             PrincipalId => ACLEquivGroupId( $CurrentUser->Id ),
+                             PrincipalType => 'Group',
+                             RightName     => 'SuperUser',
+                             ObjectType    => 'RT::System',
+                             ObjectId      => '1' );
+
+    }
+
+    # Slurp in stuff to insert from the datafile. Possible things to go in here:-
+    # @groups, @users, @acl, @queues, @ScripActions, @ScripConditions, @templates
+
+    require $datafile
+      || die "Couldn't find initial data for import\n" . $@;
+
+    if (@Groups) {
+        print "Creating groups...";
+        foreach $item (@Groups) {
+            my $new_entry = RT::Group->new($CurrentUser);
+            my ( $return, $msg ) = $new_entry->_Create(%$item);
+            print "(Error: $msg)" unless ($return);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@Users) {
+        print "Creating users...";
+        foreach $item (@Users) {
+            my $new_entry = new RT::User($CurrentUser);
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            print "(Error: $msg)" unless ($return);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@Queues) {
+        print "Creating queues...";
+        for $item (@Queues) {
+            my $new_entry = new RT::Queue($CurrentUser);
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            print "(Error: $msg)" unless ($return);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@ACL) {
+        print "Creating ACL...";
+        for my $item (@ACL) {
+
+           my ($princ, $object);
+
+           # Global rights or Queue rights?
+           if ($item->{'Queue'}) {
+                $object = RT::Queue->new($CurrentUser);
+                $object->Load( $item->{'Queue'} );
+           } else {
+               $object = $RT::System;
+           }
+
+           # Group rights or user rights?
+           if ($item->{'GroupDomain'}) {
+                $princ = RT::Group->new($CurrentUser);
+               if ($item->{'GroupDomain'} eq 'UserDefined') {
+                  $princ->LoadUserDefinedGroup( $item->{'GroupId'} );
+               } elsif ($item->{'GroupDomain'} eq 'SystemInternal') {
+                  $princ->LoadSystemInternalGroup( $item->{'GroupType'} );
+               } elsif ($item->{'GroupDomain'} eq 'RT::Queue-Role' &&
+                        $item->{'Queue'}) {
+                  $princ->LoadQueueRoleGroup( Type => $item->{'GroupType'},
+                                             Queue => $object->id);
+               } else {
+                  $princ->Load( $item->{'GroupId'} );
+               }
+           } else {
+               $princ = RT::User->new($CurrentUser);
+               $princ->Load( $item->{'UserId'} );
+           }
+
+           # Grant it
+           my ( $return, $msg ) = $princ->PrincipalObj->GrantRight(
+                                                     Right => $item->{'Right'},
+                                                     Object => $object );
+
+            if ($return) {
+                print $return. ".";
+            }
+            else {
+                print $msg . ".";
+
+            }
+
+        }
+        print "done.\n";
+    }
+    if (@CustomFields) {
+        print "Creating custom fields...";
+        for $item (@CustomFields) {
+            my $new_entry = new RT::CustomField($CurrentUser);
+            my $values    = $item->{'Values'};
+            delete $item->{'Values'};
+            my $q     = $item->{'Queue'};
+            my $q_obj = RT::Queue->new($CurrentUser);
+            $q_obj->Load($q);
+            if ( $q_obj->Id ) {
+                $item->{'Queue'} = $q_obj->Id;
+            }
+            elsif ( $q == 0 ) {
+                $item->{'Queue'} = 0;
+            }
+            else {
+                print "(Error: Could not find queue " . $q . ")\n"
+                  unless ( $q_obj->Id );
+                next;
+            }
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+
+            foreach my $value ( @{$values} ) {
+                my ( $eval, $emsg ) = $new_entry->AddValue(%$value);
+                print "(Error: $emsg)\n" unless ($eval);
+            }
+
+            print "(Error: $msg)\n" unless ($return);
+            print $return. ".";
+        }
+
+        print "done.\n";
+    }
+
+    if (@ScripActions) {
+        print "Creating ScripActions...";
+
+        for $item (@ScripActions) {
+            my $new_entry = RT::ScripAction->new($CurrentUser);
+            my $return    = $new_entry->Create(%$item);
+            print $return. ".";
+        }
+
+        print "done.\n";
+    }
+
+    if (@ScripConditions) {
+        print "Creating ScripConditions...";
+
+        for $item (@ScripConditions) {
+            my $new_entry = RT::ScripCondition->new($CurrentUser);
+            my $return    = $new_entry->Create(%$item);
+            print $return. ".";
+        }
+
+        print "done.\n";
+    }
+
+    if (@Templates) {
+        print "Creating templates...";
+
+        for $item (@Templates) {
+            my $new_entry = new RT::Template($CurrentUser);
+            my $return    = $new_entry->Create(%$item);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@Scrips) {
+        print "Creating scrips...";
+
+        for $item (@Scrips) {
+            my $new_entry = new RT::Scrip($CurrentUser);
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            if ($return) {
+                print $return. ".";
+            }
+            else {
+                print "(Error: $msg)\n";
+            }
+        }
+        print "done.\n";
+    }
+    $RT::Handle->Disconnect();
+
+}
+
+=head2 ACLEquivGroupId
+
+Given a userid, return that user's acl equivalence group
+
+=cut
+
+sub ACLEquivGroupId {
+    my $username = shift;
+    my $user     = RT::User->new($RT::SystemUser);
+    $user->Load($username);
+    my $equiv_group = RT::Group->new($RT::SystemUser);
+    $equiv_group->LoadACLEquivalenceGroup($user);
+    return ( $equiv_group->Id );
+}
+
+sub help {
+
+    print <<EOF;
+
+$0: Set up RT's database
+
+--action        init    Initialize the database
+                drop    Drop the database. 
+                        This will ERASE ALL YOUR DATA
+                insert  Insert data into RT's database. 
+                        By default, will use RT's installation data.
+                        To use a local or supplementary datafile, specify it
+                        using the '--datafile' option below.
+                        
+                acl     Initialize only the database ACLs
+                        To use a local or supplementary datafile, specify it
+                        using the '--datadir' option below.
+                        
+                schema  Initialize only the database schema
+                        To use a local or supplementary datafile, specify it
+                        using the '--datadir' option below.
+
+--datafile /path/to/datafile
+--datadir /path/to/              Used to specify a path to find the local
+                                database schema and acls to be installed.
+
+
+--dba                           dba's username
+--dba-password                  dba's password
+--prompt-for-dba-password       Ask for the database administrator's password interactively
+
+
+EOF
+
+}
+
+1;
diff --git a/rt/sbin/rt-setup-database.in b/rt/sbin/rt-setup-database.in
new file mode 100644 (file)
index 0000000..e49a32e
--- /dev/null
@@ -0,0 +1,585 @@
+#!@PERL@ -w
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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 vars qw($PROMPT $VERSION $Handle $Nobody $SystemUser $item);
+use vars
+  qw(@Groups @Users @ACL @Queues @ScripActions @ScripConditions @Templates @CustomFields @Scrips);
+
+use lib "@RT_LIB_PATH@";
+
+#This drags in  RT's config.pm
+# We do it in a begin block because RT::Handle needs to know the type to do its
+# inheritance
+use RT;
+use Carp;
+use RT::User;
+use RT::CurrentUser;
+use RT::Template;
+use RT::ScripAction;
+use RT::ACE;
+use RT::Group;
+use RT::User;
+use RT::Queue;
+use RT::ScripCondition;
+use RT::CustomField;
+use RT::Scrip;
+
+RT::LoadConfig();
+use Term::ReadKey;
+use Getopt::Long;
+
+my %args;
+
+GetOptions(
+    \%args,
+    'prompt-for-dba-password', 'force', 'debug',
+    'action=s',                'dba=s', 'dba-password=s', 'datafile=s',
+    'datadir=s'
+);
+
+$| = 1;    #unbuffer that output.
+
+require RT::Handle;
+my $Handle = RT::Handle->new($RT::DatabaseType);
+$Handle->BuildDSN;
+my $dbh;
+
+if ( $args{'prompt-for-dba-password'} ) {
+    $args{'dba-password'} = get_dba_password();
+    chomp( $args{'dba-password'} );
+}
+
+unless ( $args{'action'} ) {
+    help();
+    die;
+}
+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";
+    create_db();
+
+    $dbh->disconnect;
+    $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
+      || die $DBI::errstr;
+
+    print "Now populating database schema.\n";
+    insert_schema();
+    print "Now inserting database ACLs\n";
+    insert_acl();
+    print "Now inserting RT core system objects\n";
+    insert_initial_data();
+    print "Now inserting RT data\n";
+    insert_data( $RT::EtcPath . "/initialdata" );
+}
+elsif ( $args{'action'} eq 'drop' ) {
+    unless ( $dbh =
+         DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) )
+    {
+        warn $DBI::errstr;
+        warn "Database doesn't appear to exist. Aborting database drop.";
+        exit(0);
+    }
+    drop_db();
+}
+elsif ( $args{'action'} eq 'insert' ) {
+    insert_data( $args{'datafile'} );
+}
+elsif ($args{'action'} eq 'acl') {
+    $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
+      || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
+     insert_acl($args{'datadir'});
+}
+elsif ($args{'action'} eq 'schema') {
+    $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
+      || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
+        insert_schema($args{'datadir'});
+}
+
+else {
+    print STDERR '$0 called with an invalid --action parameter';
+    exit(-1);
+}
+
+# {{{ sub insert_schema
+sub insert_schema {
+        my $base_path = (shift || $RT::EtcPath);
+    my (@schema);
+    print "Creating database schema.\n";
+
+    if ( -f $base_path . "/schema." . $RT::DatabaseType ) {
+       no warnings 'unopened';
+
+        open( SCHEMA, "<" . $base_path . "/schema." . $RT::DatabaseType );
+        open( SCHEMA_LOCAL, "<" . $RT::LocalEtcPath . "/schema." . $RT::DatabaseType );
+
+        my $statement = "";
+        foreach my $line (<SCHEMA>, <SCHEMA_LOCAL>) {
+            $line =~ s/\#.*//g;
+            $statement .= $line;
+            if ( $line =~ /;(\s*)$/ ) {
+                $statement =~ s/;(\s*)$//g;
+                push @schema, $statement;
+                $statement = "";
+            }
+        }
+
+        foreach my $statement (@schema) {
+            print STDERR $statement if $args{'debug'};
+            my $sth = $dbh->prepare($statement) or die $dbh->errstr;
+            unless ( $sth->execute ) {
+                die "Problem with statement:\n $statement\n" . $sth->errstr;
+            }
+        }
+
+    }
+    else {
+        die "Couldn't find schema file for " . $RT::DatabaseType . "\n";
+    }
+    print "schema sucessfully inserted\n";
+
+}
+
+# }}}
+
+# {{{ sub drop_db
+sub drop_db {
+    return if ( $RT::DatabaseType eq 'SQLite' );
+    unless ( $args{'force'} ) {
+        print <<END;
+
+About to drop $RT::DatabaseType database $RT::DatabaseName on $RT::DatabaseHost.
+WARNING: This will erase all data in $RT::DatabaseName.
+
+END
+        exit unless _yesno();
+
+    }
+
+    print "Dropping $RT::DatabaseType database $RT::DatabaseName.\n";
+
+    $dbh->do("Drop DATABASE $RT::DatabaseName") or warn $DBI::errstr;
+}
+
+# }}}
+
+# {{{ sub create_db
+sub create_db {
+    print "Creating $RT::DatabaseType database $RT::DatabaseName.\n";
+    if ( $RT::DatabaseType eq 'SQLite' ) {
+        return;
+    }
+    elsif ( $RT::DatabaseType eq 'Pg' ) {
+        $dbh->do("CREATE DATABASE $RT::DatabaseName WITH ENCODING='UNICODE'");
+        if ($DBI::errstr) {
+            $dbh->do("CREATE DATABASE $RT::DatabaseName") || die $DBI::errstr;
+        }
+    }
+    else {
+        $dbh->do("CREATE DATABASE $RT::DatabaseName") or die $DBI::errstr;
+    }
+}
+
+# }}}
+
+sub get_dba_password {
+    print
+"In order to create a new database and grant RT access to that database,\n";
+    print "this script needs to connect to your "
+      . $RT::DatabaseType
+      . " instance on "
+      . $RT::DatabaseHost . " as "
+      . $args{'dba'} . ".\n";
+    print
+"Please specify that user's database password below. If the user has no database\n";
+    print "password, just press return.\n\n";
+    print "Password: ";
+    ReadMode('noecho');
+    my $password = ReadLine(0);
+    ReadMode('normal');
+    return ($password);
+}
+
+# {{{ sub _yesno
+sub _yesno {
+    print "Proceed [y/N]:";
+    my $x = scalar(<STDIN>);
+    $x =~ /^y/i;
+}
+
+# }}}
+
+# {{{ insert_acls
+sub insert_acl {
+
+        my $base_path = (shift || $RT::EtcPath);
+
+    if ( $RT::DatabaseType =~ /^oracle$/i ) {
+        do $base_path . "/acl.Oracle"
+          || die "Couldn't find ACLS for Oracle\n" . $@;
+    }
+    elsif ( $RT::DatabaseType =~ /^pg$/i ) {
+        do $base_path . "/acl.Pg" || die "Couldn't find ACLS for Pg\n" . $@;
+    }
+    elsif ( $RT::DatabaseType =~ /^mysql$/i ) {
+        do $base_path . "/acl.mysql"
+          || die "Couldn't find ACLS for mysql in " . $RT::EtcPath . "\n" . $@;
+    }
+    elsif ( $RT::DatabaseType =~ /^SQLite$/i ) {
+        return;
+    }
+    else {
+        die "Unknown RT database type";
+    }
+
+    my @acl = acl($dbh);
+    foreach my $statement (@acl) {
+        print STDERR $statement if $args{'debug'};
+        my $sth = $dbh->prepare($statement) or die $dbh->errstr;
+        unless ( $sth->execute ) {
+            die "Problem with statement:\n $statement\n" . $sth->errstr;
+        }
+    }
+}
+
+# }}}
+
+=head2 get_system_dsn
+
+Returns a dsn suitable for database creates and drops
+and user creates and drops
+
+=cut
+
+sub get_system_dsn {
+
+    my $dsn = $Handle->DSN;
+
+    #with mysql, you want to connect sans database to funge things
+    if ( $RT::DatabaseType eq 'mysql' ) {
+        $dsn =~ s/dbname=$RT::DatabaseName//;
+
+        # with postgres, you want to connect to database1
+    }
+    elsif ( $RT::DatabaseType eq 'Pg' ) {
+        $dsn =~ s/dbname=$RT::DatabaseName/dbname=template1/;
+    }
+    return $dsn;
+}
+
+sub insert_initial_data {
+
+    RT::InitLogging();
+
+    #connect to the db, for actual RT work
+    require RT::Handle;
+    $RT::Handle = RT::Handle->new();
+    $RT::Handle->Connect();
+
+    #Put together a current user object so we can create a User object
+    my $CurrentUser = new RT::CurrentUser();
+
+    print "Checking for existing system user...";
+    my $test_user = RT::User->new($CurrentUser);
+    $test_user->Load('RT_System');
+    if ( $test_user->id ) {
+        print "found!\n\nYou appear to have a functional RT database.\n"
+          . "Exiting, so as not to clobber your existing data.\n";
+        exit(-1);
+
+    }
+    else {
+        print "not found.  This appears to be a new installation.\n";
+    }
+
+    print "Creating system user...";
+    my $RT_System = new RT::User($CurrentUser);
+
+    my ( $val, $msg ) = $RT_System->_BootstrapCreate(
+        Name     => 'RT_System',
+        RealName => 'The RT System itself',
+        Comments =>
+'Do not delete or modify this user. It is integral to RT\'s internal database structures',
+        Creator => '1' );
+
+    unless ($val) {
+        print "$msg\n";
+        exit(1);
+    }
+    print "done.\n";
+    $RT::Handle->dbh->disconnect();
+
+}
+
+# load some sort of data into the database
+
+sub insert_data {
+    my $datafile = shift;
+
+    #Connect to the database and get RT::SystemUser and RT::Nobody loaded
+    RT::Init;
+
+    my $CurrentUser = RT::CurrentUser->new();
+    $CurrentUser->LoadByName('RT_System');
+
+    if ( $datafile eq $RT::EtcPath . "/initialdata" ) {
+
+        print "Creating Superuser  ACL...";
+
+        my $superuser_ace = RT::ACE->new($CurrentUser);
+        $superuser_ace->_BootstrapCreate(
+                             PrincipalId => ACLEquivGroupId( $CurrentUser->Id ),
+                             PrincipalType => 'Group',
+                             RightName     => 'SuperUser',
+                             ObjectType    => 'RT::System',
+                             ObjectId      => '1' );
+
+    }
+
+    # Slurp in stuff to insert from the datafile. Possible things to go in here:-
+    # @groups, @users, @acl, @queues, @ScripActions, @ScripConditions, @templates
+
+    require $datafile
+      || die "Couldn't find initial data for import\n" . $@;
+
+    if (@Groups) {
+        print "Creating groups...";
+        foreach $item (@Groups) {
+            my $new_entry = RT::Group->new($CurrentUser);
+            my ( $return, $msg ) = $new_entry->_Create(%$item);
+            print "(Error: $msg)" unless ($return);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@Users) {
+        print "Creating users...";
+        foreach $item (@Users) {
+            my $new_entry = new RT::User($CurrentUser);
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            print "(Error: $msg)" unless ($return);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@Queues) {
+        print "Creating queues...";
+        for $item (@Queues) {
+            my $new_entry = new RT::Queue($CurrentUser);
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            print "(Error: $msg)" unless ($return);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@ACL) {
+        print "Creating ACL...";
+        for my $item (@ACL) {
+
+           my ($princ, $object);
+
+           # Global rights or Queue rights?
+           if ($item->{'Queue'}) {
+                $object = RT::Queue->new($CurrentUser);
+                $object->Load( $item->{'Queue'} );
+           } else {
+               $object = $RT::System;
+           }
+
+           # Group rights or user rights?
+           if ($item->{'GroupDomain'}) {
+                $princ = RT::Group->new($CurrentUser);
+               if ($item->{'GroupDomain'} eq 'UserDefined') {
+                  $princ->LoadUserDefinedGroup( $item->{'GroupId'} );
+               } elsif ($item->{'GroupDomain'} eq 'SystemInternal') {
+                  $princ->LoadSystemInternalGroup( $item->{'GroupType'} );
+               } elsif ($item->{'GroupDomain'} eq 'RT::Queue-Role' &&
+                        $item->{'Queue'}) {
+                  $princ->LoadQueueRoleGroup( Type => $item->{'GroupType'},
+                                             Queue => $object->id);
+               } else {
+                  $princ->Load( $item->{'GroupId'} );
+               }
+           } else {
+               $princ = RT::User->new($CurrentUser);
+               $princ->Load( $item->{'UserId'} );
+           }
+
+           # Grant it
+           my ( $return, $msg ) = $princ->PrincipalObj->GrantRight(
+                                                     Right => $item->{'Right'},
+                                                     Object => $object );
+
+            if ($return) {
+                print $return. ".";
+            }
+            else {
+                print $msg . ".";
+
+            }
+
+        }
+        print "done.\n";
+    }
+    if (@CustomFields) {
+        print "Creating custom fields...";
+        for $item (@CustomFields) {
+            my $new_entry = new RT::CustomField($CurrentUser);
+            my $values    = $item->{'Values'};
+            delete $item->{'Values'};
+            my $q     = $item->{'Queue'};
+            my $q_obj = RT::Queue->new($CurrentUser);
+            $q_obj->Load($q);
+            if ( $q_obj->Id ) {
+                $item->{'Queue'} = $q_obj->Id;
+            }
+            elsif ( $q == 0 ) {
+                $item->{'Queue'} = 0;
+            }
+            else {
+                print "(Error: Could not find queue " . $q . ")\n"
+                  unless ( $q_obj->Id );
+                next;
+            }
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+
+            foreach my $value ( @{$values} ) {
+                my ( $eval, $emsg ) = $new_entry->AddValue(%$value);
+                print "(Error: $emsg)\n" unless ($eval);
+            }
+
+            print "(Error: $msg)\n" unless ($return);
+            print $return. ".";
+        }
+
+        print "done.\n";
+    }
+
+    if (@ScripActions) {
+        print "Creating ScripActions...";
+
+        for $item (@ScripActions) {
+            my $new_entry = RT::ScripAction->new($CurrentUser);
+            my $return    = $new_entry->Create(%$item);
+            print $return. ".";
+        }
+
+        print "done.\n";
+    }
+
+    if (@ScripConditions) {
+        print "Creating ScripConditions...";
+
+        for $item (@ScripConditions) {
+            my $new_entry = RT::ScripCondition->new($CurrentUser);
+            my $return    = $new_entry->Create(%$item);
+            print $return. ".";
+        }
+
+        print "done.\n";
+    }
+
+    if (@Templates) {
+        print "Creating templates...";
+
+        for $item (@Templates) {
+            my $new_entry = new RT::Template($CurrentUser);
+            my $return    = $new_entry->Create(%$item);
+            print $return. ".";
+        }
+        print "done.\n";
+    }
+    if (@Scrips) {
+        print "Creating scrips...";
+
+        for $item (@Scrips) {
+            my $new_entry = new RT::Scrip($CurrentUser);
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            if ($return) {
+                print $return. ".";
+            }
+            else {
+                print "(Error: $msg)\n";
+            }
+        }
+        print "done.\n";
+    }
+    $RT::Handle->Disconnect();
+
+}
+
+=head2 ACLEquivGroupId
+
+Given a userid, return that user's acl equivalence group
+
+=cut
+
+sub ACLEquivGroupId {
+    my $username = shift;
+    my $user     = RT::User->new($RT::SystemUser);
+    $user->Load($username);
+    my $equiv_group = RT::Group->new($RT::SystemUser);
+    $equiv_group->LoadACLEquivalenceGroup($user);
+    return ( $equiv_group->Id );
+}
+
+sub help {
+
+    print <<EOF;
+
+$0: Set up RT's database
+
+--action        init    Initialize the database
+                drop    Drop the database. 
+                        This will ERASE ALL YOUR DATA
+                insert  Insert data into RT's database. 
+                        By default, will use RT's installation data.
+                        To use a local or supplementary datafile, specify it
+                        using the '--datafile' option below.
+                        
+                acl     Initialize only the database ACLs
+                        To use a local or supplementary datafile, specify it
+                        using the '--datadir' option below.
+                        
+                schema  Initialize only the database schema
+                        To use a local or supplementary datafile, specify it
+                        using the '--datadir' option below.
+
+--datafile /path/to/datafile
+--datadir /path/to/              Used to specify a path to find the local
+                                database schema and acls to be installed.
+
+
+--dba                           dba's username
+--dba-password                  dba's password
+--prompt-for-dba-password       Ask for the database administrator's password interactively
+
+
+EOF
+
+}
+
+1;
diff --git a/rt/sbin/rt-test-dependencies b/rt/sbin/rt-test-dependencies
new file mode 100644 (file)
index 0000000..637d33a
--- /dev/null
@@ -0,0 +1,246 @@
+#!/usr/bin/perl
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+#
+# This is just a basic script that checks to make sure that all
+# the modules needed by RT before you can install it.
+#
+
+use strict;
+no warnings qw(numeric redefine);
+use Getopt::Long;
+use CPAN;
+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);
+}
+$args{'with-MASON'} = 1;
+$args{'with-CORE'} = 1;
+$args{'with-DEV'} =1; 
+$args{'with-CLI'} =1; 
+$args{'with-MAILGATE'} =1; 
+if ($] < 5.007) {
+$args{'with-I18N-COMPAT'} = 1;
+}
+
+
+sub help {
+
+print <<'.'
+
+By default, testdeps determine whether you have 
+installed all the perl modules RT needs to run.
+
+       --install               Install missing modules
+
+The following switches will tell the tool to check for specific dependencies
+
+       --with-mysql            Database interface for MySQL
+       --with-postgresql       Database interface for PostgreSQL 
+       --with-sqlite           Database interface and driver for SQLite (unsupported)
+       --with-oracle           Database interface for oracle (unsupported)
+
+       --with-fastcgi          Libraries needed to support the fastcgi handler
+       --with-speedycgi        Libraries needed to support the speedycgi handler
+       --with-modperl1         Libraries needed to support the modperl 1 handler
+       --with-modperl2         Libraries needed to support the modperl 2 handler
+
+       --with-dev              Tools needed for RT development
+.
+}
+
+
+sub _ {
+    map { /(\S+)\s*(\S*)/; $1 => ($2 ? $2 :'') } split ( /\n/, $_[0] );
+}
+
+$deps{'CORE'} = [ _( << '.') ];
+Digest::MD5
+DBI 1.18
+Test::Inline
+Class::ReturnValue 0.40
+DBIx::SearchBuilder 0.86
+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::Fuzzy
+MIME::Entity 5.108
+Mail::Mailer 1.57
+Net::SMTP
+Text::Wrapper 
+Time::ParseDate
+File::Temp
+Term::ReadKey
+Text::Autoformat
+Text::Quoted
+.
+
+$deps{'MASON'} = [ _( << '.') ];
+Params::Validate 0.02
+Cache::Cache
+Exception::Class
+HTML::Mason 1.16
+MLDBM
+Errno
+FreezeThaw
+Digest::MD5
+CGI::Cookie 1.20
+Storable
+Apache::Session 1.53
+.
+
+$deps{'MAILGATE'} = [ _( << '.') ];
+HTML::TreeBuilder
+HTML::FormatText
+Getopt::Long
+LWP::UserAgent
+.
+
+$deps{'CLI'} = [ _( << '.') ];
+Getopt::Long 2.24
+.
+
+$deps{'DEV'} = [ _( << '.') ];
+Regexp::Common
+Time::HiRes 
+Test::Inline 
+WWW::Mechanize
+.
+
+$deps{'FASTCGI'} = [ _( << '.') ];
+CGI
+FCGI
+CGI::Fast 
+.
+
+$deps{'SPEEDYCGI'} = [ _( << '.') ];
+CGI
+CGI::SpeedyCGI
+.
+
+
+$deps{'MODPERL1'} = [ _( << '.') ];
+CGI
+Apache::Request
+Apache::DBI
+.
+
+$deps{'MODPERL2'} = [ _( << '.') ];
+CGI 2.89
+Apache::DBI
+.
+
+$deps{'I18N-COMPAT'} = [ _( << '.') ];
+Text::Iconv
+Encode::compat 0.04
+.
+
+$deps{'MYSQL'} = [ _( << '.') ];
+DBD::mysql 2.1018
+.
+$deps{'ORACLE'} = [ _( << '.') ];
+DBD::Oracle
+.
+$deps{'POSTGRESQL'} = [ _( << '.') ];
+DBD::Pg
+.
+
+
+foreach my $type (keys %args)  {
+next unless ($type =~ /^with-(.*?)$/);
+my $type = $1;
+print "$type dependencies:\n";
+       my @deps = (@{$deps{$type}});
+       while (@deps) {
+               my $module = shift @deps;
+               my $version = shift @deps;
+my $ret;
+       $ret =test_dep($module, $version);      
+
+if ($args{'install'} && !$ret) {
+       resolve_dep($module);           
+}
+}
+}
+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/;
+
+       return undef;
+       } else {
+       print "...found\n";
+return 1;
+       }
+}
+
+sub resolve_dep {
+       my $module = shift;
+       use CPAN;
+       CPAN::Shell->install($module);          
+       
+}
+
+
+sub print_help {
+    print << "EOF";
+
+$0 FLAG DBTYPE
+
+
+$0 is a tool for RT that will tell you if you've got all
+the modules RT depends on properly installed.
+
+Flags: (only one flag is valid for a given run)
+
+-quiet will check to see if we've got everything we need
+       and will exit with a return code of (1) if we don't.
+
+-warn will tell you what isn't properly installed
+
+-fix will use CPANPLUS.pm or CPAN.pm to magically make everything better
+
+DBTYPE is one of:
+       oracle, pg, mysql
+
+EOF
+
+    exit(0);
+}
diff --git a/rt/sbin/rt-test-dependencies.in b/rt/sbin/rt-test-dependencies.in
new file mode 100644 (file)
index 0000000..6951290
--- /dev/null
@@ -0,0 +1,246 @@
+#!@PERL@
+# BEGIN LICENSE BLOCK
+# 
+# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# 
+# (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
+
+#
+# This is just a basic script that checks to make sure that all
+# the modules needed by RT before you can install it.
+#
+
+use strict;
+no warnings qw(numeric redefine);
+use Getopt::Long;
+use CPAN;
+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);
+}
+$args{'with-MASON'} = 1;
+$args{'with-CORE'} = 1;
+$args{'with-DEV'} =1; 
+$args{'with-CLI'} =1; 
+$args{'with-MAILGATE'} =1; 
+if ($] < 5.007) {
+$args{'with-I18N-COMPAT'} = 1;
+}
+
+
+sub help {
+
+print <<'.'
+
+By default, testdeps determine whether you have 
+installed all the perl modules RT needs to run.
+
+       --install               Install missing modules
+
+The following switches will tell the tool to check for specific dependencies
+
+       --with-mysql            Database interface for MySQL
+       --with-postgresql       Database interface for PostgreSQL 
+       --with-sqlite           Database interface and driver for SQLite (unsupported)
+       --with-oracle           Database interface for oracle (unsupported)
+
+       --with-fastcgi          Libraries needed to support the fastcgi handler
+       --with-speedycgi        Libraries needed to support the speedycgi handler
+       --with-modperl1         Libraries needed to support the modperl 1 handler
+       --with-modperl2         Libraries needed to support the modperl 2 handler
+
+       --with-dev              Tools needed for RT development
+.
+}
+
+
+sub _ {
+    map { /(\S+)\s*(\S*)/; $1 => ($2 ? $2 :'') } split ( /\n/, $_[0] );
+}
+
+$deps{'CORE'} = [ _( << '.') ];
+Digest::MD5
+DBI 1.18
+Test::Inline
+Class::ReturnValue 0.40
+DBIx::SearchBuilder 0.86
+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::Fuzzy
+MIME::Entity 5.108
+Mail::Mailer 1.57
+Net::SMTP
+Text::Wrapper 
+Time::ParseDate
+File::Temp
+Term::ReadKey
+Text::Autoformat
+Text::Quoted
+.
+
+$deps{'MASON'} = [ _( << '.') ];
+Params::Validate 0.02
+Cache::Cache
+Exception::Class
+HTML::Mason 1.16
+MLDBM
+Errno
+FreezeThaw
+Digest::MD5
+CGI::Cookie 1.20
+Storable
+Apache::Session 1.53
+.
+
+$deps{'MAILGATE'} = [ _( << '.') ];
+HTML::TreeBuilder
+HTML::FormatText
+Getopt::Long
+LWP::UserAgent
+.
+
+$deps{'CLI'} = [ _( << '.') ];
+Getopt::Long 2.24
+.
+
+$deps{'DEV'} = [ _( << '.') ];
+Regexp::Common
+Time::HiRes 
+Test::Inline 
+WWW::Mechanize
+.
+
+$deps{'FASTCGI'} = [ _( << '.') ];
+CGI
+FCGI
+CGI::Fast 
+.
+
+$deps{'SPEEDYCGI'} = [ _( << '.') ];
+CGI
+CGI::SpeedyCGI
+.
+
+
+$deps{'MODPERL1'} = [ _( << '.') ];
+CGI
+Apache::Request
+Apache::DBI
+.
+
+$deps{'MODPERL2'} = [ _( << '.') ];
+CGI 2.89
+Apache::DBI
+.
+
+$deps{'I18N-COMPAT'} = [ _( << '.') ];
+Text::Iconv
+Encode::compat 0.04
+.
+
+$deps{'MYSQL'} = [ _( << '.') ];
+DBD::mysql 2.1018
+.
+$deps{'ORACLE'} = [ _( << '.') ];
+DBD::Oracle
+.
+$deps{'POSTGRESQL'} = [ _( << '.') ];
+DBD::Pg
+.
+
+
+foreach my $type (keys %args)  {
+next unless ($type =~ /^with-(.*?)$/);
+my $type = $1;
+print "$type dependencies:\n";
+       my @deps = (@{$deps{$type}});
+       while (@deps) {
+               my $module = shift @deps;
+               my $version = shift @deps;
+my $ret;
+       $ret =test_dep($module, $version);      
+
+if ($args{'install'} && !$ret) {
+       resolve_dep($module);           
+}
+}
+}
+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/;
+
+       return undef;
+       } else {
+       print "...found\n";
+return 1;
+       }
+}
+
+sub resolve_dep {
+       my $module = shift;
+       use CPAN;
+       CPAN::Shell->install($module);          
+       
+}
+
+
+sub print_help {
+    print << "EOF";
+
+$0 FLAG DBTYPE
+
+
+$0 is a tool for RT that will tell you if you've got all
+the modules RT depends on properly installed.
+
+Flags: (only one flag is valid for a given run)
+
+-quiet will check to see if we've got everything we need
+       and will exit with a return code of (1) if we don't.
+
+-warn will tell you what isn't properly installed
+
+-fix will use CPANPLUS.pm or CPAN.pm to magically make everything better
+
+DBTYPE is one of:
+       oracle, pg, mysql
+
+EOF
+
+    exit(0);
+}