diff --git a/docs/upgrades/upgrade_7.3.19-7.4.0.pl b/docs/upgrades/upgrade_7.3.19-7.4.0.pl index 410023c9e..2e805c39f 100644 --- a/docs/upgrades/upgrade_7.3.19-7.4.0.pl +++ b/docs/upgrades/upgrade_7.3.19-7.4.0.pl @@ -27,6 +27,7 @@ buildNewUserProfileTable($session); addAttachmentsToEvents($session); addMetaDataPostsToCS($session); addUserInvitations($session); +addPrivateMessaging($session); finish($session); # this line required @@ -256,6 +257,31 @@ sub addAttachmentsToEvents { print "OK!\n" unless $quiet; } +#------------------------------------------------- +sub addPrivateMessaging { + my $session = shift; + print "\tAdding private messaging...." unless ($quiet); + $session->setting->add("viewInboxTemplateId","PBtmpl0000000000000206"); + $session->setting->add("viewInboxMessageTemplateId","PBtmpl0000000000000205"); + $session->setting->add("sendPrivateMessageTemplateId","PBtmplPrivateMessage01"); + $session->db->write("alter table inbox add sentBy varchar(22) not null default 3"); + + my %data = ( + label=>q|WebGUI::International::get("allow private messages label","WebGUI")|, + editable=>1, + visible=>1, + required=>0, + showAtRegistration=>0, + requiredForPasswordRecovery=>0, + fieldType=>"yesNo", + protected=>1, + ); + WebGUI::ProfileField->create($session,"allowPrivateMessages", \%data, 4); + #Allow private messages for everyone initially + $session->db->write("update userProfileData set allowPrivateMessages=1"); + print "OK!\n" unless $quiet; +} + # ---- DO NOT EDIT BELOW THIS LINE ---- diff --git a/lib/WebGUI/Inbox.pm b/lib/WebGUI/Inbox.pm index 7ddfa1561..825f6ae79 100644 --- a/lib/WebGUI/Inbox.pm +++ b/lib/WebGUI/Inbox.pm @@ -101,17 +101,22 @@ An integer indicating the number of messages to fetch. Defaults to 50. =cut sub getMessagesForUser { - my $self = shift; - my $user = shift; - my $limit = shift || 50; + my $self = shift; + my $user = shift; + my $limit = shift || 50; + my $page = shift || 1; my @messages = (); - my $counter = 0; - my $rs = $self->session->db->read("select messageId, userId, groupId from inbox order by status='pending' desc, dateStamp desc"); + my $counter = 0; + + my $start = (($page-1) * $limit) + 1; + my $end = $page * $limit; + my $rs = $self->session->db->read("select messageId, userId, groupId from inbox order by status='pending' desc, dateStamp desc"); while (my ($messageId, $userId, $groupId) = $rs->array) { - if ($user->userId eq $userId || $user->isInGroup($groupId)) { - push(@messages, $self->getMessage($messageId)); + if ($user->userId eq $userId || ($groupId && $user->isInGroup($groupId))) { $counter++; - last if ($counter >= $limit); + next if ($counter < $start); + push(@messages, $self->getMessage($messageId)); + last if ($counter >= $end); } } $rs->finish; diff --git a/lib/WebGUI/Inbox/Message.pm b/lib/WebGUI/Inbox/Message.pm index d17bd6cd7..6d731db8b 100644 --- a/lib/WebGUI/Inbox/Message.pm +++ b/lib/WebGUI/Inbox/Message.pm @@ -80,12 +80,13 @@ sub create { my $properties = shift; my $self = {}; $self->{_properties}{messageId} = "new"; - $self->{_properties}{status} = $properties->{status} || "pending"; - $self->{_properties}{subject} = $properties->{subject} || WebGUI::International->new($session)->get(523); - $self->{_properties}{message} = $properties->{message}; + $self->{_properties}{status} = $properties->{status} || "pending"; + $self->{_properties}{subject} = $properties->{subject} || WebGUI::International->new($session)->get(523); + $self->{_properties}{message} = $properties->{message}; $self->{_properties}{dateStamp} = time(); - $self->{_properties}{userId} = $properties->{userId}; - $self->{_properties}{groupId} = $properties->{groupId}; + $self->{_properties}{userId} = $properties->{userId}; + $self->{_properties}{groupId} = $properties->{groupId}; + $self->{_properties}{sentBy} = $properties->{sentBy} || 3; if ($self->{_properties}{status} eq "completed") { $self->{_properties}{completedBy} = $session->user->userId; $self->{_properties}{completedOn} = time(); @@ -237,5 +238,39 @@ sub setCompleted { $self->session->db->setRow("inbox","messageId",$self->{_properties}); } +#------------------------------------------------------------------- + +=head2 setStatus ( status,[ userId ] ) + +Marks a message completed. + +=head4 status + +Status to mark the message + +=head4 userId + +The id of the user that completed this task. Defaults to the current user. + +=cut + +sub setStatus { + my $self = shift; + my $status = shift; + my $userId = shift || $self->session->user->userId; + unless ($status) { + $self->session->errorHandler->warn("No status passed in for message. Exit without update"); + return; + } + + if($status eq "completed") { + $self->setCompleted($userId); + return; + } + $self->{_properties}{status} = $status; + $self->session->db->setRow("inbox","messageId",$self->{_properties}); + return; +} + 1; diff --git a/lib/WebGUI/Mail/Send.pm b/lib/WebGUI/Mail/Send.pm index 6db951dc0..2331d8b07 100644 --- a/lib/WebGUI/Mail/Send.pm +++ b/lib/WebGUI/Mail/Send.pm @@ -244,8 +244,9 @@ sub create { } } } - my $from = $headers->{from} || $session->setting->get("companyEmail"); - my $type = $headers->{contentType} || "multipart/mixed"; + my $from = $headers->{from} || $session->setting->get("companyEmail"); + my $type = $headers->{contentType} || "multipart/mixed"; + my $replyTo = $headers->{replyTo} || $session->setting->get("mailReturnPath"); # format of Message-Id should be '' my $id = $headers->{messageId} || "WebGUI-" . $session->id->generate; @@ -263,7 +264,7 @@ sub create { To=>$headers->{to}, Cc=>$headers->{cc}, Bcc=>$headers->{bcc}, - "Reply-To"=>$headers->{replyTo}, + "Reply-To"=>$replyTo, "In-Reply-To"=>$headers->{inReplyTo}, Subject=>$headers->{subject}, "Message-Id"=>$id, @@ -313,6 +314,7 @@ Puts this message in the mail queue so it can be sent out later by the workflow sub queue { my $self = shift; + $self->session->errorHandler->warn($self->{_message}->stringify); return $self->session->db->setRow("mailQueue", "messageId", { messageId=>"new", message=>$self->{_message}->stringify, toGroup=>$self->{_toGroup} }); } diff --git a/lib/WebGUI/Operation.pm b/lib/WebGUI/Operation.pm index a4fb13520..c85d0b041 100644 --- a/lib/WebGUI/Operation.pm +++ b/lib/WebGUI/Operation.pm @@ -163,6 +163,8 @@ sub getOperations { 'viewInbox' => 'WebGUI::Operation::Inbox', 'viewInboxMessage' => 'WebGUI::Operation::Inbox', + 'sendPrivateMessage' => 'WebGUI::Operation::Inbox', + 'sendPrivateMessageSave' => 'WebGUI::Operation::Inbox', 'inviteUser' => 'WebGUI::Operation::Invite', 'inviteUserSave' => 'WebGUI::Operation::Invite', diff --git a/lib/WebGUI/Operation/Inbox.pm b/lib/WebGUI/Operation/Inbox.pm index aaa8f721a..aa3ea38e2 100644 --- a/lib/WebGUI/Operation/Inbox.pm +++ b/lib/WebGUI/Operation/Inbox.pm @@ -33,6 +33,73 @@ Operations for viewing message logs and individual messages. #------------------------------------------------------------------- +=head2 _appendPrivateMessageForm ( vars, userTo, subject ) + +appends the form variables for the private message form + +=cut + +sub _appendPrivateMessageForm { + my $session = shift; + my $vars = shift; + my $userTo = shift; + my $message = shift; + + my $i18n = WebGUI::International->new($session); + + my $form = $session->form; + my $user = $session->user; + + $vars->{ message_from_label } = $i18n->get("private message from label"); + $vars->{ message_from } = $user->username; + + $vars->{ message_to_label } = $i18n->get("private message to label"); + $vars->{ message_to } = $userTo->username; + $vars->{ message_to } .= WebGUI::Form::hidden($session, { + name=>"uid", + value=>$userTo->userId + }); + + my $subject = $form->get("subject") || ""; + if($subject eq "" && defined $message) { + $subject = "Re: ".$message->get("subject"); + } + + $vars->{ subject_label } = $i18n->get("private message subject label"); + $vars->{ subject } = WebGUI::Form::text($session, { + name=>"subject", + value=>$subject, + }); + + $vars->{ message_label } = $i18n->get("private message message label"); + $vars->{ message_text } = WebGUI::Form::textarea($session, { + name=>"message", + value=>$form->get("message") || "", + }); + $vars->{ message_rich } = WebGUI::Form::HTMLArea($session, { + name=>"message", + value=>$form->get("message") || "", + }); + + $vars->{ form_header } = WebGUI::Form::formHeader($session); + $vars->{ form_header } .= WebGUI::Form::hidden($session, { + name => "op", + value => "sendPrivateMessageSave" + }); + $vars->{ form_header } .= WebGUI::Form::hidden($session, { + name => "messageId", + value => $form->get("messageId") || "", + }); + + $vars->{ submit_button } = WebGUI::Form::submit($session,{}); + $vars->{ submit_label } = $i18n->get("private message submit label"); + $vars->{ form_footer } = WebGUI::Form::formFooter($session, {}); + + +} + +#------------------------------------------------------------------- + =head2 _status ( ) returns a hashref with internationalized values for message status. @@ -42,9 +109,138 @@ returns a hashref with internationalized values for message status. sub _status { my $session = shift; my $i18n = WebGUI::International->new($session); - return {"pending"=>$i18n->get(552),"completed"=>$i18n->get(350)}; + return { + "pending" =>$i18n->get(552), + "completed" =>$i18n->get(350), + "unread" =>$i18n->get("private message status unread"), + "read" =>$i18n->get("private message status read"), + "replied" =>$i18n->get("private message status replied"), + }; } +#------------------------------------------------------------------- + +=head2 www_sendPrivateMessage ( ) + +Form for sending private messages + +=cut + +sub www_sendPrivateMessage { + my $session = shift; + return $session->privilege->insufficient() unless ($session->user->isInGroup(2)); + + my $i18n = WebGUI::International->new($session); + my $form = $session->form; + my $user = $session->user; + my $style = $session->style; + my $settings = $session->setting; + + my $templateId = $settings->get("sendPrivateMessageTemplateId"); + my $uid = $form->get("uid"); + my $userTo = WebGUI::User->new($session,$uid); + + my $vars = {}; + $vars->{title} = $i18n->get('private message title'); + + if($uid eq "") { + $vars->{'error_msg'} = $i18n->get('private message no user'); + return $style->userStyle(WebGUI::Asset::Template->new($session,$templateId)->process($vars)); + + } + elsif($uid eq $user->userId) { + $vars->{'error_msg'} = $i18n->get('private message no self error'); + return $style->userStyle(WebGUI::Asset::Template->new($session,$templateId)->process($vars)); + } + + unless($userTo->profileField("allowPrivateMessages")) { + $vars->{'error_msg'} = $i18n->get('private message blocked error'); + return $style->userStyle(WebGUI::Asset::Template->new($session,$templateId)->process($vars)); + } + + _appendPrivateMessageForm($session,$vars,$userTo); + + $vars->{ accountOptions } = WebGUI::Operation::Shared::accountOptions($session); + + return $style->userStyle(WebGUI::Asset::Template->new($session,$templateId)->process($vars)); +} + +#------------------------------------------------------------------- + +=head2 www_sendPrivateMessageSave ( ) + +Post process the form, check for required fields, handle inviting users who are already +members (determined by email address) and send the email. + +=cut + +sub www_sendPrivateMessageSave { + my $session = shift; + return $session->privilege->insufficient() unless ($session->user->isInGroup(2)); + + my $i18n = WebGUI::International->new($session); + my $form = $session->form; + my $user = $session->user; + my $style = $session->style; + + my $uid = $form->get("uid"); + my $userTo = WebGUI::User->new($session,$uid); + + if($uid eq "") { + my $output = sprintf qq|

%s

\n

%s

%s|, + $i18n->get('private message error'), + $i18n->get('private message no user'), + $session->url->getBackToSiteURL(), + $i18n->get('493', 'WebGUI'); + return $style->userStyle($output); + } elsif($uid eq $user->userId) { + my $output = sprintf qq|

%s

\n

%s

%s|, + $i18n->get('private message error'), + $i18n->get('private message no self error'), + $session->url->getBackToSiteURL(), + $i18n->get('493', 'WebGUI'); + return $style->userStyle($output); + } + + my $isReply = 0; + if($form->get("messageId")) { + my $message = WebGUI::Inbox->new($session)->getMessage($form->get("messageId")); + # Ensure that the user sending the message was sent by the user being replied to + # and that the user reponding is the user the message was sent to + if($message->get("sentBy") eq $uid && $message->get("userId") eq $user->userId) { + $isReply = 1; + $message->setStatus("replied"); + } + } + + unless($isReply || $userTo->profileField("allowPrivateMessages")) { + my $output = sprintf qq|

%s

\n

%s

%s|, + $i18n->get('private message error'), + $i18n->get('private message blocked error'), + $session->url->getBackToSiteURL(), + $i18n->get('493', 'WebGUI'); + return $style->userStyle($output); + } + + + WebGUI::Inbox->new($session)->addMessage({ + message => $form->get("message"), + subject => $form->get("subject"), + userId => $uid, + status => 'unread', + sentBy => $user->userId + }); + + + my $output = sprintf qq!

%s

%s!, + $i18n->get('private message sent'), + $session->url->getBackToSiteURL(), + $i18n->get('493', 'WebGUI'); + return $session->style->userStyle($output); + +} + + #------------------------------------------------------------------- =head2 www_viewInbox ( ) @@ -56,25 +252,61 @@ Templated display all messages for the current user. sub www_viewInbox { my $session = shift; return $session->privilege->insufficient() unless ($session->user->isInGroup(2)); - my $i18n = WebGUI::International->new($session); + + my $i18n = WebGUI::International->new($session); my $vars = {}; - my @msg = (); - $vars->{title} = $i18n->get(159); - $vars->{'subject.label'} = $i18n->get(351); - $vars->{'status.label'} = $i18n->get(553); - $vars->{'dateStamp.label'} = $i18n->get(352); - my $messages = WebGUI::Inbox->new($session)->getMessagesForUser($session->user); + my @msg = (); + my $pn = $session->form->get("pn") || 1; + my $rpp = 10; + + $vars->{ title } = $i18n->get(159); + $vars->{'subject_label' } = $i18n->get(351); + $vars->{'status_label' } = $i18n->get(553); + $vars->{'from_label' } = $i18n->get("private message from label"); + $vars->{'dateStamp_label'} = $i18n->get(352); + + my $adminUser = WebGUI::User->new($session,3)->username; + my $messages = WebGUI::Inbox->new($session)->getMessagesForUser($session->user,$rpp,$pn); foreach my $message (@$messages) { - my $hash = {}; - $hash->{'subject'} = ''.$message->get("subject").''; - $hash->{status} = _status($session)->{$message->get("status")}; - $hash->{'dateStamp'} =$session->datetime->epochToHuman($message->get("dateStamp")); + my $hash = {}; + $hash->{ message_url } = $session->url->page('op=viewInboxMessage;messageId='.$message->getId); + $hash->{ subject } = $message->get("subject"); + $hash->{ status_class } = $message->get("status"); + $hash->{ status } = _status($session)->{$hash->{ status_class }}; + + #Get the username of the person who sent the message + my $sentBy = $message->get("sentBy"); + #Assume it's the admin user for speed purposes - admin user is cached above the loop + my $from = $adminUser; + #If it wasn't the admin user, get the username of the person who sent it + if($sentBy ne "3") { + my $u = WebGUI::User->new($session,$sentBy); + #If the user that sent the message is valid, get the username + #This case would happen if the user was deleted after sending a private message + if($u->userId ne "1") { + $from = $u->username; + } + } + + $hash->{ from } = $from; + $hash->{ dateStamp } = $session->datetime->epochToHuman($message->get("dateStamp")); push(@msg,$hash); } - $vars->{'messages'} = \@msg; - $vars->{'noresults'} = $i18n->get(353) unless (scalar(@$messages) > 0); + my $msgCount = scalar(@{$messages}); + + #Pagination has to exist on every page regardless if there are more messages or not. + if($pn > 1 ) { + $vars->{'prev_url' } = $session->url->page('op=viewInbox;pn='.($pn-1)); + $vars->{'prev_label' } = $i18n->get("private message prev label"); + } + $vars->{'next_url' } = $session->url->page('op=viewInbox;pn='.($pn+1)); + $vars->{'next_label' } = $i18n->get("private message next label"); + + $vars->{'messages' } = \@msg; + $vars->{'noresults' } = $i18n->get(353) unless ($msgCount > 0); $vars->{'accountOptions'} = WebGUI::Operation::Shared::accountOptions($session); - return $session->style->userStyle(WebGUI::Asset::Template->new($session,"PBtmpl0000000000000206")->process($vars)); + my $templateId = $session->setting->get("viewInboxTemplateId"); + return $session->style->userStyle(WebGUI::Asset::Template->new($session,$templateId)->process($vars)); } #------------------------------------------------------------------- @@ -88,24 +320,65 @@ Templated display of a single message for the user. sub www_viewInboxMessage { my $session = shift; return $session->privilege->insufficient() unless ($session->user->isInGroup(2)); + + #Get the message + my $message = WebGUI::Inbox->new($session)->getMessage($session->form->param("messageId")); + + #Make sure users can only read their own messages + my $userId = $message->get("userId"); + my $groupId = $message->get("groupId"); + return $session->privilege->insufficient() unless ( + $session->user->userId eq $userId + || (defined $groupId && $session->user->isInGroup($groupId)) + ); + my $i18n = WebGUI::International->new($session); my $vars = {}; - $vars->{title} = $i18n->get(159); - my $message = WebGUI::Inbox->new($session)->getMessage($session->form->param("messageId")); - if (defined $message) { - $vars->{'subject'} = $message->get("subject"); + $vars->{ title } = $i18n->get("private message reply title"); + $vars->{ from_label } = $i18n->get("private message from label"); + $vars->{ date_label } = $i18n->get("private message date label"); + + + if (defined $message) { + my $origStatus = $message->get("status"); + $message->setStatus("read") if($origStatus eq "unread"); + $vars->{'message_subject' } = $message->get("subject"); $vars->{'dateStamp'} =$session->datetime->epochToHuman($message->get("dateStamp")); - $vars->{'status'} = _status($session)->{$message->get("status")}; - $vars->{message} = $message->get("message"); + $vars->{'status' } = _status($session)->{$message->get("status")}; + $vars->{ message } = $message->get("message"); unless ($vars->{message} =~ /\{message} =~ s/(http\S*)/\$1\<\/a\>/g; } unless ($vars->{message} =~ /\
{message} =~ /\
{message} =~ /\

{message} =~ s/\n/\
\n/g; } + + #Get the username of the person who sent the message + my $sentBy = $message->get("sentBy"); + #Assume it's the admin user who sent the message + my $from = WebGUI::User->new($session,3)->username; + #If the user actually exists, get the username + if($sentBy ne "1" && $sentBy ne "3") { + $from = WebGUI::User->new($session,$sentBy)->username; + } + + $vars->{ from } = $from; + + + #If the person didn't send the message to themselves (for admin only) and the user still exsists (check visitor case) + if($sentBy ne $session->user->userId && + $sentBy ne "1" && + $origStatus ne "pending" && + $origStatus ne "completed") { + my $u = WebGUI::User->new($session,$sentBy); + $vars->{'canReply'} = "true"; + _appendPrivateMessageForm($session,$vars,$u,$message); + } + } $vars->{'accountOptions'} = WebGUI::Operation::Shared::accountOptions($session); - return $session->style->userStyle(WebGUI::Asset::Template->new($session,"PBtmpl0000000000000205")->process($vars)); + my $templateId = $session->setting->get("viewInboxMessageTemplateId"); + return $session->style->userStyle(WebGUI::Asset::Template->new($session,$templateId)->process($vars)); } 1; diff --git a/lib/WebGUI/Operation/Settings.pm b/lib/WebGUI/Operation/Settings.pm index ef569efa9..bbe2f511f 100644 --- a/lib/WebGUI/Operation/Settings.pm +++ b/lib/WebGUI/Operation/Settings.pm @@ -222,6 +222,33 @@ sub definition { namespace=>"AdminConsole", defaultValue=>$session->setting->get("AdminConsoleTemplate") }); + push(@fields, { + tab=>"ui", + fieldType=>"template", + name=>"viewInboxTemplateId", + label=>$i18n->get('view inbox template'), + hoverHelp=>$i18n->get('view inbox template description'), + namespace=>"Inbox", + defaultValue=>$session->setting->get("viewInboxTemplateId"), + }); + push(@fields, { + tab=>"ui", + fieldType=>"template", + name=>"viewInboxMessageTemplateId", + label=>$i18n->get('view inbox message template'), + hoverHelp=>$i18n->get('view inbox message template description'), + namespace=>"Inbox/Message", + defaultValue=>$session->setting->get("viewInboxMessageTemplateId"), + }); + push(@fields, { + tab=>"ui", + fieldType=>"template", + name=>"sendPrivateMessageTemplateId", + label=>$i18n->get('send private message template'), + hoverHelp=>$i18n->get('send private message template description'), + namespace=>"Inbox/SendPrivateMessage", + defaultValue=>$session->setting->get("sendPrivateMessageTemplateId"), + }); # messaging settings push(@fields, { tab=>"messaging", diff --git a/lib/WebGUI/Operation/Shared.pm b/lib/WebGUI/Operation/Shared.pm index 2f458abb7..e57fa71b0 100644 --- a/lib/WebGUI/Operation/Shared.pm +++ b/lib/WebGUI/Operation/Shared.pm @@ -35,6 +35,8 @@ is in group Admin (3). Returns the user to the List Database Links screen. my $session = shift; my $i18n = WebGUI::International->new($session); my @array; + my $op = $session->form->process("op"); + if ($session->user->isInGroup(12)) { my %hash; if ($session->var->get("adminOn")) { @@ -44,29 +46,35 @@ is in group Admin (3). Returns the user to the List Database Links screen. } push(@array,\%hash); } - unless ($session->form->process("op") eq "displayAccount"){ + unless ($op eq "displayAccount"){ my %hash; $hash{'options.display'} = '
'.$i18n->get(342).''; push(@array,\%hash); } - unless ($session->form->process("op") eq "editProfile"){ + unless ($op eq "editProfile"){ my %hash; $hash{'options.display'} = ''.$i18n->get(341).''; push(@array,\%hash); } - unless ($session->form->process("op") eq "viewProfile"){ + unless ($op eq "viewProfile"){ my %hash; $hash{'options.display'} = ''.$i18n->get(343).''; push(@array,\%hash); } - unless ($session->form->process("op") eq "viewInbox"){ + unless ($op eq "viewInbox"){ my %hash; $hash{'options.display'} = ''.$i18n->get(354).''; push(@array,\%hash); } - unless ($session->form->process("op") eq "redeemSubscriptionCode") { + unless ($op eq "redeemSubscriptionCode") { push(@array, {'options.display' => ''.$i18n->get('redeem code', 'Subscription').''}); } + + my $uid = $session->form->get("uid"); + if($op eq "viewProfile" && $uid ne $session->user->userId) { + push(@array, {'options.display' => ''.$i18n->get('send private message').''}); + } + if ($session->setting->get('userInvitationsEnabled')) { push @array, { diff --git a/lib/WebGUI/i18n/English/WebGUI.pm b/lib/WebGUI/i18n/English/WebGUI.pm index 09cc1797a..ef0d9e792 100644 --- a/lib/WebGUI/i18n/English/WebGUI.pm +++ b/lib/WebGUI/i18n/English/WebGUI.pm @@ -4101,7 +4101,147 @@ Get a copy of wget and use this: wget -p -r --html-extension -k http://the message => q|This is the message displayed to users who try to invite someone whose email address already exists in the system.|, lastUpdated => 1181277914, }, - + + 'send private message' => { + message => q|Send Private Message|, + lastUpdated => 1181019679, + }, + + 'private message title' => { + message => q|Send Private Message|, + lastUpdated => 1181019679, + }, + + 'private message no self error' => { + message => q|You may not send private messages to yourself.|, + lastUpdated => 1181019679, + }, + + 'private message no user' => { + message => q|You have not selected a user to send a private message to|, + lastUpdated => 1181019679, + }, + + 'private message to label' => { + message => q|To|, + lastUpdated => 1181019679, + }, + + 'private message from label' => { + message => q|From|, + lastUpdated => 1181019679, + }, + + 'private message subject label' => { + message => q|Subject|, + lastUpdated => 1181019679, + }, + + 'private message message label' => { + message => q|Message|, + lastUpdated => 1181019679, + }, + + 'private message submit label' => { + message => q|Submit|, + lastUpdated => 1181019679, + }, + + 'private message error' => { + message => q|Message Error|, + lastUpdated => 1181019679, + }, + + 'private message blocked error' => { + message => q|This user does not wish to receive private messages.|, + lastUpdated => 1181019679, + }, + + 'private message sent' => { + message => q|Your private message has been sent.|, + lastUpdated => 1181019679, + }, + + 'private message status unread' => { + message => q|Unread|, + lastUpdated => 1181019679, + }, + + 'private message status replied' => { + message => q|Replied|, + lastUpdated => 1181019679, + }, + + 'private message status read' => { + message => q|Read|, + lastUpdated => 1181019679, + }, + + 'private message prev label' => { + message => q|Previous|, + lastUpdated => 1181019679, + }, + + 'private message next label' => { + message => q|Next|, + lastUpdated => 1181019679, + }, + + 'allow private messages label' => { + message => q|Allow Private Messages|, + lastUpdated => 1181019679, + }, + + 'private message from label' => { + message => q|From|, + lastUpdated => 1181019679, + }, + + 'private message date label' => { + message => q|Date|, + lastUpdated => 1181019679, + }, + + 'private message reply title' => { + message => q|Reply to Message|, + lastUpdated => 1181019679, + }, + + 'private message unread display message' => { + message => q|%s unread messages|, + lastUpdated => 1181019679, + }, + + 'view inbox template' => { + message => q|Inbox Template|, + lastUpdated => 1181019679, + }, + + 'view inbox template description' => { + message => q|Choose a template for displaying the inbox|, + lastUpdated => 1181019679, + }, + + 'view inbox message template' => { + message => q|Inbox Message Template|, + lastUpdated => 1181019679, + }, + + 'view inbox message template description' => { + message => q|Choose a template for displaying messages in the inbox|, + lastUpdated => 1181019679, + }, + + 'send private message template' => { + message => q|Send Private Message Template|, + lastUpdated => 1181019679, + }, + + 'send private message template description' => { + message => q|Choose a template for sending private messages|, + lastUpdated => 1181019679, + }, + }; 1;