code:
<?php
/*
 * @todo FIXME: Outdated URLs.
 *
 * This is a PHP library that handles calling reCAPTCHA.
 *    - Documentation and latest version
 *          http://recaptcha.net/plugins/php/
 *    - Get a reCAPTCHA API Key
 *          http://recaptcha.net/api/getkey
 *    - Discussion group
 *          http://groups.google.com/group/recaptcha
 *
 * Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net
 * AUTHORS:
 *   Mike Crawford
 *   Ben Maurer
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/**
 * The reCAPTCHA server URL's
 */
define("RECAPTCHA_API_SERVER", "http://api.recaptcha.net");
define("RECAPTCHA_API_SECURE_SERVER", "https://api-secure.recaptcha.net");
define("RECAPTCHA_VERIFY_SERVER", "api-verify.recaptcha.net");

/**
 * Encodes the given data into a query string format
 * @param $data - array of string elements to be encoded
 * @return string - encoded request
 */
function _recaptcha_qsencode ($data) {
        $req = "";
        foreach ( $data as $key => $value )
                $req .= $key . '=' . urlencode( stripslashes($value) ) . '&';

        // Cut the last '&'
        $req=substr($req,0,strlen($req)-1);
        return $req;
}

/**
 * Submits an HTTP POST to a reCAPTCHA server
 * @param string $host
 * @param string $path
 * @param array $data
 * @param int port
 * @return array response
 */
function _recaptcha_http_post($host, $path, $data, $port = 80) {

        $req = _recaptcha_qsencode ($data);

        $http_request  = "POST $path HTTP/1.0\r\n";
        $http_request .= "Host: $host\r\n";
        $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
        $http_request .= "Content-Length: " . strlen($req) . "\r\n";
        $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
        $http_request .= "\r\n";
        $http_request .= $req;

        $response = '';
        if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
                die ('Could not open socket');
        }

        fwrite($fs, $http_request);

        while ( !feof($fs) )
                $response .= fgets($fs, 1160); // One TCP-IP packet
        fclose($fs);
        $response = explode("\r\n\r\n", $response, 2);

        return $response;
}

/**
 * Gets the challenge HTML (javascript and non-javascript version).
 * This is called from the browser, and the resulting reCAPTCHA HTML widget
 * is embedded within the HTML form it was called from.
 * @param string $pubkey A public key for reCAPTCHA
 * @param string $error The error given by reCAPTCHA (optional, default is null)
 * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)

 * @return string - The HTML to be embedded in the user's form.
 */
function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
{
	if ($pubkey == null || $pubkey == '') {
		die ("To use reCAPTCHA you must get an API key from http://recaptcha.net/api/getkey");
	}

	if ($use_ssl) {
                $server = RECAPTCHA_API_SECURE_SERVER;
        } else {
                $server = RECAPTCHA_API_SERVER;
        }

        $errorpart = "";
        if ($error) {
           $errorpart = "&error=" . $error;
        }
        return '

  		<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
  		<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
	';
}

/**
 * A ReCaptchaResponse is returned from recaptcha_check_answer()
 */
class ReCaptchaResponse {
        var $is_valid;
        var $error;
}

/**
  * Calls an HTTP POST function to verify if the user's guess was correct
  * @param string $privkey
  * @param string $remoteip
  * @param string $challenge
  * @param string $response
  * @param array $extra_params an array of extra variables to post to the server
  * @return ReCaptchaResponse
  */
function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
{
	if ($privkey == null || $privkey == '') {
		die ("To use reCAPTCHA you must get an API key from http://recaptcha.net/api/getkey");
	}

	if ($remoteip == null || $remoteip == '') {
		die ("For security reasons, you must pass the remote ip to reCAPTCHA");
	}

        //discard spam submissions
        if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
                $recaptcha_response = new ReCaptchaResponse();
                $recaptcha_response->is_valid = false;
                $recaptcha_response->error = 'incorrect-captcha-sol';
                return $recaptcha_response;
        }

        $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify",
                                          array (
                                                 'privatekey' => $privkey,
                                                 'remoteip' => $remoteip,
                                                 'challenge' => $challenge,
                                                 'response' => $response
                                                 ) + $extra_params
                                          );

        $answers = explode ("\n", $response [1]);
        $recaptcha_response = new ReCaptchaResponse();

        if (trim ($answers [0]) == 'true') {
                $recaptcha_response->is_valid = true;
        }
        else {
                $recaptcha_response->is_valid = false;
                $recaptcha_response->error = $answers [1];
        }
        return $recaptcha_response;

}

/**
 * gets a URL where the user can sign up for reCAPTCHA. If your application
 * has a configuration page where you enter a key, you should provide a link
 * using this function.
 * @param string $domain The domain where the page is hosted
 * @param string $appname The name of your application
 */
function recaptcha_get_signup_url ($domain = null, $appname = null) {
	return "http://recaptcha.net/api/getkey?" .  _recaptcha_qsencode (array ('domain' => $domain, 'app' => $appname));
}

function _recaptcha_aes_pad($val) {
	$block_size = 16;
	$numpad = $block_size - (strlen ($val) % $block_size);
	return str_pad($val, strlen ($val) + $numpad, chr($numpad));
}

/* Mailhide related code */

function _recaptcha_aes_encrypt($val,$ky) {
	if (! function_exists ("mcrypt_encrypt")) {
		die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
	}
	$mode=MCRYPT_MODE_CBC;
	$enc=MCRYPT_RIJNDAEL_128;
	$val=_recaptcha_aes_pad($val);
	return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
}

function _recaptcha_mailhide_urlbase64 ($x) {
	return strtr(base64_encode ($x), '+/', '-_');
}

/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
function recaptcha_mailhide_url($pubkey, $privkey, $email) {
	if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
		die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
		     "you can do so at http://mailhide.recaptcha.net/apikey");
	}

	$ky = pack('H*', $privkey);
	$cryptmail = _recaptcha_aes_encrypt ($email, $ky);

	return "http://mailhide.recaptcha.net/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail);
}

/**
 * gets the parts of the email to expose to the user.
 * eg, given johndoe@example,com return ["john", "example.com"].
 * the email is then displayed as john...@example.com
 */
function _recaptcha_mailhide_email_parts ($email) {
	$arr = preg_split("/@/", $email );

	if (strlen ($arr[0]) <= 4) {
		$arr[0] = substr ($arr[0], 0, 1);
	} else if (strlen ($arr[0]) <= 6) {
		$arr[0] = substr ($arr[0], 0, 3);
	} else {
		$arr[0] = substr ($arr[0], 0, 4);
	}
	return $arr;
}

/**
 * Gets html to display an email address given a public an private key.
 * to get a key, go to:
 *
 * http://mailhide.recaptcha.net/apikey
 */
function recaptcha_mailhide_html($pubkey, $privkey, $email) {
	$emailparts = _recaptcha_mailhide_email_parts ($email);
	$url = recaptcha_mailhide_url ($pubkey, $privkey, $email);

	return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]);

}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * Throttle registration by IP address
 *
 * 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  Spam
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

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

/**
 * Throttle registration by IP address
 *
 * We a) record IP address of registrants and b) throttle registrations.
 *
 * @category  Spam
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

class RegisterThrottlePlugin extends Plugin
{
    /**
     * Array of time spans in seconds to limits.
     *
     * Default is 3 registrations per hour, 5 per day, 10 per week.
     */
    public $regLimits = array(604800 => 10, // per week
                              86400 => 5, // per day
                              3600 => 3); // per hour

    /**
     * Disallow registration if a silenced user has registered from
     * this IP address.
     */
    public $silenced = true;

    /**
     * Whether we're enabled; prevents recursion.
     */
    static private $enabled = true;

    /**
     * Database schema setup
     *
     * We store user registrations in a table registration_ip.
     *
     * @return boolean hook value; true means continue processing, false means stop.
     */
    public function onCheckSchema()
    {
        $schema = Schema::get();

        // For storing user-submitted flags on profiles
        $schema->ensureTable('registration_ip', Registration_ip::schemaDef());
        return true;
    }

    /**
     * Called when someone tries to register.
     *
     * We check the IP here to determine if it goes over any of our
     * configured limits.
     *
     * @param Action $action Action that is being executed
     *
     * @return boolean hook value
     */
    public function onStartRegistrationTry($action)
    {
        $ipaddress = $this->_getIpAddress();

        if (empty($ipaddress)) {
            // TRANS: Server exception thrown when no IP address can be found for a registation attempt.
            throw new ServerException(_m('Cannot find IP address.'));
        }

        foreach ($this->regLimits as $seconds => $limit) {

            $this->debug("Checking $seconds ($limit)");

            $reg = $this->_getNthReg($ipaddress, $limit);

            if (!empty($reg)) {
                $this->debug("Got a {$limit}th registration.");
                $regtime = strtotime($reg->created);
                $now     = time();
                $this->debug("Comparing {$regtime} to {$now}");
                if ($now - $regtime < $seconds) {
                    // TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
                    throw new Exception(_m('Too many registrations. Take a break and try again later.'));
                }
            }
        }

        // Check for silenced users

        if ($this->silenced) {
            $ids = Registration_ip::usersByIP($ipaddress);
            foreach ($ids as $id) {
                $profile = Profile::getKV('id', $id);
                if ($profile && $profile->isSilenced()) {
                    // TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
                    throw new Exception(_m('A banned user has registered from this address.'));
                }
            }
        }

        return true;
    }

    /**
     * Called after someone registers, by any means.
     *
     * We record the successful registration and IP address.
     *
     * @param Profile $profile new user's profile
     *
     * @return boolean hook value
     */
    public function onEndUserRegister(Profile $profile)
    {
        $ipaddress = $this->_getIpAddress();

        if (empty($ipaddress)) {
            // User registration can happen from command-line scripts etc.
            return true;
        }

        $reg = new Registration_ip();

        $reg->user_id   = $profile->id;
        $reg->ipaddress = $ipaddress;
        $reg->created   = common_sql_now();

        $result = $reg->insert();

        if ($result === false) {
            common_log_db_error($reg, 'INSERT', __FILE__);
            // @todo throw an exception?
        }

        return true;
    }

    /**
     * Check the version of the plugin.
     *
     * @param array &$versions Version array.
     *
     * @return boolean hook value
     */
    public function onPluginVersion(&$versions)
    {
        $versions[] = array('name' => 'RegisterThrottle',
                            'version' => GNUSOCIAL_VERSION,
                            'author' => 'Evan Prodromou',
                            'homepage' => 'http://status.net/wiki/Plugin:RegisterThrottle',
                            'description' =>
                            // TRANS: Plugin description.
                            _m('Throttles excessive registration from a single IP address.'));
        return true;
    }

    /**
     * Gets the current IP address.
     *
     * @return string IP address or null if not found.
     */
    private function _getIpAddress()
    {
        $keys = array('HTTP_X_FORWARDED_FOR',
                      'HTTP_X_CLIENT',
                      'CLIENT-IP',
                      'REMOTE_ADDR');

        foreach ($keys as $k) {
            if (!empty($_SERVER[$k])) {
                return $_SERVER[$k];
            }
        }

        return null;
    }

    /**
     * Gets the Nth registration with the given IP address.
     *
     * @param string  $ipaddress Address to key on
     * @param integer $n         Nth address
     *
     * @return Registration_ip nth registration or null if not found.
     */
    private function _getNthReg($ipaddress, $n)
    {
        $reg = new Registration_ip();

        $reg->ipaddress = $ipaddress;

        $reg->orderBy('created DESC');
        $reg->limit($n - 1, 1);

        if ($reg->find(true)) {
            return $reg;
        } else {
            return null;
        }
    }

    /**
     * When silencing a user, silence all other users registered from that IP
     * address.
     *
     * @param Profile $profile Person getting a new role
     * @param string  $role    Role being assigned like 'moderator' or 'silenced'
     *
     * @return boolean hook value
     */
    public function onEndGrantRole($profile, $role)
    {
        if (!self::$enabled) {
            return true;
        }

        if ($role != Profile_role::SILENCED) {
            return true;
        }

        if (!$this->silenced) {
            return true;
        }

        $ri = Registration_ip::getKV('user_id', $profile->id);

        if (empty($ri)) {
            return true;
        }

        $ids = Registration_ip::usersByIP($ri->ipaddress);

        foreach ($ids as $id) {
            if ($id == $profile->id) {
                continue;
            }

            $other = Profile::getKV('id', $id);

            if (empty($other)) {
                continue;
            }

            if ($other->isSilenced()) {
                continue;
            }

            $old = self::$enabled;
            self::$enabled = false;
            $other->silence();
            self::$enabled = $old;
        }
    }
}

license: mit


code:
<?php
/**
 * Data class for storing IP addresses of new registrants.
 *
 * 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) 2010, 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('GNUSOCIAL')) { exit(1); }

/**
 * Data class for storing IP addresses of new registrants.
 *
 * @category Spam
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 */
class Registration_ip extends Managed_DataObject
{
    public $__table = 'registration_ip';     // table name
    public $user_id;                         // int(4)  primary_key not_null
    public $ipaddress;                       // varchar(45)
    public $created;                         // datetime()   not_null
    public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP

    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user id this registration relates to'),
                'ipaddress' => array('type' => 'varchar', 'length' => 45, 'description' => 'IP address, max 45+null in IPv6'),
                '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('user_id'),
            'foreign keys' => array(
                'registration_ip_user_id_fkey' => array('user', array('user_id' => 'id')),
            ),
            'indexes' => array(
                'registration_ip_ipaddress_idx' => array('ipaddress'),
                'registration_ip_created_idx' => array('created'),
            ),
        );
    }

    /**
     * Get the users who've registered with this ip address.
     *
     * @param Array $ipaddress IP address to check for
     *
     * @return Array IDs of users who registered with this address.
     */
    static function usersByIP($ipaddress)
    {
        $ids = array();

        $ri            = new Registration_ip();
        $ri->ipaddress = $ipaddress;

        if ($ri->find()) {
            while ($ri->fetch()) {
                $ids[] = $ri->user_id;
            }
        }

        return $ids;
    }
}


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"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
#: RegisterThrottlePlugin.php:128
msgid "Cannot find IP address."
msgstr ""

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
#: RegisterThrottlePlugin.php:144
msgid "Too many registrations. Take a break and try again later."
msgstr ""

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
#: RegisterThrottlePlugin.php:157
msgid "A banned user has registered from this address."
msgstr ""

#. TRANS: Plugin description.
#: RegisterThrottlePlugin.php:214
msgid "Throttles excessive registration from a single IP address."
msgstr ""


code:
# Translation of StatusNet - RegisterThrottle 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 - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+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:49:00+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-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "No es pot trobar l'adreça IP."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Massa registreu. Prengueu un respir i torneu-ho a provar més endavant."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr ""

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr ""


code:
# Translation of StatusNet - RegisterThrottle to German (Deutsch)
# Exported from translatewiki.net
#
# Author: LWChris
# Author: The Evil IP address
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+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:49:00+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-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Kann IP-Adresse nicht finden."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr ""
"Zu viele Registrierungen. Mach eine Pause and versuche es später noch einmal."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Ein gesperrter Benutzer hat sich von dieser Adresse registriert."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Drosselt exzessive Registrierungen einer einzelnen IP-Adresse."


code:
# Translation of StatusNet - RegisterThrottle to Spanish (español)
# Exported from translatewiki.net
#
# Author: Armando-Martin
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "No se pudo encontrar la dirección IP"

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Demasiados registros. Haga una pausa e inténtelo más tarde."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Un usuario bloqueado se ha registrado desde esta dirección."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Evita la excesiva creación de cuentas desde una misma dirección IP."


code:
# Translation of StatusNet - RegisterThrottle to French (français)
# Exported from translatewiki.net
#
# Author: Peter17
# Author: Verdy p
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+0000\n"
"Language-Team: French <https://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: fr\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Impossible de trouver l’adresse IP."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr ""
"Inscriptions trop nombreuses. Faites une pause et essayez à nouveau plus "
"tard."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Un utilisateur banni s’est inscrit depuis cette adresse."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Évite les inscriptions excessives depuis une même adresse IP."


code:
# Translation of StatusNet - RegisterThrottle to Galician (galego)
# Exported from translatewiki.net
#
# Author: Toliño
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+0000\n"
"Language-Team: Galician <https://translatewiki.net/wiki/Portal:gl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: gl\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Non se pode atopar o enderezo IP."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Demasiados rexistros. Faga unha pausa e inténteo máis tarde."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Un usuario bloqueado rexistrouse desde este enderezo."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Evita a exceciva creación de contas desde un mesmo enderezo IP."


code:
# Translation of StatusNet - RegisterThrottle to Interlingua (interlingua)
# Exported from translatewiki.net
#
# Author: McDutchie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+0000\n"
"Language-Team: Interlingua <https://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: ia\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Non pote trovar adresse IP."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Troppo de registrationes. Face un pausa e reproba plus tarde."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Un usator bannite se ha registrate ab iste adresse."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Inhibi le creation de contos excessive ab un sol adresse IP."


code:
# Translation of StatusNet - RegisterThrottle to Macedonian (македонски)
# Exported from translatewiki.net
#
# Author: Bjankuloski06
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:49+0000\n"
"Language-Team: Macedonian <https://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: mk\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Не можам да ја пронајдам IP-адресата."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Премногу регистрации. Направете пауза и обидете се подоцна."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Од оваа адреса се регистрирал забранет корисник."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Истиснува прекумерни регистрации од една IP-адреса."


code:
# Translation of StatusNet - RegisterThrottle to Dutch (Nederlands)
# Exported from translatewiki.net
#
# Author: McDutchie
# Author: Siebrand
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Language-Team: Dutch <https://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: nl\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Het IP-adres kon niet gevonden worden."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Te veel registraties. Wacht even en probeer het later opnieuw."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Er is een geblokkeerde gebruiker die vanaf dit adres is geregistreerd."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Beperkt excessieve aantallen registraties vanaf één IP-adres."


code:
# Translation of StatusNet - RegisterThrottle to Russian (Русский)
# Expored from translatewiki.net
#
# Author: MaxSem
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-16 15:08+0000\n"
"PO-Revision-Date: 2010-12-16 15:12:50+0000\n"
"Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2010-11-30 20:43:52+0000\n"
"X-Generator: MediaWiki 1.18alpha (r78478); Translate extension (2010-09-17)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#: RegisterThrottlePlugin.php:134 RegisterThrottlePlugin.php:185
msgid "Cannot find IP address."
msgstr "IP-адрес не найден."

#: RegisterThrottlePlugin.php:149
msgid "Too many registrations. Take a break and try again later."
msgstr ""

#: RegisterThrottlePlugin.php:161
msgid "A banned user has registered from this address."
msgstr ""

#: RegisterThrottlePlugin.php:191
msgid "Cannot find user after successful registration."
msgstr ""

#: RegisterThrottlePlugin.php:224
msgid "Throttles excessive registration from a single IP address."
msgstr ""


code:
# Translation of StatusNet - RegisterThrottle to Tagalog (Tagalog)
# Exported from translatewiki.net
#
# Author: AnakngAraw
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Language-Team: Tagalog <https://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: tl\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Hindi matagpuan ang tirahan ng IP."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Napakaraming mga pagpapatala. Magpahinga muna at subukan uli mamaya."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Isang pinagbawalang tagagamit ang nagpatala mula sa ganitong tirahan."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr ""
"Naglilipat-lipat ng labis na pagpapatala mula sa isang nag-iisang tirahan ng "
"IP."


code:
# Translation of StatusNet - RegisterThrottle to Ukrainian (українська)
# Exported from translatewiki.net
#
# Author: Boogie
# Author: Тест
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RegisterThrottle\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Language-Team: Ukrainian <https://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:00+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: uk\n"
"X-Message-Group: #out-statusnet-plugin-registerthrottle\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Server exception thrown when no IP address can be found for a registation attempt.
msgid "Cannot find IP address."
msgstr "Не вдається знайти IP-адресу."

#. TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
msgid "Too many registrations. Take a break and try again later."
msgstr "Забагато реєстрацій. Випийте поки що кави і повертайтесь пізніше."

#. TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
msgid "A banned user has registered from this address."
msgstr "Заблокований користувач був зареєстрований з цієї адреси."

#. TRANS: Plugin description.
msgid "Throttles excessive registration from a single IP address."
msgstr "Цей додаток обмежує кількість реєстрацій з певної IP-адреси."


code:
This plugin disables posting for accounts that do not have a
validated email address.

Example:

  addPlugin('RequireValidatedEmail');

If you don't want to apply the validationr equirement to existing
accounts, you can specify a cutoff date to grandfather in users
registered prior to that timestamp.

  addPlugin('RequireValidatedEmail',
            array('grandfatherCutoff' => 'Dec 7, 2009');

You can also exclude the validation checks from OpenID accounts
connected to a trusted provider, by providing a list of regular
expressions to match their provider URLs.

For example, to trust WikiHow and Wikipedia users:

  addPlugin('RequireValidatedEmailPlugin', array(
     'trustedOpenIDs' => array(
         '!^http://\w+\.wikihow\.com/!',
         '!^http://\w+\.wikipedia\.org/!',
     ),
  ));

Todo:
* add a more visible indicator that validation is still outstanding
* test with XMPP, API posting

path: plugins/RequireValidatedEmail/README


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Plugin that requires the user to have a validated email address before they
 * can post notices
 *
 * PHP version 5
 *
 * LICENCE: 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  Plugin
 * @package   StatusNet
 * @author    Craig Andrews <candrews@integralblue.com>
 * @author    Brion Vibber <brion@status.net>
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet Inc. http://status.net/
 * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

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

/**
 * Plugin for requiring a validated email before posting.
 *
 * Enable this plugin using addPlugin('RequireValidatedEmail');
 *
 * @category  Plugin
 * @package   StatusNet
 * @author    Craig Andrews <candrews@integralblue.com>
 * @author    Brion Vibber <brion@status.net>
 * @author    Evan Prodromou <evan@status.net>
 * @author    Mikael Nordfeldth <mmn@hethane.se>
 * @copyright 2009-2013 Free Software Foundation, Inc http://www.fsf.org
 * @copyright 2009-2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */
class RequireValidatedEmailPlugin extends Plugin
{
    /**
     * Users created before this time will be grandfathered in
     * without the validation requirement.
     */
    public $grandfatherCutoff = null;

    /**
     * If OpenID plugin is installed, users with a verified OpenID
     * association whose provider URL matches one of these regexes
     * will be considered to be sufficiently valid for our needs.
     *
     * For example, to trust WikiHow and Wikipedia OpenID users:
     *
     * addPlugin('RequireValidatedEmailPlugin', array(
     *    'trustedOpenIDs' => array(
     *        '!^http://\w+\.wikihow\.com/!',
     *        '!^http://\w+\.wikipedia\.org/!',
     *    ),
     * ));
     */
    public $trustedOpenIDs = array();

    /**
     * Whether or not to disallow login for unvalidated users.
     */
    public $disallowLogin = false;

    function onRouterInitialized($m)
    {
        $m->connect('main/confirmfirst/:code',
                    array('action' => 'confirmfirstemail'));
        return true;
    }

    /**
     * Event handler for notice saves; rejects the notice
     * if user's address isn't validated.
     *
     * @param Notice $notice The notice being saved
     *
     * @return bool hook result code
     */
    function onStartNoticeSave($notice)
    {
        $user = User::getKV('id', $notice->profile_id);
        if (!empty($user)) { // it's a remote notice
            if (!$this->validated($user)) {
                // TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
                $msg = _m('You must validate your email address before posting.');
                throw new ClientException($msg);
            }
        }
        return true;
    }

    /**
     * Event handler for registration attempts; rejects the registration
     * if email field is missing.
     *
     * @param Action $action Action being executed
     *
     * @return bool hook result code
     */
    function onStartRegisterUser(&$user, &$profile)
    {
        $email = $user->email;

        if (empty($email)) {
            // TRANS: Client exception thrown when trying to register without providing an e-mail address.
            throw new ClientException(_m('You must provide an email address to register.'));
        }

        return true;
    }

    /**
     * Check if a user has a validated email address or has been
     * otherwise grandfathered in.
     *
     * @param User $user User to valide
     *
     * @return bool
     */
    protected function validated($user)
    {
        // The email field is only stored after validation...
        // Until then you'll find them in confirm_address.
        $knownGood = !empty($user->email) ||
          $this->grandfathered($user) ||
          $this->hasTrustedOpenID($user);

        // Give other plugins a chance to override, if they can validate
        // that somebody's ok despite a non-validated email.

        // @todo FIXME: This isn't how to do it! Use Start*/End* instead
        Event::handle('RequireValidatedEmailPlugin_Override',
                      array($user, &$knownGood));

        return $knownGood;
    }

    /**
     * Check if a user was created before the grandfathering cutoff.
     * If so, we won't need to check for validation.
     *
     * @param User $user User to check
     *
     * @return bool true if user is grandfathered
     */
    protected function grandfathered($user)
    {
        if ($this->grandfatherCutoff) {
            $created = strtotime($user->created . " GMT");
            $cutoff  = strtotime($this->grandfatherCutoff);
            if ($created < $cutoff) {
                return true;
            }
        }
        return false;
    }

    /**
     * Override for RequireValidatedEmail plugin. If we have a user who's
     * not validated an e-mail, but did come from a trusted provider,
     * we'll consider them ok.
     *
     * @param User $user User to check
     *
     * @return bool true if user has a trusted OpenID.
     */
    function hasTrustedOpenID($user)
    {
        if ($this->trustedOpenIDs && class_exists('User_openid')) {
            foreach ($this->trustedOpenIDs as $regex) {
                $oid = new User_openid();

                $oid->user_id = $user->id;

                $oid->find();
                while ($oid->fetch()) {
                    if (preg_match($regex, $oid->canonical)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    /**
     * Add version information for this plugin.
     *
     * @param array &$versions Array of associative arrays of version data
     *
     * @return boolean hook value
     */
    function onPluginVersion(&$versions)
    {
        $versions[] =
          array('name' => 'Require Validated Email',
                'version' => GNUSOCIAL_VERSION,
                'author' => 'Craig Andrews, '.
                'Evan Prodromou, '.
                'Brion Vibber',
                'homepage' =>
                'http://status.net/wiki/Plugin:RequireValidatedEmail',
                'rawdescription' =>
                // TRANS: Plugin description.
                _m('Disables posting without a validated email address.'));

        return true;
    }

    /**
     * Show an error message about validating user email before posting
     *
     * @param string $tag    Current tab tag value
     * @param Action $action action being shown
     * @param Form   $form   object producing the form
     *
     * @return boolean hook value
     */
    function onStartMakeEntryForm($tag, $action, &$form)
    {
        $user = common_current_user();
        if (!empty($user)) {
            if (!$this->validated($user)) {
                $action->element('div', array('class'=>'error'), _m('You must validate an email address before posting!'));
            }
        }
        return true;
    }

    /**
     * Prevent unvalidated folks from creating spam groups.
     *
     * @param Profile $profile User profile we're checking
     * @param string $right rights key
     * @param boolean $result if overriding, set to true/false has right
     * @return boolean hook result value
     */
    function onUserRightsCheck(Profile $profile, $right, &$result)
    {
        if ($right == Right::CREATEGROUP ||
            ($this->disallowLogin && ($right == Right::WEBLOGIN || $right == Right::API))) {
            $user = User::getKV('id', $profile->id);
            if ($user && !$this->validated($user)) {
                $result = false;
                return false;
            }
        }
        return true;
    }

    function onLoginAction($action, &$login)
    {
        if ($action == 'confirmfirstemail') {
            $login = true;
            return false;
        }
        return true;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Action for confirming first email registration
 *
 * 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  Confirmation
 * @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);
}

/**
 * Class comment
 *
 * @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 ConfirmfirstemailAction extends Action
{
    public $confirm;
    public $code;
    public $password;
    public $user;

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

        if (!empty($user)) {
            // TRANS: Client exception thrown when trying to register while already logged in.
            throw new ClientException(_m('You are already logged in.'));
        }

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

        $this->confirm = Confirm_address::getKV('code', $this->code);

        if (empty($this->confirm)) {
            // TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
            throw new ClientException(_m('Confirmation code not found.'));
            return;
        }

        $this->user = User::getKV('id', $this->confirm->user_id);

        if (empty($this->user)) {
            // TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
            throw new ServerException(_m('No user for that confirmation code.'));
        }

        $type = $this->confirm->address_type;

        if ($type != 'email') {
            // TRANS: Client exception thrown when trying to register with a invalid e-mail address.
            // TRANS: %s is the invalid e-mail address.
            throw new ServerException(sprintf(_m('Unrecognized address type %s.'), $type));
        }

        if (!empty($this->user->email) && $this->user->email == $confirm->address) {
            // TRANS: Client error for an already confirmed email/jabber/sms address.
            throw new ClientException(_m('That address has already been confirmed.'));
        }

        if ($this->isPost()) {

            $this->checkSessionToken();

            $password = $this->trimmed('password');
            $confirm  = $this->trimmed('confirm');

            if (strlen($password) < 6) {
                // TRANS: Client exception thrown when trying to register with too short a password.
                throw new ClientException(_m('Password too short.'));
                return;
            } else if (0 != strcmp($password, $confirm)) {
                // TRANS: Client exception thrown when trying to register without providing the same password twice.
                throw new ClientException(_m('Passwords do not match.'));
                return;
            }

            $this->password = $password;
        }

        return true;
    }

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

        if ($this->isPost()) {
            $this->confirmUser();
            common_set_user($this->user);
            common_real_login(true);
            common_redirect($homepage, 303);
        } else {
            $this->showPage();
        }
        return;
    }

    function confirmUser()
    {
        $orig = clone($this->user);

        $this->user->email = $this->confirm->address;

        // Throws exception on failure.
        $this->user->updateWithKeys($orig);

        $this->user->emailChanged();

        $orig = clone($this->user);

        $this->user->password = common_munge_password($this->password, $this->user->id);

        $this->user->update($orig);

        $this->confirm->delete();
    }

    function showContent()
    {
        $this->element('p', 'instructions',
                       // TRANS: Form instructions. %s is the nickname of the to be registered user.
                       sprintf(_m('You have confirmed the email address for your new user account %s. '.
                                 'Use the form below to set your new password.'),
                               $this->user->nickname));

        $form = new ConfirmFirstEmailForm($this, $this->code);
        $form->show();
    }

    function title()
    {
        // TRANS: Page title.
        return _m('Set a password');
    }
}

class ConfirmFirstEmailForm extends Form
{
    public $code;

    function __construct($out, $code)
    {
        parent::__construct($out);
        $this->code = $code;
    }

    function formLegend()
    {
        // TRANS: Form legend.
        return _m('Confirm email address');
    }

    function action()
    {
        return common_local_url('confirmfirstemail',
                                array('code' => $this->code));
    }

    function formClass()
    {
        return 'form_settings';
    }

    function formData()
    {
        $this->out->elementStart('ul', 'form_data');
        $this->out->elementStart('li');
        // TRANS: Field label.
        $this->out->password('password', _m('New password'),
                             // TRANS: Field title for password field.
                             _m('6 or more characters.'));
        $this->out->elementEnd('li');
        $this->out->elementStart('li');
        // TRANS: Field label for repeat password field.
        $this->out->password('confirm', _m('LABEL','Confirm'),
                             // TRANS: Field title for repeat password field.
                             _m('Same as password above.'));
        $this->out->elementEnd('li');
        $this->out->elementEnd('ul');
    }

    function formActions()
    {
        // TRANS: Button text for completing registration by e-mail.
        $this->out->submit('save', _m('BUTTON','Save'));
    }
}


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"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
#: RequireValidatedEmailPlugin.php:117
msgid "You must validate your email address before posting."
msgstr ""

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
#: RequireValidatedEmailPlugin.php:138
msgid "You must provide an email address to register."
msgstr ""

#. TRANS: Plugin description.
#: RequireValidatedEmailPlugin.php:237
msgid "Disables posting without a validated email address."
msgstr ""

#. TRANS: Client exception thrown when trying to register while already logged in.
#: confirmfirstemail.php:68
msgid "You are already logged in."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
#: confirmfirstemail.php:77
msgid "Confirmation code not found."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
#: confirmfirstemail.php:85
msgid "No user for that confirmation code."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#: confirmfirstemail.php:93
#, php-format
msgid "Unrecognized address type %s."
msgstr ""

#. TRANS: Client error for an already confirmed email/jabber/sms address.
#: confirmfirstemail.php:98
msgid "That address has already been confirmed."
msgstr ""

#. TRANS: Client exception thrown when trying to register with too short a password.
#: confirmfirstemail.php:110
msgid "Password too short."
msgstr ""

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
#: confirmfirstemail.php:114
msgid "Passwords do not match."
msgstr ""

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#: confirmfirstemail.php:170
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""

#. TRANS: Page title.
#: confirmfirstemail.php:181
msgid "Set a password"
msgstr ""

#. TRANS: Form legend.
#: confirmfirstemail.php:198
msgid "Confirm email address"
msgstr ""

#. TRANS: Field label.
#: confirmfirstemail.php:217
msgid "New password"
msgstr ""

#. TRANS: Field title for password field.
#: confirmfirstemail.php:219
msgid "6 or more characters."
msgstr ""

#. TRANS: Field label for repeat password field.
#: confirmfirstemail.php:223
msgctxt "LABEL"
msgid "Confirm"
msgstr ""

#. TRANS: Field title for repeat password field.
#: confirmfirstemail.php:225
msgid "Same as password above."
msgstr ""

#. TRANS: Button text for completing registration by e-mail.
#: confirmfirstemail.php:233
msgctxt "BUTTON"
msgid "Save"
msgstr ""


code:
# Translation of StatusNet - RequireValidatedEmail to Arabic (العربية)
# Exported from translatewiki.net
#
# Author: OsamaK
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+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-06-18 16:19:28+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-requirevalidatedemail\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 post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr ""

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr ""

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr ""

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr ""

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "كلمة السر قصيرة جدا."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "كلمتا السر غير متطابقتين."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""

#. TRANS: Page title.
msgid "Set a password"
msgstr "تعيين كلمة السر"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "تأكيد عنوان البريد الإلكتروني"

#. TRANS: Field label.
msgid "New password"
msgstr "كلمة السر الجديدة"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 أحرف أو أكثر."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "أكّد"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "نفس كلمة السر أعلاه."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "احفظ"


code:
# Translation of StatusNet - RequireValidatedEmail to Breton (brezhoneg)
# Exported from translatewiki.net
#
# Author: Y-M D
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Language-Team: Breton <https://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+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: br\n"
"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr ""

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr ""

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr ""

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr ""

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr ""

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "Ger-tremen re verr."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr ""

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""

#. TRANS: Page title.
msgid "Set a password"
msgstr "Termeniñ ur ger-tremen"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Kadarnaat ar chomlec'h postel"

#. TRANS: Field label.
msgid "New password"
msgstr "Ger-tremen nevez"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 arouezenn pe muioc'h."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Kadarnaat"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Memestra eget ar ger-tremen a-us."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Enrollañ"


code:
# Translation of StatusNet - RequireValidatedEmail 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 - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+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-06-18 16:19:28+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-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr ""

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr ""

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Ja heu iniciat una sessió."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "No s'ha trobat el codi de confirmació."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "No hi ha cap usuari per a aquest codi de confirmació."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "Tipus d'adreça no reconeguda %s."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Ja s'ha confirmat l'adreça."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "La contrasenya és massa curta."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Les contrasenyes no coincideixen."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Heu confirmat l'adreça electrònica del vostre nou compte d'usuari %s. "
"Utilitzeu el formulari a sota per definir una contrasenya nova."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Definiu una contrasenya"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Confirmeu l'adreça electrònica"

#. TRANS: Field label.
msgid "New password"
msgstr "Contrasenya nova"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 o més caràcters."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Confirma"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "La mateixa que la contrasenya de dalt."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Desa"


code:
# Translation of StatusNet - RequireValidatedEmail to German (Deutsch)
# Exported from translatewiki.net
#
# Author: ChrisiPK
# Author: Giftpflanze
# Author: The Evil IP address
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+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-06-18 16:19:28+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-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr "Du musst deine E-Mail-Adresse validieren, bevor du beitragen kannst."

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr "Du musst eine E-Mail-Adresse angeben, um dich zu registrieren."

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr "Deaktiviert Posten ohne gültige E-Mail-Adresse."

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Du bist bereits angemeldet."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "Bestätigungscode nicht gefunden."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Kein Benutzer für diesen Bestätigungscode."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "Unbekannter Adresstyp %s."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Diese Adresse wurde bereits bestätigt."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "Passwort ist zu kurz."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Passwörter stimmen nicht überein."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Du hast die E-Mail-Adresse für dein neues Benutzerkonto %s bestätigt. Nutze "
"das untenstehende Formular, um dein neues Passwort zu setzen."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Passwort setzen"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "E-Mail-Adresse bestätigen"

#. TRANS: Field label.
msgid "New password"
msgstr "Neues Passwort"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "Mindestens 6 Zeichen."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Bestätigen"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Dasselbe Passwort wie oben."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Speichern"


code:
# Translation of StatusNet - RequireValidatedEmail to Spanish (español)
# Exported from translatewiki.net
#
# Author: Armando-Martin
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr "Debe validar su dirección de correo electrónico antes de publicar."

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr ""
"Debe proporcionar una dirección de correo electrónico para registrarse."

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""
"Desactiva la publicación de mensajes sin una dirección de correo electrónico "
"válida."

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Ya has iniciado sesión."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "No se ha encontrado el código de confirmación."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Ningún usuario tiene ese código de confirmación."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "No se reconoce el tipo de dirección %s."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Esta dirección ya ha sido confirmada."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "La contraseña es demasiado corta"

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Las contraseñas no coinciden."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Ha confirmado la dirección de correo electrónico para su nueva cuenta de "
"usuario %s . Utilice el siguiente formulario para establecer su nueva "
"contraseña."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Establecer una contraseña"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Confirme la dirección de correo electrónico"

#. TRANS: Field label.
msgid "New password"
msgstr "Nueva contraseña"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 o más caracteres."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Confirmar"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Igual a la contraseña anterior"

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Guardar"


code:
# Translation of StatusNet - RequireValidatedEmail to Basque (euskara)
# Exported from translatewiki.net
#
# Author: Artsuaga
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr ""

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr ""

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Dagoeneko saioa hasi duzu."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "Ez da baieztapen koderik aurkitu."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Baieztapen-kode horrentzat ez dago erabiltzailerik."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "%s helbide-mota ez da ezaguna."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Helbide hori dagoeneko baieztatu da."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "Pasahitz laburregia."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Pasahitzak ez datoz bat."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""

#. TRANS: Page title.
msgid "Set a password"
msgstr "Pasahitza bat zehaztu."

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Helbide elektronikoa baieztatu."

#. TRANS: Field label.
msgid "New password"
msgstr "Pasahitz berria"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 karaktere edo gehiago."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Baieztatu"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Gohiko pasahitz berbera."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Gorde"


code:
# Translation of StatusNet - RequireValidatedEmail to French (français)
# Exported from translatewiki.net
#
# Author: Brunoperel
# Author: Crochet.david
# Author: Od1n
# Author: Peter17
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:50+0000\n"
"Language-Team: French <https://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+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: fr\n"
"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr "Vous devez valider votre adresse électronique avant de poster."

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr "Vous devez fournir une adresse électronique avant de vous enregistrer."

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""
"Désactive le postage pour ceux qui n’ont pas d’adresse électronique valide."

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Votre session est déjà ouverte."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "Code de confirmation non trouvé."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Aucun utilisateur pour ce code de confirmation."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "Type d’adresse non reconnu : %s"

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Cette adresse a déjà été confirmée."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "Mot de passe trop court."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Les mots de passe ne correspondent pas."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Vous avez confirmé l'adresse e-mail de votre nouveau compte d'utilisateur %"
"s . Utilisez le formulaire ci-dessous pour définir votre nouveau mot de "
"passe."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Définir un nouveau mot de passe"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Confirmer l’adresse de courriel"

#. TRANS: Field label.
msgid "New password"
msgstr "Nouveau mot de passe"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 caractères ou plus."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Confirmer"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Identique au mot de passe ci-dessus."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Sauvegarder"


code:
# Translation of StatusNet - RequireValidatedEmail to Galician (galego)
# Exported from translatewiki.net
#
# Author: Toliño
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:51+0000\n"
"Language-Team: Galician <https://translatewiki.net/wiki/Portal:gl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+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: gl\n"
"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr "Debe validar o enderezo de correo electrónico antes de publicar."

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr "Debe proporcionar un enderezo de correo electrónico para se rexistrar."

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr ""
"Desactiva a publicación de mensaxes sen un enderezo de correo electrónico "
"validado."

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Xa está identificado."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "Non se atopou o código de confirmación."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Non hai usuario ningún para ese código de confirmación."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "Non se recoñeceu o tipo de enderezo %s."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Ese enderezo xa se confirmou."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "O contrasinal é curto de máis."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Os contrasinais non coinciden."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Confirmou o enderezo de correo electrónico da nova conta de usuario %s. "
"Empregue o formulario inferior para definir o seu novo contrasinal."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Definir un contrasinal"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Confirmar o enderezo de correo electrónico"

#. TRANS: Field label.
msgid "New password"
msgstr "Novo contrasinal"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "Seis ou máis caracteres."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Confirmar"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Igual ao contrasinal anterior."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Gardar"


code:
# Translation of StatusNet - RequireValidatedEmail to Interlingua (interlingua)
# Exported from translatewiki.net
#
# Author: McDutchie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:51+0000\n"
"Language-Team: Interlingua <https://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+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: ia\n"
"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr "Tu debe validar tu adresse de e-mail ante de publicar."

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr "Tu debe fornir un adresse de e-mail pro poter crear un conto."

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr "Disactiva le publication de messages sin adresse de e-mail validate."

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Tu es jam authenticate."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "Codice de confirmation non trovate."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Il non ha un usator pro iste codice de confirmation."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "Typo de adresse %s non recognoscite."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Iste adresse ha ja essite confirmate."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "Contrasigno troppo curte."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Le contrasignos non corresponde."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Tu ha confirmate le adresse de e-mail pro tu nove conto de usator %s. Usa le "
"formulario sequente pro definir tu nove contrasigno."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Definir un contrasigno"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Confirmar adresse de e-mail"

#. TRANS: Field label.
msgid "New password"
msgstr "Nove contrasigno"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "6 o plus characteres."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Confirmar"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Identic al contrasigno hic supra."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Salveguardar"


code:
# Translation of StatusNet - RequireValidatedEmail to Macedonian (македонски)
# Exported from translatewiki.net
#
# Author: Bjankuloski06
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - RequireValidatedEmail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:51+0000\n"
"Language-Team: Macedonian <https://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-18 16:19:28+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: mk\n"
"X-Message-Group: #out-statusnet-plugin-requirevalidatedemail\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"

#. TRANS: Client exception thrown when trying to post notices before validating an e-mail address.
msgid "You must validate your email address before posting."
msgstr ""
"Пред да почнете да објавувате ќе мора да ја потврдите Вашата е-поштенска "
"адреса."

#. TRANS: Client exception thrown when trying to register without providing an e-mail address.
msgid "You must provide an email address to register."
msgstr "За да се регистрирате, ќе мора да наведете е-поштенска адреса."

#. TRANS: Plugin description.
msgid "Disables posting without a validated email address."
msgstr "Оневозможува објавување без потврдена е-пошта."

#. TRANS: Client exception thrown when trying to register while already logged in.
msgid "You are already logged in."
msgstr "Веќе сте најавени."

#. TRANS: Client exception thrown when trying to register with a non-existing confirmation code.
msgid "Confirmation code not found."
msgstr "Потврдниот код не е пронајден."

#. TRANS: Client exception thrown when trying to register with a confirmation code that is not connected with a user.
msgid "No user for that confirmation code."
msgstr "Нема корисник за тој потврден код."

#. TRANS: Client exception thrown when trying to register with a invalid e-mail address.
#. TRANS: %s is the invalid e-mail address.
#, php-format
msgid "Unrecognized address type %s."
msgstr "Непознат тип на адреса %s."

#. TRANS: Client error for an already confirmed email/jabber/sms address.
msgid "That address has already been confirmed."
msgstr "Таа адреса е веќе потврдена."

#. TRANS: Client exception thrown when trying to register with too short a password.
msgid "Password too short."
msgstr "Лозинката е прекратка."

#. TRANS: Client exception thrown when trying to register without providing the same password twice.
msgid "Passwords do not match."
msgstr "Лозинките не се совпаѓаат."

#. TRANS: Form instructions. %s is the nickname of the to be registered user.
#, php-format
msgid ""
"You have confirmed the email address for your new user account %s. Use the "
"form below to set your new password."
msgstr ""
"Ја потврдивте е-поштата за Вашата нова корисничка сметка %s. Задајте нова "
"лозинка во образецот подолу."

#. TRANS: Page title.
msgid "Set a password"
msgstr "Задајте лозинка"

#. TRANS: Form legend.
msgid "Confirm email address"
msgstr "Потврдете е-пошта"

#. TRANS: Field label.
msgid "New password"
msgstr "Нова лозинка"

#. TRANS: Field title for password field.
msgid "6 or more characters."
msgstr "барем 6 знаци."

#. TRANS: Field label for repeat password field.
msgctxt "LABEL"
msgid "Confirm"
msgstr "Потврди"

#. TRANS: Field title for repeat password field.
msgid "Same as password above."
msgstr "Исто како лозинката погоре."

#. TRANS: Button text for completing registration by e-mail.
msgctxt "BUTTON"
msgid "Save"
msgstr "Зачувај"