code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Action for adding a new group message
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Cache
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Action for adding a new group message
 *
 * @category  Action
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class NewgroupmessageAction extends Action
{
    var $group;
    var $user;
    var $text;

    /**
     * For initializing members of the class.
     *
     * @param array $argarray misc. arguments
     *
     * @return boolean true
     */
    function prepare($argarray)
    {
        parent::prepare($argarray);

        $this->user = common_current_user();

        if (empty($this->user)) {
            // TRANS: Client exception thrown when trying to send a private group message while not logged in.
            throw new ClientException(_m('Must be logged in.'), 403);
        }

        if (!$this->user->hasRight(Right::NEWMESSAGE)) {
            // TRANS: Exception thrown when user %s is not allowed to send a private group message.
            throw new Exception(sprintf(_m('User %s is not allowed to send private messages.'),
                                        $this->user->nickname));
        }

        $nicknameArg = $this->trimmed('nickname');

        $nickname = common_canonical_nickname($nicknameArg);

        if ($nickname != $nicknameArg) {
            $url = common_local_url('newgroupmessage', array('nickname' => $nickname));
            common_redirect($url, 301);
        }

        $localGroup = Local_group::getKV('nickname', $nickname);

        if (empty($localGroup)) {
            // TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
            throw new ClientException(_m('No such group.'), 404);
        }

        $this->group = User_group::getKV('id', $localGroup->group_id);

        if (empty($this->group)) {
            // TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
            throw new ClientException(_m('No such group.'), 404);
        }

        // This throws an exception on error
        Group_privacy_settings::ensurePost($this->user, $this->group);

        // If we're posted to, check session token and get text
        if ($this->isPost()) {
            $this->checkSessionToken();
            $this->text = $this->trimmed('content');
        }

        return true;
    }

    /**
     * Handler method
     *
     * @param array $argarray is ignored since it's now passed in in prepare()
     *
     * @return void
     */
    function handle($argarray=null)
    {
        if ($this->isPost()) {
            $this->sendNewMessage();
        } else {
            $this->showPage();
        }
    }

    function showNoticeForm()
    {
        $form = new GroupMessageForm($this, $this->group);
        $form->show();
    }

    function sendNewMessage()
    {
        $gm = Group_message::send($this->user, $this->group, $this->text);

        if ($this->boolean('ajax')) {
            $this->startHTML('text/xml;charset=utf-8');
            $this->elementStart('head');
            // TRANS: Title after sending a private group message.
            $this->element('title', null, _m('Message sent'));
            $this->elementEnd('head');
            $this->elementStart('body');
            $this->element('p',
                           array('id' => 'command_result'),
                           // TRANS: Succes text after sending a direct message to group %s.
                           sprintf(_m('Direct message to %s sent.'),
                                   $this->group->nickname));
            $this->elementEnd('body');
            $this->endHTML();
        } else {
            common_redirect($gm->url, 303);
        }
    }

    function title()
    {
        // TRANS: Title of form for new private group message.
        return sprintf(_m('New message to group %s'), $this->group->nickname);
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Show a single group message
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Show a single private group message
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class ShowgroupmessageAction extends Action
{
    var $gm;
    var $group;
    var $sender;
    var $user;

    /**
     * For initializing members of the class.
     *
     * @param array $argarray misc. arguments
     *
     * @return boolean true
     */
    function prepare($argarray)
    {
        parent::prepare($argarray);

        $this->user = common_current_user();

        if (empty($this->user)) {
            // TRANS: Client exception thrown when trying to view group private messages without being logged in.
            throw new ClientException(_m('Only logged-in users can view private messages.'),
                                      403);
        }

        $id = $this->trimmed('id');

        $this->gm = Group_message::getKV('id', $id);

        if (empty($this->gm)) {
            // TRANS: Client exception thrown when trying to view a non-existing group private message.
            throw new ClientException(_m('No such message.'), 404);
        }

        $this->group = User_group::getKV('id', $this->gm->to_group);

        if (empty($this->group)) {
            // TRANS: Server exception thrown when trying to view group private messages for a non-exsting group.
            throw new ServerException(_m('Group not found.'));
        }

        if (!$this->user->isMember($this->group)) {
            // TRANS: Client exception thrown when trying to view a group private message without being a group member.
            throw new ClientException(_m('Cannot read message.'), 403);
        }

        $this->sender = Profile::getKV('id', $this->gm->from_profile);

        if (empty($this->sender)) {
            // TRANS: Server exception thrown when trying to view a group private message without a sender.
            throw new ServerException(_m('No sender found.'));
        }

        return true;
    }

    /**
     * Handler method
     *
     * @param array $argarray is ignored since it's now passed in in prepare()
     *
     * @return void
     */
    function handle($argarray=null)
    {
        $this->showPage();
    }

    /**
     * Title of the page
     */
    function title()
    {
        // TRANS: Title for private group message.
        // TRANS: %1$s is the sender name, %2$s is the group name, %3$s is a timestamp.
        return sprintf(_m('Message from %1$s to group %2$s on %3$s'),
                       $this->sender->nickname,
                       $this->group->nickname,
                       common_exact_date($this->gm->created));
    }

    /**
     * Show the content area.
     */
    function showContent()
    {
        $this->elementStart('ul', 'notices messages');
        $gmli = new GroupMessageListItem($this, $this->gm);
        $gmli->show();
        $this->elementEnd('ul');
    }

    /**
     * Return true if read only.
     *
     * MAY override
     *
     * @param array $args other arguments
     *
     * @return boolean is read only action?
     */
    function isReadOnly($args)
    {
        return true;
    }

    /**
     * Return last modified, if applicable.
     *
     * MAY override
     *
     * @return string last modified http header
     */
    function lastModified()
    {
        return max(strtotime($this->group->modified),
                   strtotime($this->sender->modified),
                   strtotime($this->gm->modified));
    }

    /**
     * Return etag, if applicable.
     *
     * MAY override
     *
     * @return string etag http header
     */
    function etag()
    {
        try {
            $avatar = $this->sender->getAvatar(AVATAR_STREAM_SIZE);
            $avtime = strtotime($avatar->modified);
        } catch (Exception $e) {
            $avtime = 0;
        }

        return 'W/"' . implode(':', array($this->arg('action'),
                                          common_user_cache_hash(),
                                          common_language(),
                                          $this->gm->id,
                                          strtotime($this->sender->modified),
                                          strtotime($this->group->modified),
                                          $avtime)) . '"';
    }
}

license: mit


code:
<?php
/**
 * Data class for group direct messages
 *
 * PHP version 5
 *
 * @category Data
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2009, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET')) {
    exit(1);
}

require_once INSTALLDIR . '/classes/Memcached_DataObject.php';

/**
 * Data class for group direct messages
 *
 * @category GroupPrivateMessage
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * @see      DB_DataObject
 */
class Group_message extends Managed_DataObject
{
    public $__table = 'group_message'; // table name
    public $id;                        // char(36)  primary_key not_null
    public $uri;                       // varchar(255)
    public $from_profile;              // int
    public $to_group;                  // int
    public $content;
    public $rendered;
    public $url;
    public $created;                   // datetime()   not_null
    public $modified;                  // timestamp()   not_null default_CURRENT_TIMESTAMP

    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'id' => array('type' => 'char', 'not null' => true, 'length' => 36, 'description' => 'message uuid'),
                'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'message uri'),
                'url' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'representation url'),
                'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'sending profile ID'),
                'to_group' => array('type' => 'int', 'not null' => true, 'description' => 'receiving group ID'),
                'content' => array('type' => 'text', 'not null' => true, 'description' => 'message content'),
                'rendered' => array('type' => 'text', 'not null' => true, 'description' => 'rendered message'),
                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
            ),
            'primary key' => array('id'),
            'unique keys' => array(
                'group_message_uri_key' => array('uri'),
            ),
            'foreign keys' => array(
                'group_message_from_profile_fkey' => array('profile', array('from_profile' => 'id')),
                'group_message_to_group_fkey' => array('user_group', array('to_group' => 'id')),
            ),
            'indexes' => array(
                'group_message_from_profile_idx' => array('from_profile'),
                'group_message_to_group_idx' => array('to_group'),
                'group_message_url_idx' => array('url'),
            ),
        );
    }

    static function send($user, $group, $text)
    {
        if (!$user->hasRight(Right::NEWMESSAGE)) {
            // XXX: maybe break this out into a separate right
            // TRANS: Exception thrown when trying to send group private message without having the right to do that.
            // TRANS: %s is a user nickname.
            throw new Exception(sprintf(_m('User %s is not allowed to send private messages.'),
                                        $user->nickname));
        }

        Group_privacy_settings::ensurePost($user, $group);

        $text = $user->shortenLinks($text);

        // We use the same limits as for 'regular' private messages.

        if (Message::contentTooLong($text)) {
            // TRANS: Exception thrown when trying to send group private message that is too long.
            // TRANS: %d is the maximum meggage length.
            throw new Exception(sprintf(_m('That\'s too long. Maximum message size is %d character.',
                                           'That\'s too long. Maximum message size is %d characters.',
                                           Message::maxContent()),
                                        Message::maxContent()));
        }

        // Valid! Let's do this thing!

        $gm = new Group_message();

        $gm->id           = UUID::gen();
        $gm->uri          = common_local_url('showgroupmessage', array('id' => $gm->id));
        $gm->from_profile = $user->id;
        $gm->to_group     = $group->id;
        $gm->content      = $text; // XXX: is this cool?!
        $gm->rendered     = common_render_text($text);
        $gm->url          = $gm->uri;
        $gm->created      = common_sql_now();

        // This throws a conniption if there's a problem

        $gm->insert();

        $gm->distribute();

        return $gm;
    }

    function distribute()
    {
        $group = User_group::getKV('id', $this->to_group);

        $member = $group->getMembers();

        while ($member->fetch()) {
            Group_message_profile::send($this, $member);
        }
    }

    function getGroup()
    {
        $group = User_group::getKV('id', $this->to_group);
        if (empty($group)) {
            // TRANS: Exception thrown when trying to send group private message to a non-existing group.
            throw new ServerException(_m('No group for group message.'));
        }
        return $group;
    }

    function getSender()
    {
        $sender = Profile::getKV('id', $this->from_profile);
        if (empty($sender)) {
            // TRANS: Exception thrown when trying to send group private message without having a sender.
            throw new ServerException(_m('No sender for group message.'));
        }
        return $sender;
    }

    static function forGroup($group, $offset, $limit)
    {
        // XXX: cache
        $gm = new Group_message();

        $gm->to_group = $group->id;
        $gm->orderBy('created DESC');
        $gm->limit($offset, $limit);

        $gm->find();

        return $gm;
    }
}


code:
<?php
/**
 * Who received a group message
 *
 * PHP version 5
 *
 * @category Data
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET')) {
    exit(1);
}

require_once INSTALLDIR . '/classes/Memcached_DataObject.php';

/**
 * Data class for group direct messages for users
 *
 * @category GroupPrivateMessage
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * @see      DB_DataObject
 */
class Group_message_profile extends Managed_DataObject
{
    public $__table = 'group_message_profile'; // table name
    public $to_profile;                        // int
    public $group_message_id;                  // varchar(36)  primary_key not_null
    public $created;                           // datetime()   not_null
    public $modified;                          // timestamp()   not_null default_CURRENT_TIMESTAMP

    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'id of group direct message'),
                'group_message_id' => array('type' => 'char', 'not null' => true, 'length' => 36, 'description' => 'related group message uuid'),
                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
            ),
            'primary key' => array('to_profile', 'group_message_id'),
            'foreign keys' => array(
                'group_message_profile_to_profile_fkey' => array('profile', array('to_profile' => 'id')),
                'group_message_profile_group_message_id_fkey' => array('group_message', array('group_message_id' => 'id')),
            ),
        );
    }

    function send($gm, $profile)
    {
        $gmp = new Group_message_profile();

        $gmp->group_message_id = $gm->id;
        $gmp->to_profile       = $profile->id;
        $gmp->created          = common_sql_now();

        $gmp->insert();

        // If it's not for the author, send email notification
        if ($gm->from_profile != $profile->id) {
            $gmp->notify();
        }

        return $gmp;
    }

    function notify()
    {
        // XXX: add more here
        $this->notifyByMail();
    }

    function notifyByMail()
    {
        $to = User::getKV('id', $this->to_profile);

        if (empty($to) || is_null($to->email) || !$to->emailnotifymsg) {
            return true;
        }

        $gm = Group_message::getKV('id', $this->group_message_id);

        $from_profile = Profile::getKV('id', $gm->from_profile);

        $group = $gm->getGroup();

        common_switch_locale($to->language);

        // TRANS: Subject for direct-message notification email.
        // TRANS: %1$s is the sending user's nickname, %2$s is the group nickname.
        $subject = sprintf(_m('New private message from %1$s to group %2$s'), $from_profile->nickname, $group->nickname);

        // TRANS: Body for direct-message notification email.
        // TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
        // TRANS: %3$s is the message content, %4$s a URL to the message,
        // TRANS: %5$s is the StatusNet sitename.
        $body = sprintf(_m("%1\$s (%2\$s) sent a private message to group %3\$s:\n\n".
                           "------------------------------------------------------\n".
                           "%4\$s\n".
                           "------------------------------------------------------\n\n".
                           "You can reply to their message here:\n\n".
                           "%5\$s\n\n".
                           "Do not reply to this email; it will not get to them.\n\n".
                           "With kind regards,\n".
                           "%6\$s"),
                        $from_profile->getBestName(),
                        $from_profile->nickname,
                        $group->nickname,
                        $gm->content,
                        common_local_url('newmessage', array('to' => $from_profile->id)),
                        common_config('site', 'name')) . "\n";

        $headers = _mail_prepare_headers('message', $to->nickname, $from_profile->nickname);

        common_switch_locale();

        return mail_to_user($to, $subject, $body, $headers);
    }
}


code:
<?php
/**
 * Data class for group privacy settings
 *
 * PHP version 5
 *
 * @category Data
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Data class for group privacy
 *
 * Stores admin preferences about the group.
 *
 * @category Action
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * @see      DB_DataObject
 */
class Group_privacy_settings extends Managed_DataObject
{
    public $__table = 'group_privacy_settings';
    /** ID of the group. */
    public $group_id;
    /** When to allow privacy: always, sometimes, or never. */
    public $allow_privacy;
    /** Who can send private messages: everyone, member, admin */
    public $allow_sender;
    /** row creation timestamp */
    public $created;
    /** Last-modified timestamp */
    public $modified;

    /** NEVER is */

    const SOMETIMES = -1;
    const NEVER  = 0;
    const ALWAYS = 1;

    /** These are bit-mappy, as a hedge against the future. */

    const EVERYONE = 1;
    const MEMBER   = 2;
    const ADMIN    = 4;

    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group_privacy_settings'),
                'allow_privacy' => array('type' => 'int', 'not null' => true, 'description' => 'sometimes=-1, never=0, always=1'),
                'allow_sender' => array('type' => 'int', 'not null' => true, 'description' => 'list of bit-mappy values in source code'),
                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
            ),
            'primary key' => array('group_id'),
            'foreign keys' => array(
                'group_privacy_settings_group_id_fkey' => array('user_group', array('group_id' => 'id')),
            ),
        );
    }

    function forGroup($group)
    {
        $gps = Group_privacy_settings::getKV('group_id', $group->id);

        if (empty($gps)) {
            // make a fake one with defaults
            $gps = new Group_privacy_settings();
            $gps->allow_privacy = Group_privacy_settings::SOMETIMES;
            $gps->allow_sender  = Group_privacy_settings::MEMBER;
        }

        return $gps;
    }

    function ensurePost($user, $group)
    {
        $gps = self::forGroup($group);

        if ($gps->allow_privacy == Group_privacy_settings::NEVER) {
            // TRANS: Exception thrown when trying to set group privacy setting if group %s does not allow private messages.
            throw new Exception(sprintf(_m('Group %s does not allow private messages.'),
                                        $group->nickname));
        }

        switch ($gps->allow_sender) {
        case Group_privacy_settings::EVERYONE:
            $profile = $user->getProfile();
            if (Group_block::isBlocked($group, $profile)) {
                // TRANS: Exception thrown when trying to send group private message while blocked from that group.
                // TRANS: %1$s is a user nickname, %2$s is a group nickname.
                throw new Exception(sprintf(_m('User %1$s is blocked from group %2$s.'),
                                            $user->nickname,
                                            $group->nickname));
            }
            break;
        case Group_privacy_settings::MEMBER:
            if (!$user->isMember($group)) {
                // TRANS: Exception thrown when trying to send group private message while not a member.
                // TRANS: %1$s is a user nickname, %2$s is a group nickname.
                throw new Exception(sprintf(_m('User %1$s is not a member of group %2$s.'),
                                            $user->nickname,
                                            $group->nickname));
            }
            break;
        case Group_privacy_settings::ADMIN:
            if (!$user->isAdmin($group)) {
                // TRANS: Exception thrown when trying to send group private message while not a group administrator.
                // TRANS: %1$s is a user nickname, %2$s is a group nickname.
                throw new Exception(sprintf(_m('User %1$s is not an administrator of group %2$s.'),
                                            $user->nickname,
                                            $group->nickname));
            }
            break;
        default:
            // TRANS: Exception thrown when encountering undefined group privacy settings.
            // TRANS: %s is a group nickname.
            throw new Exception(sprintf(_m('Unknown privacy settings for group %s.'),
                                        $group->nickname));
        }

        return true;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Form for posting a group message
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Form for posting a group message
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class GroupMessageForm extends Form
{
    var $group;
    var $content;

    /**
     * Constructor
     *
     * @param HTMLOutputter $out   Output context
     * @param User_group    $group Group to post to
     *
     * @todo add a drop-down list to post to any group
     */
    function __construct($out, $group, $content=null)
    {
        parent::__construct($out);

        $this->group   = $group;
        $this->content = $content;
    }

    /**
     * Action for the form
     */
    function action()
    {
        return common_local_url('newgroupmessage',
                                array('nickname' => $this->group->nickname));
    }

    /**
     * Legend for the form
     *
     * @param
     *
     * @return
     */
    function formLegend()
    {
        $this->out->element('legend',
                            null,
                            // TRANS: Form legend for sending private message to group %s.
                            sprintf(_m('Message to %s'), $this->group->nickname));
    }

    /**
     * id for the form
     *
     * @param
     *
     * @return
     */
    function id()
    {
        return 'form_notice-group-message';
    }

    /**
     * class for the form
     *
     * @param
     *
     * @return
     */
    function formClass()
    {
        return 'form_notice';
    }

    /**
     * Entry data
     *
     * @param
     *
     * @return
     */
    function formData()
    {
        $this->out->element('label', array('for' => 'notice_data-text',
                                           'id' => 'notice_data-text-label'),
                            // TRANS: Field label for private group message to group %s.
                            sprintf(_m('Direct message to %s'), $this->group->nickname));

        $this->out->element('textarea', array('id' => 'notice_data-text',
                                              'cols' => 35,
                                              'rows' => 4,
                                              'name' => 'content'),
                            ($this->content) ? $this->content : '');

        $contentLimit = Message::maxContent();

        if ($contentLimit > 0) {
            $this->out->elementStart('dl', 'form_note');
            // TRANS: Indicator for number of chatacters still available for notice.
            $this->out->element('dt', null, _m('Available characters'));
            $this->out->element('dd', array('class' => 'count'),
                                $contentLimit);
            $this->out->elementEnd('dl');
        }
    }

    /**
     * Legend for the form
     *
     * @param
     *
     * @return
     */
    function formActions()
    {
        $this->out->element('input', array('id' => 'notice_action-submit',
                                           'class' => 'submit',
                                           'name' => 'message_send',
                                           'type' => 'submit',
                                           // TRANS: Send button text for sending private group notice.
                                           'value' => _m('Send button for sending notice', 'Send')));
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Command object for messages to groups
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Command
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Command object for messages to groups
 *
 * @category  General
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class GroupMessageCommand extends Command
{
    /** User sending the message. */
    var $user;
    /** Nickname of the group they're sending to. */
    var $nickname;
    /** Text of the message. */
    var $text;

    /**
     * Constructor
     *
     * @param User   $user     User sending the message
     * @param string $nickname Nickname of the group
     * @param string $text     Text of message
     */
    function __construct($user, $nickname, $text)
    {
        $this->user     = $user;
        $this->nickname = $nickname;
        $this->text     = $text;
    }

    function handle($channel)
    {
        // Throws a command exception if group not found
        $group = $this->getGroup($this->nickname);

        $gm = Group_message::send($this->user, $group, $this->text);

        $channel->output($this->user,
                         // TRANS: Succes message after sending private group message to group %s.
                         sprintf(_m('Direct message to group %s sent.'),
                                 $group->nickname));

        return true;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Widget for showing list of group messages
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Widget for showing list of group messages
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class GroupMessageList extends Widget
{
    var $gm;

    /**
     * Constructor
     *
     * @param HTMLOutputter $out output context
     * @param Group_message $gm  Group message stream
     */
    function __construct($out, $gm)
    {
        parent::__construct($out);
        $this->gm = $gm;
    }

    /**
     * Show the list
     *
     * @return void
     */
    function show()
    {
        $this->out->elementStart('ul', 'notices messages group-messages');

        $cnt = 0;

        while ($this->gm->fetch() && $cnt <= MESSAGES_PER_PAGE) {

            $cnt++;

            if ($cnt > MESSAGES_PER_PAGE) {
                break;
            }

            $gmli = new GroupMessageListItem($this->out, $this->gm);
            $gmli->show();
        }

        $this->out->elementEnd('ul');

        return $cnt;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Widget for showing an individual group message
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Widget for showing a single group message
 *
 * @category  GroupPrivateMessage
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class GroupMessageListItem extends Widget
{
    var $gm;

    /**
     * Constructor
     *
     * @param HTMLOutputter $out output context
     * @param Group_message $gm  Group message
     */
    function __construct($out, $gm)
    {
        parent::__construct($out);
        $this->gm = $gm;
    }

    /**
     * Show the item
     *
     * @return void
     */
    function show()
    {
        $group  = $this->gm->getGroup();
        $sender = $this->gm->getSender();

        $this->out->elementStart('li', array('class' => 'h-entry notice message group-message',
                                         'id' => 'message-' . $this->gm->id));

        $this->out->elementStart('div', 'entry-title');
        $this->out->elementStart('span', 'vcard author');
        $this->out->elementStart('a',
                                 array('href' => $sender->profileurl,
                                       'class' => 'url'));
        $avatarUrl = $sender->avatarUrl(AVATAR_STREAM_SIZE);
        $this->out->element('img', array('src' => $avatarUrl,
                                    'width' => AVATAR_STREAM_SIZE,
                                    'height' => AVATAR_STREAM_SIZE,
                                    'class' => 'photo avatar',
                                    'alt' => $sender->getBestName()));
        $this->out->element('span',
                            array('class' => 'nickname fn'),
                            $sender->nickname);
        $this->out->elementEnd('a');
        $this->out->elementEnd('span');

        $this->out->elementStart('p', array('class' => 'e-content message-content'));
        $this->out->raw($this->gm->rendered);
        $this->out->elementEnd('p');
        $this->out->elementEnd('div');

        $this->out->elementStart('div', 'e-content');
        $this->out->elementStart('a', array('rel' => 'bookmark',
                                            'class' => 'timestamp',
                                            'href' => $this->gm->url));
        $this->out->element('time', array('class' => 'dt-published',
                                          'datetime' => common_date_iso8601($this->gm->created),
                                          // TRANS: Timestamp title (tooltip text) for NoticeListItem
                                          'title' => common_exact_date($this->gm->created)),
                            common_date_string($this->gm->created));
        $this->out->elementEnd('a');
        $this->out->elementEnd('div');

        $this->out->elementEnd('li');
    }
}


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

#. TRANS: Client exception thrown when trying to send a private group message while not logged in.
#: newgroupmessage.php:68
msgid "Must be logged in."
msgstr ""

#. TRANS: Exception thrown when user %s is not allowed to send a private group message.
#. TRANS: Exception thrown when trying to send group private message without having the right to do that.
#. TRANS: %s is a user nickname.
#: newgroupmessage.php:73 Group_message.php:126
#, php-format
msgid "User %s is not allowed to send private messages."
msgstr ""

#. TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
#. TRANS: Client exception thrown when trying to view group inbox for non-existing group.
#: newgroupmessage.php:91 newgroupmessage.php:98 groupinbox.php:83
#: groupinbox.php:90
msgid "No such group."
msgstr ""

#. TRANS: Title after sending a private group message.
#: newgroupmessage.php:143
msgid "Message sent"
msgstr ""

#. TRANS: Succes text after sending a direct message to group %s.
#: newgroupmessage.php:149
#, php-format
msgid "Direct message to %s sent."
msgstr ""

#. TRANS: Title of form for new private group message.
#: newgroupmessage.php:161
#, php-format
msgid "New message to group %s"
msgstr ""

#. TRANS: Subject for direct-message notification email.
#. TRANS: %1$s is the sending user's nickname, %2$s is the group nickname.
#: Group_message_profile.php:160
#, php-format
msgid "New private message from %1$s to group %2$s"
msgstr ""

#. TRANS: Body for direct-message notification email.
#. TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
#. TRANS: %3$s is the message content, %4$s a URL to the message,
#. TRANS: %5$s is the StatusNet sitename.
#: Group_message_profile.php:166
#, php-format
msgid ""
"%1$s (%2$s) sent a private message to group %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"You can reply to their message here:\n"
"\n"
"%5$s\n"
"\n"
"Do not reply to this email; it will not get to them.\n"
"\n"
"With kind regards,\n"
"%6$s"
msgstr ""

#. TRANS: Menu item in group page.
#: GroupPrivateMessagePlugin.php:206
msgctxt "MENU"
msgid "Inbox"
msgstr ""

#. TRANS: Menu title in group page.
#: GroupPrivateMessagePlugin.php:208
msgid "Private messages for this group."
msgstr ""

#. TRANS: Dropdown label in group settings page for if group allows private messages.
#: GroupPrivateMessagePlugin.php:254
msgid "Private messages"
msgstr ""

#. TRANS: Dropdown option in group settings page for allowing private messages.
#: GroupPrivateMessagePlugin.php:256
msgid "Sometimes"
msgstr ""

#. TRANS: Dropdown option in group settings page for allowing private messages.
#: GroupPrivateMessagePlugin.php:258
msgid "Always"
msgstr ""

#. TRANS: Dropdown option in group settings page for allowing private messages.
#: GroupPrivateMessagePlugin.php:260
msgid "Never"
msgstr ""

#. TRANS: Dropdown title in group settings page for if group allows private messages.
#: GroupPrivateMessagePlugin.php:262
msgid "Whether to allow private messages to this group."
msgstr ""

#. TRANS: Dropdown label in group settings page for who can send private messages to the group.
#: GroupPrivateMessagePlugin.php:269
msgid "Private senders"
msgstr ""

#. TRANS: Dropdown option in group settings page for who can send private messages.
#: GroupPrivateMessagePlugin.php:271
msgid "Everyone"
msgstr ""

#. TRANS: Dropdown option in group settings page for who can send private messages.
#: GroupPrivateMessagePlugin.php:273
msgid "Member"
msgstr ""

#. TRANS: Dropdown option in group settings page for who can send private messages.
#: GroupPrivateMessagePlugin.php:275
msgid "Admin"
msgstr ""

#. TRANS: Dropdown title in group settings page for who can send private messages to the group.
#: GroupPrivateMessagePlugin.php:277
msgid "Who can send private messages to the group."
msgstr ""

#. TRANS: Title for action in group actions list.
#: GroupPrivateMessagePlugin.php:379
msgid "Send a direct message to this group."
msgstr ""

#. TRANS: Link text for action in group actions list to send a private message to a group.
#: GroupPrivateMessagePlugin.php:381
msgctxt "LINKTEXT"
msgid "Message"
msgstr ""

#. TRANS: Client exception thrown when a private group message has to be forced.
#: GroupPrivateMessagePlugin.php:459
msgid "Forced notice to private group message."
msgstr ""

#. TRANS: Indicator on the group page that the group is (essentially) private.
#: GroupPrivateMessagePlugin.php:481
msgid "Private"
msgstr ""

#. TRANS: Plugin description.
#: GroupPrivateMessagePlugin.php:507
msgid "Allow posting private messages to groups."
msgstr ""

#. TRANS: Client exception thrown when trying to view group inbox while not logged in.
#: groupinbox.php:66
msgid "Only for logged-in users."
msgstr ""

#. TRANS: Client exception thrown when trying to view group inbox while not a member.
#: groupinbox.php:95
msgid "Only for members."
msgstr ""

#. TRANS: Text of group inbox if no private messages were sent to it.
#: groupinbox.php:129
msgid "This group has not received any private messages."
msgstr ""

#. TRANS: Title of inbox for group %s.
#: groupinbox.php:175
#, php-format
msgid "%s group inbox"
msgstr ""

#. TRANS: Page title for any but first group page.
#. TRANS: %1$s is a group name, $2$s is a page number.
#: groupinbox.php:179
#, php-format
msgid "%1$s group inbox, page %2$d"
msgstr ""

#. TRANS: Instructions for user inbox page.
#: groupinbox.php:210
msgid ""
"This is the group inbox, which lists all incoming private messages for this "
"group."
msgstr ""

#. TRANS: Form legend for sending private message to group %s.
#: groupmessageform.php:89
#, php-format
msgid "Message to %s"
msgstr ""

#. TRANS: Field label for private group message to group %s.
#: groupmessageform.php:128
#, php-format
msgid "Direct message to %s"
msgstr ""

#. TRANS: Indicator for number of chatacters still available for notice.
#: groupmessageform.php:141
msgid "Available characters"
msgstr ""

#. TRANS: Send button text for sending private group notice.
#: groupmessageform.php:162
msgctxt "Send button for sending notice"
msgid "Send"
msgstr ""

#. TRANS: Exception thrown when trying to set group privacy setting if group %s does not allow private messages.
#: Group_privacy_settings.php:162
#, php-format
msgid "Group %s does not allow private messages."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message while blocked from that group.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#: Group_privacy_settings.php:172
#, php-format
msgid "User %1$s is blocked from group %2$s."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message while not a member.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#: Group_privacy_settings.php:181
#, php-format
msgid "User %1$s is not a member of group %2$s."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message while not a group administrator.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#: Group_privacy_settings.php:190
#, php-format
msgid "User %1$s is not an administrator of group %2$s."
msgstr ""

#. TRANS: Exception thrown when encountering undefined group privacy settings.
#. TRANS: %s is a group nickname.
#: Group_privacy_settings.php:198
#, php-format
msgid "Unknown privacy settings for group %s."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message that is too long.
#. TRANS: %d is the maximum meggage length.
#: Group_message.php:139
#, php-format
msgid "That's too long. Maximum message size is %d character."
msgid_plural "That's too long. Maximum message size is %d characters."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when trying to send group private message to a non-existing group.
#: Group_message.php:183
msgid "No group for group message."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message without having a sender.
#: Group_message.php:193
msgid "No sender for group message."
msgstr ""

#. TRANS: Client exception thrown when trying to view group private messages without being logged in.
#: showgroupmessage.php:69
msgid "Only logged-in users can view private messages."
msgstr ""

#. TRANS: Client exception thrown when trying to view a non-existing group private message.
#: showgroupmessage.php:79
msgid "No such message."
msgstr ""

#. TRANS: Server exception thrown when trying to view group private messages for a non-exsting group.
#: showgroupmessage.php:86
msgid "Group not found."
msgstr ""

#. TRANS: Client exception thrown when trying to view a group private message without being a group member.
#: showgroupmessage.php:91
msgid "Cannot read message."
msgstr ""

#. TRANS: Server exception thrown when trying to view a group private message without a sender.
#: showgroupmessage.php:98
msgid "No sender found."
msgstr ""

#. TRANS: Title for private group message.
#. TRANS: %1$s is the sender name, %2$s is the group name, %3$s is a timestamp.
#: showgroupmessage.php:123
#, php-format
msgid "Message from %1$s to group %2$s on %3$s"
msgstr ""

#. TRANS: Succes message after sending private group message to group %s.
#: groupmessagecommand.php:79
#, php-format
msgid "Direct message to group %s sent."
msgstr ""


code:
# Translation of StatusNet - GroupPrivateMessage to Arabic (العربية)
# Exported from translatewiki.net
#
# Author: Majid Al-Dharrab
# Author: OsamaK
# Author: ترجمان05
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - GroupPrivateMessage\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:08:47+0000\n"
"Language-Team: Arabic <https://translatewiki.net/wiki/Portal:ar>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:48:53+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: ar\n"
"X-Message-Group: #out-statusnet-plugin-groupprivatemessage\n"
"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == "
"2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= "
"99) ? 4 : 5 ) ) ) );\n"

#. TRANS: Client exception thrown when trying to send a private group message while not logged in.
msgid "Must be logged in."
msgstr "يجب الولوج."

#. TRANS: Exception thrown when user %s is not allowed to send a private group message.
#. TRANS: Exception thrown when trying to send group private message without having the right to do that.
#. TRANS: %s is a user nickname.
#, php-format
msgid "User %s is not allowed to send private messages."
msgstr "لا يسمح للمستخدم %s بإرسال رسائل خاصة."

#. TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
#. TRANS: Client exception thrown when trying to view group inbox for non-existing group.
msgid "No such group."
msgstr "لا توجد مجموعة بهذا الاسم."

#. TRANS: Title after sending a private group message.
msgid "Message sent"
msgstr "أُرسلت الرسالة"

#. TRANS: Succes text after sending a direct message to group %s.
#, php-format
msgid "Direct message to %s sent."
msgstr "أُرسلت رسالة مباشرة إلى %s."

#. TRANS: Title of form for new private group message.
#, php-format
msgid "New message to group %s"
msgstr "رسالة جديدة لمجموعة %s"

#. TRANS: Subject for direct-message notification email.
#. TRANS: %1$s is the sending user's nickname, %2$s is the group nickname.
#, php-format
msgid "New private message from %1$s to group %2$s"
msgstr "رسالة جديدة من %1$s إلى مجموعة %2$s"

#. TRANS: Body for direct-message notification email.
#. TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
#. TRANS: %3$s is the message content, %4$s a URL to the message,
#. TRANS: %5$s is the StatusNet sitename.
#, php-format
msgid ""
"%1$s (%2$s) sent a private message to group %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"You can reply to their message here:\n"
"\n"
"%5$s\n"
"\n"
"Do not reply to this email; it will not get to them.\n"
"\n"
"With kind regards,\n"
"%6$s"
msgstr ""
"أرسل %1$s (%2$s) رسالة خاصة لمجموعة %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"يمكن أن ترد على رسالته من:\n"
"\n"
"%5$s\n"
"\n"
"لا ترد على هذا البريد؛ لأنه لن يصل إلى المستخدم.\n"
"\n"
"مع تحياتنا العطرة،\n"
"%6$s"

#. TRANS: Menu item in group page.
msgctxt "MENU"
msgid "Inbox"
msgstr "صندوق الوارد"

#. TRANS: Menu title in group page.
msgid "Private messages for this group."
msgstr "الرسائل الخاصة بهذه المجموعة."

#. TRANS: Dropdown label in group settings page for if group allows private messages.
msgid "Private messages"
msgstr "الرسائل الخاصة"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Sometimes"
msgstr "أحيانًا"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Always"
msgstr "دائمًا"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Never"
msgstr "مطلقا"

#. TRANS: Dropdown title in group settings page for if group allows private messages.
msgid "Whether to allow private messages to this group."
msgstr "هل تود السماح بالرسائل الخاصة لهذه المجموعة؟"

#. TRANS: Dropdown label in group settings page for who can send private messages to the group.
msgid "Private senders"
msgstr "مرسلون خاصون"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Everyone"
msgstr "الجميع"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Member"
msgstr "العضو"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Admin"
msgstr "الإداري"

#. TRANS: Dropdown title in group settings page for who can send private messages to the group.
msgid "Who can send private messages to the group."
msgstr "من يستطيع إرسال رسائل خاصة للمجموعة."

#. TRANS: Title for action in group actions list.
msgid "Send a direct message to this group."
msgstr ""

#. TRANS: Link text for action in group actions list to send a private message to a group.
msgctxt "LINKTEXT"
msgid "Message"
msgstr "راسل"

#. TRANS: Client exception thrown when a private group message has to be forced.
msgid "Forced notice to private group message."
msgstr ""

#. TRANS: Indicator on the group page that the group is (essentially) private.
msgid "Private"
msgstr "خاصة"

#. TRANS: Plugin description.
msgid "Allow posting private messages to groups."
msgstr "هل تود السماح بإرسال رسائل خاصة للمجموعات؟"

#. TRANS: Client exception thrown when trying to view group inbox while not logged in.
msgid "Only for logged-in users."
msgstr ""

#. TRANS: Client exception thrown when trying to view group inbox while not a member.
msgid "Only for members."
msgstr "فقط للأعضاء."

#. TRANS: Text of group inbox if no private messages were sent to it.
msgid "This group has not received any private messages."
msgstr "لم تتلقَ هذه المجموعة أي رسائل خاصة."

#. TRANS: Title of inbox for group %s.
#, php-format
msgid "%s group inbox"
msgstr "صندوق مجموعة %s الوارد"

#. TRANS: Page title for any but first group page.
#. TRANS: %1$s is a group name, $2$s is a page number.
#, php-format
msgid "%1$s group inbox, page %2$d"
msgstr "صندوق مجموعة %1$s الوارد، الصفحة %2$d"

#. TRANS: Instructions for user inbox page.
msgid ""
"This is the group inbox, which lists all incoming private messages for this "
"group."
msgstr ""

#. TRANS: Form legend for sending private message to group %s.
#, php-format
msgid "Message to %s"
msgstr "رسالة إلى %s."

#. TRANS: Field label for private group message to group %s.
#, php-format
msgid "Direct message to %s"
msgstr "رسالة مباشرة ل%s"

#. TRANS: Indicator for number of chatacters still available for notice.
msgid "Available characters"
msgstr "الأحرف المتاحة"

#. TRANS: Send button text for sending private group notice.
msgctxt "Send button for sending notice"
msgid "Send"
msgstr "أرسل"

#. TRANS: Exception thrown when trying to set group privacy setting if group %s does not allow private messages.
#, php-format
msgid "Group %s does not allow private messages."
msgstr "لا تمسح المجموعة %s بالرسائل الخاصة."

#. TRANS: Exception thrown when trying to send group private message while blocked from that group.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is blocked from group %2$s."
msgstr "المستخدم %1$s ممنوع من القائمة %2$s."

#. TRANS: Exception thrown when trying to send group private message while not a member.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is not a member of group %2$s."
msgstr "المستخدم %1$s ليس عضوا في المجموعة %2$s."

#. TRANS: Exception thrown when trying to send group private message while not a group administrator.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is not an administrator of group %2$s."
msgstr "المستخدم %1$s  ليس إداريا للمجموعة %2$s."

#. TRANS: Exception thrown when encountering undefined group privacy settings.
#. TRANS: %s is a group nickname.
#, php-format
msgid "Unknown privacy settings for group %s."
msgstr "إعدادات الخصوصية للمجموعة %s غير معروفة."

#. TRANS: Exception thrown when trying to send group private message that is too long.
#. TRANS: %d is the maximum meggage length.
#, php-format
msgid "That's too long. Maximum message size is %d character."
msgid_plural "That's too long. Maximum message size is %d characters."
msgstr[0] "هذا أطول من الحد المسموح به. لا يسمح بوضع حرف واحد في الرسالة."
msgstr[1] "هذا أطول من الحد المسموح به. لا يسمح بوضع أكثر حرف واحد في الرسالة."
msgstr[2] "هذا أطول من الحد المسموح به. لا يسمح بوضع أكثر من حرفين في الرسالة."
msgstr[3] ""
"هذا أطول من الحد المسموح به. لا يسمح بوضع أكثر من %d أحرف في الرسالة."
msgstr[4] ""
"هذا أطول من الحد المسموح به. لا يسمح بوضع أكثر من %d حرفًا في الرسالة."
msgstr[5] ""
"هذا أطول من الحد المسموح به. لا يسمح بوضع أكثر من %d حرف في الرسالة."

#. TRANS: Exception thrown when trying to send group private message to a non-existing group.
msgid "No group for group message."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message without having a sender.
msgid "No sender for group message."
msgstr ""

#. TRANS: Client exception thrown when trying to view group private messages without being logged in.
msgid "Only logged-in users can view private messages."
msgstr ""

#. TRANS: Client exception thrown when trying to view a non-existing group private message.
msgid "No such message."
msgstr ""

#. TRANS: Server exception thrown when trying to view group private messages for a non-exsting group.
msgid "Group not found."
msgstr "المجموعة غير موجودة."

#. TRANS: Client exception thrown when trying to view a group private message without being a group member.
msgid "Cannot read message."
msgstr "تعذرت قراءة الرسالة."

#. TRANS: Server exception thrown when trying to view a group private message without a sender.
msgid "No sender found."
msgstr ""

#. TRANS: Title for private group message.
#. TRANS: %1$s is the sender name, %2$s is the group name, %3$s is a timestamp.
#, php-format
msgid "Message from %1$s to group %2$s on %3$s"
msgstr "رسالة من %1$s إلى مجموعة %2$s في %3$s"

#. TRANS: Succes message after sending private group message to group %s.
#, php-format
msgid "Direct message to group %s sent."
msgstr "أرسلت رسالة مبشارة إلى مجموعة %s."


code:
# Translation of StatusNet - GroupPrivateMessage to Breton (Brezhoneg)
# Exported from translatewiki.net
#
# Author: Fulup
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - GroupPrivateMessage\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-31 21:06+0000\n"
"PO-Revision-Date: 2011-03-31 21:09:31+0000\n"
"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-26 16:23:18+0000\n"
"X-Generator: MediaWiki 1.18alpha (r85082); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: br\n"
"X-Message-Group: #out-statusnet-plugin-groupprivatemessage\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

msgid "Must be logged in."
msgstr ""

#, fuzzy, php-format
msgid "User %s not allowed to send private messages."
msgstr "N'eus bet kaset kemennadenn brevez ebet d'ar strollad-mañ."

msgid "No such group."
msgstr ""

msgid "Message sent"
msgstr ""

#, php-format
msgid "Direct message to %s sent."
msgstr ""

#, fuzzy, php-format
msgid "New message to group %s"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

#. TRANS: Subject for direct-message notification email.
#. TRANS: %s is the sending user's nickname.
#, fuzzy, php-format
msgid "New private message from %1$s to group %2$s"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

#. TRANS: Body for direct-message notification email.
#. TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
#. TRANS: %3$s is the message content, %4$s a URL to the message,
#. TRANS: %5$s is the StatusNet sitename.
#, php-format
msgid ""
"%1$s (%2$s) sent a private message to group %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"You can reply to their message here:\n"
"\n"
"%5$s\n"
"\n"
"Do not reply to this email; it will not get to them.\n"
"\n"
"With kind regards,\n"
"%6$s"
msgstr ""

msgid "Inbox"
msgstr "Boest resev"

msgid "Private messages for this group"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

#, fuzzy
msgid "Private messages"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

msgid "Sometimes"
msgstr ""

msgid "Always"
msgstr ""

msgid "Never"
msgstr ""

#, fuzzy
msgid "Whether to allow private messages to this group"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

msgid "Private sender"
msgstr ""

msgid "Everyone"
msgstr ""

msgid "Member"
msgstr ""

msgid "Admin"
msgstr ""

#, fuzzy
msgid "Who can send private messages to the group"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

#, fuzzy
msgid "Send a direct message to this group"
msgstr "Kemennadennoù prevez evit a strollad-mañ"

msgid "Message"
msgstr ""

msgid "Forced notice to private group message."
msgstr ""

msgid "Private"
msgstr ""

msgid "Allow posting DMs to a group."
msgstr ""

msgid "Only for logged-in users."
msgstr ""

msgid "Only for members."
msgstr ""

msgid "This group has not received any private messages."
msgstr "N'eus bet kaset kemennadenn brevez ebet d'ar strollad-mañ."

#, php-format
msgid "%s group inbox"
msgstr ""

#. TRANS: Page title for any but first group page.
#. TRANS: %1$s is a group name, $2$s is a page number.
#, php-format
msgid "%1$s group inbox, page %2$d"
msgstr ""

#. TRANS: Instructions for user inbox page.
msgid ""
"This is the group inbox, which lists all incoming private messages for this "
"group."
msgstr ""

#, php-format
msgid "Message to %s"
msgstr ""

#, php-format
msgid "Direct message to %s"
msgstr ""

msgid "Available characters"
msgstr ""

msgctxt "Send button for sending notice"
msgid "Send"
msgstr "Kas"

#, fuzzy, php-format
msgid "Group %s does not allow private messages."
msgstr "N'eus bet kaset kemennadenn brevez ebet d'ar strollad-mañ."

#, php-format
msgid "User %1$s is blocked from group %2$s."
msgstr ""

#, php-format
msgid "User %1$s is not a member of group %2$s."
msgstr ""

#, php-format
msgid "User %1$s is not an administrator of group %2$s."
msgstr ""

#, php-format
msgid "Unknown privacy settings for group %s."
msgstr ""

#, fuzzy, php-format
msgid "User %s is not allowed to send private messages."
msgstr "N'eus bet kaset kemennadenn brevez ebet d'ar strollad-mañ."

#, php-format
msgid "That's too long. Maximum message size is %d character."
msgid_plural "That's too long. Maximum message size is %d characters."
msgstr[0] ""
"Re hir eo. %d eo an niver brasañ a arouezennoù a c'haller kaout en ur "
"gemennadenn."
msgstr[1] ""
"Re hir eo. %d eo an niver brasañ a arouezennoù a c'haller kaout en ur "
"gemennadenn."

msgid "No group for group message"
msgstr ""

msgid "No sender for group message"
msgstr ""

msgid "Only logged-in users can view private messages."
msgstr ""

msgid "No such message."
msgstr ""

msgid "Group not found."
msgstr ""

msgid "Cannot read message."
msgstr ""

msgid "No sender found."
msgstr ""

#, php-format
msgid "Message from %1$s to group %2$s on %3$s"
msgstr ""

#, php-format
msgid "Direct message to group %s sent."
msgstr ""


code:
# Translation of StatusNet - GroupPrivateMessage to Catalan (català)
# Exported from translatewiki.net
#
# Author: Toniher
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - GroupPrivateMessage\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:08:48+0000\n"
"Language-Team: Catalan <https://translatewiki.net/wiki/Portal:ca>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:48:53+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: ca\n"
"X-Message-Group: #out-statusnet-plugin-groupprivatemessage\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to send a private group message while not logged in.
msgid "Must be logged in."
msgstr "Cal que hàgiu iniciat una sessió."

#. TRANS: Exception thrown when user %s is not allowed to send a private group message.
#. TRANS: Exception thrown when trying to send group private message without having the right to do that.
#. TRANS: %s is a user nickname.
#, php-format
msgid "User %s is not allowed to send private messages."
msgstr "L'usuari %s no té permisos per enviar missatges privats."

#. TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
#. TRANS: Client exception thrown when trying to view group inbox for non-existing group.
msgid "No such group."
msgstr "No existeix el grup."

#. TRANS: Title after sending a private group message.
msgid "Message sent"
msgstr "S'ha enviat el missatge"

#. TRANS: Succes text after sending a direct message to group %s.
#, php-format
msgid "Direct message to %s sent."
msgstr "S'ha enviat el missatge directe a %s."

#. TRANS: Title of form for new private group message.
#, php-format
msgid "New message to group %s"
msgstr "Missatge nou al grup %s"

#. TRANS: Subject for direct-message notification email.
#. TRANS: %1$s is the sending user's nickname, %2$s is the group nickname.
#, php-format
msgid "New private message from %1$s to group %2$s"
msgstr "Nou missatge privat de %1$s al grup %2$s"

#. TRANS: Body for direct-message notification email.
#. TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
#. TRANS: %3$s is the message content, %4$s a URL to the message,
#. TRANS: %5$s is the StatusNet sitename.
#, php-format
msgid ""
"%1$s (%2$s) sent a private message to group %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"You can reply to their message here:\n"
"\n"
"%5$s\n"
"\n"
"Do not reply to this email; it will not get to them.\n"
"\n"
"With kind regards,\n"
"%6$s"
msgstr ""
"%1$s (%2$s) ha enviat un missatge privat al grup %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"Podeu respondre al missatge des d'aquí:\n"
"%5$s\n"
"\n"
"No respongueu aquest missatge; no el rebran.\n"
"\n"
"Atentament,\n"
"%6$s"

#. TRANS: Menu item in group page.
msgctxt "MENU"
msgid "Inbox"
msgstr "Safata d'entrada"

#. TRANS: Menu title in group page.
msgid "Private messages for this group."
msgstr "Missatges privats del grup."

#. TRANS: Dropdown label in group settings page for if group allows private messages.
msgid "Private messages"
msgstr "Missatges privats"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Sometimes"
msgstr "A vegades"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Always"
msgstr "Sempre"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Never"
msgstr "Mai"

#. TRANS: Dropdown title in group settings page for if group allows private messages.
msgid "Whether to allow private messages to this group."
msgstr "Si permetre missatges privat al grup."

#. TRANS: Dropdown label in group settings page for who can send private messages to the group.
msgid "Private senders"
msgstr "Remitents privats"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Everyone"
msgstr "Tothom"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Member"
msgstr "Membre"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Admin"
msgstr "Administrador"

#. TRANS: Dropdown title in group settings page for who can send private messages to the group.
msgid "Who can send private messages to the group."
msgstr "Qui pot enviar missatges al grup."

#. TRANS: Title for action in group actions list.
msgid "Send a direct message to this group."
msgstr "Envia un missatge directe al grup."

#. TRANS: Link text for action in group actions list to send a private message to a group.
msgctxt "LINKTEXT"
msgid "Message"
msgstr "Missatge"

#. TRANS: Client exception thrown when a private group message has to be forced.
msgid "Forced notice to private group message."
msgstr ""

#. TRANS: Indicator on the group page that the group is (essentially) private.
msgid "Private"
msgstr "Privat"

#. TRANS: Plugin description.
msgid "Allow posting private messages to groups."
msgstr "Permet publicar missatges privats als grups."

#. TRANS: Client exception thrown when trying to view group inbox while not logged in.
msgid "Only for logged-in users."
msgstr "Només per a usuaris que han iniciat una sessió"

#. TRANS: Client exception thrown when trying to view group inbox while not a member.
msgid "Only for members."
msgstr "Només per a membres."

#. TRANS: Text of group inbox if no private messages were sent to it.
msgid "This group has not received any private messages."
msgstr "Aquest grup no ha rebut cap missatge privat."

#. TRANS: Title of inbox for group %s.
#, php-format
msgid "%s group inbox"
msgstr "Safata d'entrada del grup %s"

#. TRANS: Page title for any but first group page.
#. TRANS: %1$s is a group name, $2$s is a page number.
#, php-format
msgid "%1$s group inbox, page %2$d"
msgstr "Safata d'entrada del grup %1$s, pàgina %2$d"

#. TRANS: Instructions for user inbox page.
msgid ""
"This is the group inbox, which lists all incoming private messages for this "
"group."
msgstr ""
"Aquesta és la safata d'entrada del grup, que llista tots els missatges "
"privats entrants que arriben al grup."

#. TRANS: Form legend for sending private message to group %s.
#, php-format
msgid "Message to %s"
msgstr "Missatge a %s"

#. TRANS: Field label for private group message to group %s.
#, php-format
msgid "Direct message to %s"
msgstr "Missatge directe a %s"

#. TRANS: Indicator for number of chatacters still available for notice.
msgid "Available characters"
msgstr "Caràcters disponibles"

#. TRANS: Send button text for sending private group notice.
msgctxt "Send button for sending notice"
msgid "Send"
msgstr "Envia"

#. TRANS: Exception thrown when trying to set group privacy setting if group %s does not allow private messages.
#, php-format
msgid "Group %s does not allow private messages."
msgstr "El grup %s no permet missatges privats."

#. TRANS: Exception thrown when trying to send group private message while blocked from that group.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is blocked from group %2$s."
msgstr "L'usuari %1$s està blocat del grup %2$s."

#. TRANS: Exception thrown when trying to send group private message while not a member.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is not a member of group %2$s."
msgstr "L'usuari %1$s no és un membre del grup %2$s."

#. TRANS: Exception thrown when trying to send group private message while not a group administrator.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is not an administrator of group %2$s."
msgstr "L'usuari %1$s no és un administrador del grup %2$s."

#. TRANS: Exception thrown when encountering undefined group privacy settings.
#. TRANS: %s is a group nickname.
#, php-format
msgid "Unknown privacy settings for group %s."
msgstr "Paràmetres de privadesa incorrectes del grup %s."

#. TRANS: Exception thrown when trying to send group private message that is too long.
#. TRANS: %d is the maximum meggage length.
#, php-format
msgid "That's too long. Maximum message size is %d character."
msgid_plural "That's too long. Maximum message size is %d characters."
msgstr[0] "És massa llarg. La mida màxima del missatge és %d caràcter."
msgstr[1] "És massa llarg. La mida màxima del missatge és %d caràcters."

#. TRANS: Exception thrown when trying to send group private message to a non-existing group.
msgid "No group for group message."
msgstr ""

#. TRANS: Exception thrown when trying to send group private message without having a sender.
msgid "No sender for group message."
msgstr ""

#. TRANS: Client exception thrown when trying to view group private messages without being logged in.
msgid "Only logged-in users can view private messages."
msgstr ""

#. TRANS: Client exception thrown when trying to view a non-existing group private message.
msgid "No such message."
msgstr "No existeix el missatge."

#. TRANS: Server exception thrown when trying to view group private messages for a non-exsting group.
msgid "Group not found."
msgstr "No s'ha trobat el grup."

#. TRANS: Client exception thrown when trying to view a group private message without being a group member.
msgid "Cannot read message."
msgstr "No es pot llegir el missatge."

#. TRANS: Server exception thrown when trying to view a group private message without a sender.
msgid "No sender found."
msgstr "No s'ha trobat el remitent."

#. TRANS: Title for private group message.
#. TRANS: %1$s is the sender name, %2$s is the group name, %3$s is a timestamp.
#, php-format
msgid "Message from %1$s to group %2$s on %3$s"
msgstr ""

#. TRANS: Succes message after sending private group message to group %s.
#, php-format
msgid "Direct message to group %s sent."
msgstr "S'ha enviat el missatge directe al grup %s."


code:
# Translation of StatusNet - GroupPrivateMessage to German (Deutsch)
# Exported from translatewiki.net
#
# Author: Giftpflanze
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - GroupPrivateMessage\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:08:48+0000\n"
"Language-Team: German <https://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:48:53+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-groupprivatemessage\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to send a private group message while not logged in.
msgid "Must be logged in."
msgstr "Du musst angemeldet sein."

#. TRANS: Exception thrown when user %s is not allowed to send a private group message.
#. TRANS: Exception thrown when trying to send group private message without having the right to do that.
#. TRANS: %s is a user nickname.
#, php-format
msgid "User %s is not allowed to send private messages."
msgstr "Benutzer %s darf keine privaten Nachrichten verschicken."

#. TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
#. TRANS: Client exception thrown when trying to view group inbox for non-existing group.
msgid "No such group."
msgstr "Keine solche Gruppe."

#. TRANS: Title after sending a private group message.
msgid "Message sent"
msgstr "Nachricht verschickt"

#. TRANS: Succes text after sending a direct message to group %s.
#, php-format
msgid "Direct message to %s sent."
msgstr "Direkte Nachricht an %s verschickt."

#. TRANS: Title of form for new private group message.
#, php-format
msgid "New message to group %s"
msgstr "Neue Nachricht an Gruppe %s"

#. TRANS: Subject for direct-message notification email.
#. TRANS: %1$s is the sending user's nickname, %2$s is the group nickname.
#, php-format
msgid "New private message from %1$s to group %2$s"
msgstr "Neue private Nachricht von %1$s an Gruppe %2$s"

#. TRANS: Body for direct-message notification email.
#. TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
#. TRANS: %3$s is the message content, %4$s a URL to the message,
#. TRANS: %5$s is the StatusNet sitename.
#, php-format
msgid ""
"%1$s (%2$s) sent a private message to group %3$s:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"You can reply to their message here:\n"
"\n"
"%5$s\n"
"\n"
"Do not reply to this email; it will not get to them.\n"
"\n"
"With kind regards,\n"
"%6$s"
msgstr ""
"%1$s (%2$s) hat eine private Nachricht an Gruppe %3$s geschickt:\n"
"\n"
"------------------------------------------------------\n"
"%4$s\n"
"------------------------------------------------------\n"
"\n"
"Du kannst hier auf die Nachricht antworten:\n"
"\n"
"%5$s\n"
"\n"
"Antworte nicht auf diese E-Mail; sie wird den Absender der Nachricht nicht "
"erreichen.\n"
"\n"
"Mit freundlichen Grüßen,\n"
"%6$s"

#. TRANS: Menu item in group page.
msgctxt "MENU"
msgid "Inbox"
msgstr "Posteingang"

#. TRANS: Menu title in group page.
msgid "Private messages for this group."
msgstr "Private Nachrichten für diese Gruppe."

#. TRANS: Dropdown label in group settings page for if group allows private messages.
msgid "Private messages"
msgstr "Private Nachrichten"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Sometimes"
msgstr "Manchmal"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Always"
msgstr "Immer"

#. TRANS: Dropdown option in group settings page for allowing private messages.
msgid "Never"
msgstr "Niemals"

#. TRANS: Dropdown title in group settings page for if group allows private messages.
msgid "Whether to allow private messages to this group."
msgstr "Ob private Nachrichten an diese Gruppe erlaubt sein sollen."

#. TRANS: Dropdown label in group settings page for who can send private messages to the group.
msgid "Private senders"
msgstr "Erlaubte Benutzer"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Everyone"
msgstr "Jeder"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Member"
msgstr "Mitglieder"

#. TRANS: Dropdown option in group settings page for who can send private messages.
msgid "Admin"
msgstr "Admins"

#. TRANS: Dropdown title in group settings page for who can send private messages to the group.
msgid "Who can send private messages to the group."
msgstr "Wer private Nachrichten an diese Gruppe senden darf."

#. TRANS: Title for action in group actions list.
msgid "Send a direct message to this group."
msgstr "Schicke eine direkte Nachricht an diese Gruppe."

#. TRANS: Link text for action in group actions list to send a private message to a group.
msgctxt "LINKTEXT"
msgid "Message"
msgstr "Nachricht"

#. TRANS: Client exception thrown when a private group message has to be forced.
msgid "Forced notice to private group message."
msgstr "Erzwinge Nachricht auf private Gruppennachricht."

#. TRANS: Indicator on the group page that the group is (essentially) private.
msgid "Private"
msgstr "Privat"

#. TRANS: Plugin description.
msgid "Allow posting private messages to groups."
msgstr "Erlaube das Versenden von privaten Nachrichten an Gruppen."

#. TRANS: Client exception thrown when trying to view group inbox while not logged in.
msgid "Only for logged-in users."
msgstr "Nur für angemeldete Benutzer."

#. TRANS: Client exception thrown when trying to view group inbox while not a member.
msgid "Only for members."
msgstr "Nur für Mitglieder."

#. TRANS: Text of group inbox if no private messages were sent to it.
msgid "This group has not received any private messages."
msgstr "Diese Gruppe hat noch keine privaten Nachrichten erhalten."

#. TRANS: Title of inbox for group %s.
#, php-format
msgid "%s group inbox"
msgstr "Posteingang der Gruppe %s"

#. TRANS: Page title for any but first group page.
#. TRANS: %1$s is a group name, $2$s is a page number.
#, php-format
msgid "%1$s group inbox, page %2$d"
msgstr "Posteingang der Gruppe %1$s, Seite %2$d"

#. TRANS: Instructions for user inbox page.
msgid ""
"This is the group inbox, which lists all incoming private messages for this "
"group."
msgstr ""
"Dies ist der Gruppenposteingang, der alle eingehenden privaten Nachrichten "
"für diese Gruppe auflistet."

#. TRANS: Form legend for sending private message to group %s.
#, php-format
msgid "Message to %s"
msgstr "Nachricht an %s"

#. TRANS: Field label for private group message to group %s.
#, php-format
msgid "Direct message to %s"
msgstr "Direkte Nachricht an %s"

#. TRANS: Indicator for number of chatacters still available for notice.
msgid "Available characters"
msgstr "Noch verfügbare Zeichen"

#. TRANS: Send button text for sending private group notice.
msgctxt "Send button for sending notice"
msgid "Send"
msgstr "Abschicken"

#. TRANS: Exception thrown when trying to set group privacy setting if group %s does not allow private messages.
#, php-format
msgid "Group %s does not allow private messages."
msgstr "Gruppe %s erlaubt keine privaten Nachrichten."

#. TRANS: Exception thrown when trying to send group private message while blocked from that group.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is blocked from group %2$s."
msgstr "Benutzer %1$s ist von Gruppe %2$s ausgesperrt."

#. TRANS: Exception thrown when trying to send group private message while not a member.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is not a member of group %2$s."
msgstr "Benutzer %1$s ist kein Mitglied der Gruppe %2$s."

#. TRANS: Exception thrown when trying to send group private message while not a group administrator.
#. TRANS: %1$s is a user nickname, %2$s is a group nickname.
#, php-format
msgid "User %1$s is not an administrator of group %2$s."
msgstr "Benutzer %1$s ist kein Admin von Gruppe %2$s."

#. TRANS: Exception thrown when encountering undefined group privacy settings.
#. TRANS: %s is a group nickname.
#, php-format
msgid "Unknown privacy settings for group %s."
msgstr "Unbekannte Datenschutzeinstellungen für Gruppe %s."

#. TRANS: Exception thrown when trying to send group private message that is too long.
#. TRANS: %d is the maximum meggage length.
#, php-format
msgid "That's too long. Maximum message size is %d character."
msgid_plural "That's too long. Maximum message size is %d characters."
msgstr[0] "Das ist zu lang. Maximale Nachrichtengröße ist %d Zeichen."
msgstr[1] "Das ist zu lang. Maximale Nachrichtengröße ist %d Zeichen."

#. TRANS: Exception thrown when trying to send group private message to a non-existing group.
msgid "No group for group message."
msgstr "Gruppe nicht vorhanden."

#. TRANS: Exception thrown when trying to send group private message without having a sender.
msgid "No sender for group message."
msgstr "Kein Absender."

#. TRANS: Client exception thrown when trying to view group private messages without being logged in.
msgid "Only logged-in users can view private messages."
msgstr "Nur angemeldete Benutzer können private Nachrichten ansehen."

#. TRANS: Client exception thrown when trying to view a non-existing group private message.
msgid "No such message."
msgstr "Keine solche Nachricht."

#. TRANS: Server exception thrown when trying to view group private messages for a non-exsting group.
msgid "Group not found."
msgstr "Gruppe nicht gefunden."

#. TRANS: Client exception thrown when trying to view a group private message without being a group member.
msgid "Cannot read message."
msgstr "Kann Nachricht nicht lesen."

#. TRANS: Server exception thrown when trying to view a group private message without a sender.
msgid "No sender found."
msgstr "Kein Absender gefunden."

#. TRANS: Title for private group message.
#. TRANS: %1$s is the sender name, %2$s is the group name, %3$s is a timestamp.
#, php-format
msgid "Message from %1$s to group %2$s on %3$s"
msgstr "Nachricht von %1$s an Gruppe %2$s am %3$s"

#. TRANS: Succes message after sending private group message to group %s.
#, php-format
msgid "Direct message to group %s sent."
msgstr "Direkte Nachricht an Gruppe %s geschickt."